@fishka/seqio 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,23 +1,5 @@
1
1
  export { AbifBaseCallRole, AbifBaseCallVariant, AbifBaseCalls, AbifByteRange, AbifChromatogramBundle, AbifDataChannelRole, AbifDecodedValue, AbifDirEntry, AbifDirectory, AbifEntry, AbifEntryRaw, AbifFile, AbifMetadata, ChannelSignals, Chromatogram, CropAbifOptions, CropAbifRange, ENTRY_SIZE, HEADER_SIZE, ParsedAbif, averagePeakSpacing, channelMaxLength, cropAbif, dataChannelRole, ensureRawDataChannels, findEntries, findEntry, getChannelMap, getConfidences, getConfidencesForVersion, getDataChannel, getFwo, getPositions, getPositionsForVersion, getReverseComplemented, getSamplingRate, getSequence, getSequenceForVersion, hasData9To12Block, hasSignals, insertEntrySorted, isFwoPermutation, parseAbif, readAbif, setAveragePeakSpacing, setConfidences, setPositions, setSequence, tagNameFromInt32, upsertEntry, writeAbif } from './abif/index.mjs';
2
2
 
3
- /**
4
- * Content-based file-format detection.
5
- *
6
- * Sniffs the bytes, never the file extension: binary magic first (ABIF at offset 0, or at
7
- * 128 behind a MacBinary preamble; SCF's ".scf" magic), then the first non-blank line for
8
- * the text formats. Text signatures are matched on the leading line's content (a keyword
9
- * like `LOCUS`, or the first character `>` / `;` / `@`), so a mislabeled or extension-less
10
- * file still resolves.
11
- */
12
- /** A format {@link detectFormat} can recognize. Some are detected before their reader ships. */
13
- type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'pir' | 'gff' | 'sam' | 'bam' | 'gfa' | 'unknown';
14
- /**
15
- * Detect the sequencing file format from its content. Returns 'unknown' when no signature
16
- * matches (empty input, or a leading line that is neither a known magic nor a recognized
17
- * text marker).
18
- */
19
- declare function detectFormat(bytes: Uint8Array): SeqFileFormat;
20
-
21
3
  /**
22
4
  * The common "a sequence with a name" record produced by every reader that extracts
23
5
  * sequences for downstream picking/export (GenBank, EMBL, Swiss-Prot, the alignment
@@ -38,6 +20,47 @@ interface SeqRecord {
38
20
  /** Build a {@link SeqRecord}, dropping an empty description so records compare cleanly. */
39
21
  declare function makeSeqRecord(id: string, description: string, sequence: string): SeqRecord;
40
22
 
23
+ /**
24
+ * ACE (`.ace`) reader — assembly sequence extraction (Phrap/consed).
25
+ *
26
+ * An ACE file describes one or more contigs. Each contig is a `CO <name> <nBases> <nReads> …` line
27
+ * followed by the consensus sequence (wrapped over several lines), then per-read records
28
+ * `RD <readName> <nPaddedBases> …` each followed by that read's padded sequence. Other records
29
+ * (`AS`, `BQ`, `QA`, `AF`, `BS`, `DS`, `WA`, `CT`, `RT`, …) carry qualities/metadata and are skipped.
30
+ *
31
+ * This reader returns every sequence it finds, in file order:
32
+ * - each contig consensus → id `Contig<name>`, description `consensus`
33
+ * - each read → id `<readName>`, description `read`
34
+ * The pad character `*` (an alignment gap in ACE) is kept verbatim — de-gapping is the caller's
35
+ * choice.
36
+ *
37
+ * A `CO`/`RD` header declares the block's exact base count, so the sequence is accumulated until that
38
+ * many residues are read (or a blank line ends it). This length-driven boundary — rather than
39
+ * "stop at the next two-letter tag" — avoids swallowing a following record and avoids truncating at a
40
+ * short residue line that merely looks like a tag (e.g. a line that is literally `BQ`/`CT`, both
41
+ * valid residues). Deliberately lenient (see AGENTS.md): never throws; a truncated final block is kept.
42
+ */
43
+
44
+ declare function parseAce(input: string | Uint8Array): SeqRecord[];
45
+
46
+ /**
47
+ * Content-based file-format detection.
48
+ *
49
+ * Sniffs the bytes, never the file extension: binary magic first (ABIF at offset 0, or at
50
+ * 128 behind a MacBinary preamble; SCF's ".scf" magic), then the first non-blank line for
51
+ * the text formats. Text signatures are matched on the leading line's content (a keyword
52
+ * like `LOCUS`, or the first character `>` / `;` / `@`), so a mislabeled or extension-less
53
+ * file still resolves.
54
+ */
55
+ /** A format {@link detectFormat} can recognize. Some are detected before their reader ships. */
56
+ type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'mega' | 'pir' | 'gff' | 'sam' | 'bam' | 'gfa' | 'pdb' | 'ace' | 'unknown';
57
+ /**
58
+ * Detect the sequencing file format from its content. Returns 'unknown' when no signature
59
+ * matches (empty input, or a leading line that is neither a known magic nor a recognized
60
+ * text marker).
61
+ */
62
+ declare function detectFormat(bytes: Uint8Array): SeqFileFormat;
63
+
41
64
  /**
42
65
  * EMBL / Swiss-Prot (UniProtKB) flat-file reader — sequence extraction only.
43
66
  *
@@ -213,7 +236,7 @@ declare function parseGff(input: string | Uint8Array): SeqRecord[];
213
236
  * Multiple-sequence-alignment readers — one aligned row = one record.
214
237
  *
215
238
  * Covers the common alignment formats: Clustal (`.aln`), Stockholm (`.sto`/`.stk`),
216
- * PHYLIP (`.phy`), NEXUS (`.nex`) and GCG/MSF (`.msf`). Each returns the alignment's rows
239
+ * PHYLIP (`.phy`), NEXUS (`.nex`), GCG/MSF (`.msf`) and MEGA (`.meg`). Each returns the alignment's rows
217
240
  * as {@link SeqRecord}s: `id` = the taxon/sequence name, `sequence` = that row **with its
218
241
  * gap characters preserved** (an aligned row is data; de-gapping is a caller's choice).
219
242
  * Only line spacing and wrap are removed. No description field — these formats don't carry
@@ -250,6 +273,37 @@ declare function parsePhylip(input: string | Uint8Array): SeqRecord[];
250
273
  declare function parseNexus(input: string | Uint8Array): SeqRecord[];
251
274
  /** Read a GCG/MSF (`.msf`) alignment (the sequence blocks after the header's `//`). */
252
275
  declare function parseMsf(input: string | Uint8Array): SeqRecord[];
276
+ /**
277
+ * Read a MEGA (`.meg`) alignment / sequence set.
278
+ *
279
+ * MEGA files open with `#mega` (or `#MEGA`), carry `!Command …;` directives (Title/Format/…), then
280
+ * the sequences as `#Name residues` rows — interleaved (each name repeats per block) or with the
281
+ * residues wrapped onto following lines. Rows are accumulated by name. Gap `-` and the identity
282
+ * match-char `.` are kept verbatim (de-gapping is the caller's choice; note `.` means "same as the
283
+ * first sequence" in MEGA, like NEXUS). Deliberately lenient: never throws.
284
+ */
285
+ declare function parseMega(input: string | Uint8Array): SeqRecord[];
286
+
287
+ /**
288
+ * PDB (`.pdb`) reader — sequence extraction from `SEQRES` records.
289
+ *
290
+ * A PDB file lists each macromolecular chain's primary sequence in `SEQRES` records:
291
+ * `SEQRES <serNum> <chainID> <numRes> <res1> <res2> … <res13>`
292
+ * with the residues as three-letter codes (13 per line, continued across records). This reader
293
+ * collects the SEQRES residues per chain, in file order, and maps the three-letter codes to the
294
+ * one-letter sequence: the 20 standard amino acids (+ SEC→U, PYL→O, the ambiguity codes B/Z/X),
295
+ * and nucleotides (DA/DC/DG/DT/DU and A/C/G/U/T/I/N). Anything unrecognized becomes `X`.
296
+ * - id: the chain identifier (e.g. `A`).
297
+ * - sequence: the chain's residues, one letter each (no gaps — SEQRES is the primary sequence).
298
+ *
299
+ * SEQRES is the declared sequence and is preferred. For a chain with no SEQRES record (common in
300
+ * coordinate-only files — predicted models, fragments), the sequence is reconstructed from the
301
+ * first model's `ATOM` records instead (one residue per chain + residue number), plus any `HETATM`
302
+ * whose residue is a recognized polymer/modified code (e.g. MSE selenomethionine) — solvent, ions
303
+ * and ligands are left out. Deliberately lenient (see AGENTS.md): never throws.
304
+ */
305
+
306
+ declare function parsePdb(input: string | Uint8Array): SeqRecord[];
253
307
 
254
308
  /**
255
309
  * PIR / NBRF (`.pir`) reader — sequence extraction.
@@ -309,4 +363,34 @@ declare function parseBam(bytes: Uint8Array): SeqRecord[];
309
363
 
310
364
  declare function parseSam(input: string | Uint8Array): SeqRecord[];
311
365
 
312
- export { type FastaRecord, type FastqRecord, MAX_PHRED, type QualRecord, type SeqFileFormat, type SeqRecord, type WrapOptions, detectFormat, formatFasta, formatFastq, formatQual, hasUsableQuality, makeSeqRecord, parseBam, parseClustal, parseEmbl, parseFasta, parseFastq, parseGenbank, parseGfa, parseGff, parseMsf, parseNexus, parsePhylip, parsePir, parseSam, parseStockholm, parseSwissprot };
366
+ /**
367
+ * SCF (`.scf`) reader — the called base sequence from a Staden chromatogram trace.
368
+ *
369
+ * SCF (Standard Chromatogram Format) is a binary trace file. Only the **called bases** are
370
+ * extracted here (the trace samples/qualities are ignored — this library reads sequences):
371
+ *
372
+ * Header (128 bytes, big-endian). The fields this reader uses:
373
+ * off field
374
+ * 0 magic ".scf"
375
+ * 12 bases (uint32 — number of called bases)
376
+ * 24 bases_offset (uint32 — start of the bases section)
377
+ * 36 version[4] (ASCII, e.g. "2.00" / "3.00")
378
+ * 28 comments_size (uint32)
379
+ * 32 comments_offset(uint32)
380
+ *
381
+ * Bases section — two layouts by version:
382
+ * • v3.x (column/SoA): peak indices (bases×uint32), then prob_A/C/G/T (bases bytes each),
383
+ * then the **base characters** (bases bytes), then spare (bases×3). So the characters begin
384
+ * at `bases_offset + bases*8`.
385
+ * • v2.x (interleaved/AoS): `bases` records of 12 bytes each — peak_index(uint32),
386
+ * prob_A/C/G/T(4), **base char(1)**, spare(3). The character of record i is at
387
+ * `bases_offset + i*12 + 8`.
388
+ *
389
+ * The record id comes from a `NAME=` field in the comments section when present, else `"scf"`.
390
+ * Deliberately lenient (see AGENTS.md): never throws; returns `[]` for a truncated/unreadable
391
+ * file, and best-effort (whatever bases fit) for one truncated mid-section.
392
+ */
393
+
394
+ declare function parseScf(input: string | Uint8Array): SeqRecord[];
395
+
396
+ export { type FastaRecord, type FastqRecord, MAX_PHRED, type QualRecord, type SeqFileFormat, type SeqRecord, type WrapOptions, detectFormat, formatFasta, formatFastq, formatQual, hasUsableQuality, makeSeqRecord, parseAce, parseBam, parseClustal, parseEmbl, parseFasta, parseFastq, parseGenbank, parseGfa, parseGff, parseMega, parseMsf, parseNexus, parsePdb, parsePhylip, parsePir, parseSam, parseScf, parseStockholm, parseSwissprot };
package/dist/index.d.ts CHANGED
@@ -1,23 +1,5 @@
1
1
  export { AbifBaseCallRole, AbifBaseCallVariant, AbifBaseCalls, AbifByteRange, AbifChromatogramBundle, AbifDataChannelRole, AbifDecodedValue, AbifDirEntry, AbifDirectory, AbifEntry, AbifEntryRaw, AbifFile, AbifMetadata, ChannelSignals, Chromatogram, CropAbifOptions, CropAbifRange, ENTRY_SIZE, HEADER_SIZE, ParsedAbif, averagePeakSpacing, channelMaxLength, cropAbif, dataChannelRole, ensureRawDataChannels, findEntries, findEntry, getChannelMap, getConfidences, getConfidencesForVersion, getDataChannel, getFwo, getPositions, getPositionsForVersion, getReverseComplemented, getSamplingRate, getSequence, getSequenceForVersion, hasData9To12Block, hasSignals, insertEntrySorted, isFwoPermutation, parseAbif, readAbif, setAveragePeakSpacing, setConfidences, setPositions, setSequence, tagNameFromInt32, upsertEntry, writeAbif } from './abif/index.js';
2
2
 
3
- /**
4
- * Content-based file-format detection.
5
- *
6
- * Sniffs the bytes, never the file extension: binary magic first (ABIF at offset 0, or at
7
- * 128 behind a MacBinary preamble; SCF's ".scf" magic), then the first non-blank line for
8
- * the text formats. Text signatures are matched on the leading line's content (a keyword
9
- * like `LOCUS`, or the first character `>` / `;` / `@`), so a mislabeled or extension-less
10
- * file still resolves.
11
- */
12
- /** A format {@link detectFormat} can recognize. Some are detected before their reader ships. */
13
- type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'pir' | 'gff' | 'sam' | 'bam' | 'gfa' | 'unknown';
14
- /**
15
- * Detect the sequencing file format from its content. Returns 'unknown' when no signature
16
- * matches (empty input, or a leading line that is neither a known magic nor a recognized
17
- * text marker).
18
- */
19
- declare function detectFormat(bytes: Uint8Array): SeqFileFormat;
20
-
21
3
  /**
22
4
  * The common "a sequence with a name" record produced by every reader that extracts
23
5
  * sequences for downstream picking/export (GenBank, EMBL, Swiss-Prot, the alignment
@@ -38,6 +20,47 @@ interface SeqRecord {
38
20
  /** Build a {@link SeqRecord}, dropping an empty description so records compare cleanly. */
39
21
  declare function makeSeqRecord(id: string, description: string, sequence: string): SeqRecord;
40
22
 
23
+ /**
24
+ * ACE (`.ace`) reader — assembly sequence extraction (Phrap/consed).
25
+ *
26
+ * An ACE file describes one or more contigs. Each contig is a `CO <name> <nBases> <nReads> …` line
27
+ * followed by the consensus sequence (wrapped over several lines), then per-read records
28
+ * `RD <readName> <nPaddedBases> …` each followed by that read's padded sequence. Other records
29
+ * (`AS`, `BQ`, `QA`, `AF`, `BS`, `DS`, `WA`, `CT`, `RT`, …) carry qualities/metadata and are skipped.
30
+ *
31
+ * This reader returns every sequence it finds, in file order:
32
+ * - each contig consensus → id `Contig<name>`, description `consensus`
33
+ * - each read → id `<readName>`, description `read`
34
+ * The pad character `*` (an alignment gap in ACE) is kept verbatim — de-gapping is the caller's
35
+ * choice.
36
+ *
37
+ * A `CO`/`RD` header declares the block's exact base count, so the sequence is accumulated until that
38
+ * many residues are read (or a blank line ends it). This length-driven boundary — rather than
39
+ * "stop at the next two-letter tag" — avoids swallowing a following record and avoids truncating at a
40
+ * short residue line that merely looks like a tag (e.g. a line that is literally `BQ`/`CT`, both
41
+ * valid residues). Deliberately lenient (see AGENTS.md): never throws; a truncated final block is kept.
42
+ */
43
+
44
+ declare function parseAce(input: string | Uint8Array): SeqRecord[];
45
+
46
+ /**
47
+ * Content-based file-format detection.
48
+ *
49
+ * Sniffs the bytes, never the file extension: binary magic first (ABIF at offset 0, or at
50
+ * 128 behind a MacBinary preamble; SCF's ".scf" magic), then the first non-blank line for
51
+ * the text formats. Text signatures are matched on the leading line's content (a keyword
52
+ * like `LOCUS`, or the first character `>` / `;` / `@`), so a mislabeled or extension-less
53
+ * file still resolves.
54
+ */
55
+ /** A format {@link detectFormat} can recognize. Some are detected before their reader ships. */
56
+ type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'mega' | 'pir' | 'gff' | 'sam' | 'bam' | 'gfa' | 'pdb' | 'ace' | 'unknown';
57
+ /**
58
+ * Detect the sequencing file format from its content. Returns 'unknown' when no signature
59
+ * matches (empty input, or a leading line that is neither a known magic nor a recognized
60
+ * text marker).
61
+ */
62
+ declare function detectFormat(bytes: Uint8Array): SeqFileFormat;
63
+
41
64
  /**
42
65
  * EMBL / Swiss-Prot (UniProtKB) flat-file reader — sequence extraction only.
43
66
  *
@@ -213,7 +236,7 @@ declare function parseGff(input: string | Uint8Array): SeqRecord[];
213
236
  * Multiple-sequence-alignment readers — one aligned row = one record.
214
237
  *
215
238
  * Covers the common alignment formats: Clustal (`.aln`), Stockholm (`.sto`/`.stk`),
216
- * PHYLIP (`.phy`), NEXUS (`.nex`) and GCG/MSF (`.msf`). Each returns the alignment's rows
239
+ * PHYLIP (`.phy`), NEXUS (`.nex`), GCG/MSF (`.msf`) and MEGA (`.meg`). Each returns the alignment's rows
217
240
  * as {@link SeqRecord}s: `id` = the taxon/sequence name, `sequence` = that row **with its
218
241
  * gap characters preserved** (an aligned row is data; de-gapping is a caller's choice).
219
242
  * Only line spacing and wrap are removed. No description field — these formats don't carry
@@ -250,6 +273,37 @@ declare function parsePhylip(input: string | Uint8Array): SeqRecord[];
250
273
  declare function parseNexus(input: string | Uint8Array): SeqRecord[];
251
274
  /** Read a GCG/MSF (`.msf`) alignment (the sequence blocks after the header's `//`). */
252
275
  declare function parseMsf(input: string | Uint8Array): SeqRecord[];
276
+ /**
277
+ * Read a MEGA (`.meg`) alignment / sequence set.
278
+ *
279
+ * MEGA files open with `#mega` (or `#MEGA`), carry `!Command …;` directives (Title/Format/…), then
280
+ * the sequences as `#Name residues` rows — interleaved (each name repeats per block) or with the
281
+ * residues wrapped onto following lines. Rows are accumulated by name. Gap `-` and the identity
282
+ * match-char `.` are kept verbatim (de-gapping is the caller's choice; note `.` means "same as the
283
+ * first sequence" in MEGA, like NEXUS). Deliberately lenient: never throws.
284
+ */
285
+ declare function parseMega(input: string | Uint8Array): SeqRecord[];
286
+
287
+ /**
288
+ * PDB (`.pdb`) reader — sequence extraction from `SEQRES` records.
289
+ *
290
+ * A PDB file lists each macromolecular chain's primary sequence in `SEQRES` records:
291
+ * `SEQRES <serNum> <chainID> <numRes> <res1> <res2> … <res13>`
292
+ * with the residues as three-letter codes (13 per line, continued across records). This reader
293
+ * collects the SEQRES residues per chain, in file order, and maps the three-letter codes to the
294
+ * one-letter sequence: the 20 standard amino acids (+ SEC→U, PYL→O, the ambiguity codes B/Z/X),
295
+ * and nucleotides (DA/DC/DG/DT/DU and A/C/G/U/T/I/N). Anything unrecognized becomes `X`.
296
+ * - id: the chain identifier (e.g. `A`).
297
+ * - sequence: the chain's residues, one letter each (no gaps — SEQRES is the primary sequence).
298
+ *
299
+ * SEQRES is the declared sequence and is preferred. For a chain with no SEQRES record (common in
300
+ * coordinate-only files — predicted models, fragments), the sequence is reconstructed from the
301
+ * first model's `ATOM` records instead (one residue per chain + residue number), plus any `HETATM`
302
+ * whose residue is a recognized polymer/modified code (e.g. MSE selenomethionine) — solvent, ions
303
+ * and ligands are left out. Deliberately lenient (see AGENTS.md): never throws.
304
+ */
305
+
306
+ declare function parsePdb(input: string | Uint8Array): SeqRecord[];
253
307
 
254
308
  /**
255
309
  * PIR / NBRF (`.pir`) reader — sequence extraction.
@@ -309,4 +363,34 @@ declare function parseBam(bytes: Uint8Array): SeqRecord[];
309
363
 
310
364
  declare function parseSam(input: string | Uint8Array): SeqRecord[];
311
365
 
312
- export { type FastaRecord, type FastqRecord, MAX_PHRED, type QualRecord, type SeqFileFormat, type SeqRecord, type WrapOptions, detectFormat, formatFasta, formatFastq, formatQual, hasUsableQuality, makeSeqRecord, parseBam, parseClustal, parseEmbl, parseFasta, parseFastq, parseGenbank, parseGfa, parseGff, parseMsf, parseNexus, parsePhylip, parsePir, parseSam, parseStockholm, parseSwissprot };
366
+ /**
367
+ * SCF (`.scf`) reader — the called base sequence from a Staden chromatogram trace.
368
+ *
369
+ * SCF (Standard Chromatogram Format) is a binary trace file. Only the **called bases** are
370
+ * extracted here (the trace samples/qualities are ignored — this library reads sequences):
371
+ *
372
+ * Header (128 bytes, big-endian). The fields this reader uses:
373
+ * off field
374
+ * 0 magic ".scf"
375
+ * 12 bases (uint32 — number of called bases)
376
+ * 24 bases_offset (uint32 — start of the bases section)
377
+ * 36 version[4] (ASCII, e.g. "2.00" / "3.00")
378
+ * 28 comments_size (uint32)
379
+ * 32 comments_offset(uint32)
380
+ *
381
+ * Bases section — two layouts by version:
382
+ * • v3.x (column/SoA): peak indices (bases×uint32), then prob_A/C/G/T (bases bytes each),
383
+ * then the **base characters** (bases bytes), then spare (bases×3). So the characters begin
384
+ * at `bases_offset + bases*8`.
385
+ * • v2.x (interleaved/AoS): `bases` records of 12 bytes each — peak_index(uint32),
386
+ * prob_A/C/G/T(4), **base char(1)**, spare(3). The character of record i is at
387
+ * `bases_offset + i*12 + 8`.
388
+ *
389
+ * The record id comes from a `NAME=` field in the comments section when present, else `"scf"`.
390
+ * Deliberately lenient (see AGENTS.md): never throws; returns `[]` for a truncated/unreadable
391
+ * file, and best-effort (whatever bases fit) for one truncated mid-section.
392
+ */
393
+
394
+ declare function parseScf(input: string | Uint8Array): SeqRecord[];
395
+
396
+ export { type FastaRecord, type FastqRecord, MAX_PHRED, type QualRecord, type SeqFileFormat, type SeqRecord, type WrapOptions, detectFormat, formatFasta, formatFastq, formatQual, hasUsableQuality, makeSeqRecord, parseAce, parseBam, parseClustal, parseEmbl, parseFasta, parseFastq, parseGenbank, parseGfa, parseGff, parseMega, parseMsf, parseNexus, parsePdb, parsePhylip, parsePir, parseSam, parseScf, parseStockholm, parseSwissprot };
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
- 'use strict';function U(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function $(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function C(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function T(e,t,n){return e.subarray(t,t+n)}function be(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var D=128,R=28;function oe(e){if(e.byteLength<D)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(U(T(e,0,4))!=="ABIF")if(e.byteLength>=132&&U(T(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<D)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=C(e),i=r.getInt16(n+4,false),o=re(e,r,n+6,n);if(o.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${o.tagName}"`);if(o.elementSize!==R)throw new Error(`Expected dir element size ${R}, got ${o.elementSize}`);let a=o.raw?.elementCount??o.elementCount,s=Math.max(0,a),c=r.getInt32(n+6+20,false);if(c<0||c+s*R>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${c}, entries=${s}, file=${e.byteLength-n}`);let m=[];for(let w=0;w<s;w++)m.push(re(e,r,n+c+w*R,n));let d=o.raw?.dataSize??s*R,u=n+c+s*R,p=Math.min(Math.max(0,d-s*R),Math.max(0,e.byteLength-u)),l={entryCount:s,rawEntryCount:a,elementType:o.elementType,tagNumber:o.tagNumber,entrySize:o.elementSize,dataSize:d,dataOffset:c,dataOffsetBytes:o.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:o.dataHandle,paddingBytes:new Uint8Array(T(e,u,p))},h=new Uint8Array(T(e,n+6+R,D-6-R)),y=t===128?new Uint8Array(T(e,0,128)):void 0,S=Ae(e,n,c,d,m,t);return {version:i,tdir:l,entries:m,macBinaryOffset:t,macBinaryHeader:y,headerReserved:h,unreferencedRanges:S}}function Ae(e,t,n,r,i,o){let a=e.byteLength,s=[];o===128&&s.push([0,128]),s.push([t,t+D]);let c=Math.max(i.length*R,Math.max(0,r));s.push([t+n,t+n+c]);for(let l of i)if(l.raw&&!l.raw.inline){let h=t+l.raw.dataOffset;s.push([h,h+l.payload.byteLength]);}let m=s.map(([l,h])=>[Math.max(0,Math.min(l,a)),Math.max(0,Math.min(h,a))]).filter(([l,h])=>h>l).sort((l,h)=>l[0]-h[0]),d=[];for(let[l,h]of m){let y=d[d.length-1];y&&l<=y[1]?y[1]=Math.max(y[1],h):d.push([l,h]);}let u=[],p=0;for(let[l,h]of d)l>p&&u.push({offset:p,bytes:new Uint8Array(T(e,p,l-p))}),p=Math.max(p,h);return p<a&&u.push({offset:p,bytes:new Uint8Array(T(e,p,a-p))}),u}function re(e,t,n,r){let i=U(T(e,n,4)),o=t.getInt32(n+4,false),a=t.getInt16(n+8,false),s=t.getInt16(n+10,false),c=t.getInt32(n+12,false),m=t.getInt32(n+16,false),d=t.getInt32(n+24,false),u=Math.max(0,c*Math.max(0,s)),p=m>=0?m:u,l=m>=0?m<=4:u<=4,h=Math.max(0,s>0?Math.min(c,Math.floor(p/s)):Math.min(c,p)),y,S;if(l)S=-1,y=new Uint8Array(T(e,n+20,Math.min(4,p)));else {S=t.getInt32(n+20,false);let f=r+S;if(S<0||f+p>e.byteLength)throw new Error(`Entry ${i}${o}: payload out of bounds (offset=${S}, size=${p})`);y=new Uint8Array(T(e,f,p));}let w=new Uint8Array(T(e,n+20,4));return {tagName:i,tagNumber:o,elementType:a,elementSize:s,elementCount:h,payload:y,dataHandle:d,raw:{elementCount:c,dataSize:m,dataOffset:S,inline:l,dataOffsetBytes:w}}}function Qe(e){let t=e.macBinaryOffset,n=e.entries.length,r=e.tdir.entryCount,i=e.entries.map(l=>l.raw&&l.payload.byteLength===l.raw.dataSize?l.raw:void 0),o=D;o=Math.max(o,e.tdir.dataOffset+Math.max(e.tdir.dataSize,r*R));for(let l of i)l&&!l.inline&&(o=Math.max(o,l.dataOffset+l.dataSize));for(let l of e.unreferencedRanges)o=Math.max(o,l.offset-t+l.bytes.length);let a=n>r,s=o,c=a?s:e.tdir.dataOffset,m=n===r?e.tdir.dataSize:n*R;a&&(s+=m);let d=new Array(n);for(let l=0;l<n;l++){let h=e.entries[l].payload.byteLength;if(i[l]||h<=4){d[l]=-1;continue}d[l]=s,s+=h;}let u=new Uint8Array(s),p=C(u);u.set($("ABIF"),0),p.setInt16(4,e.version,false),u.set(e.headerReserved,6+R),ie(u,p,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:n,dataSize:m,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:c}}),n===r&&e.tdir.paddingBytes.length>0&&u.set(e.tdir.paddingBytes,c+n*R);for(let l=0;l<n;l++){let h=e.entries[l],y=i[l],S=c+l*R,w=h.payload.byteLength;ie(u,p,S,{tagName:h.tagName,tagNumber:h.tagNumber,elementType:h.elementType,elementSize:h.elementSize,elementCount:y?y.elementCount:h.elementCount,dataSize:y?y.dataSize:w,dataHandle:h.dataHandle,offsetSlot:w<=4?{kind:"inline",payload:h.payload,dataSize:w,staleTail:y?.dataOffsetBytes}:{kind:"external",value:y?y.dataOffset:d[l]}}),w>4&&u.set(h.payload,y?y.dataOffset:d[l]);}for(let l of e.unreferencedRanges)u.set(l.bytes,l.offset-t);return u}function ie(e,t,n,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set($(r.tagName),n),t.setInt32(n+4,r.tagNumber,false),t.setInt16(n+8,r.elementType,false),t.setInt16(n+10,r.elementSize,false),t.setInt32(n+12,r.elementCount,false),t.setInt32(n+16,r.dataSize,false),r.offsetSlot.kind==="external")t.setInt32(n+20,r.offsetSlot.value,false);else {let{payload:i,dataSize:o,staleTail:a}=r.offsetSlot;e.fill(0,n+20,n+24),e.set(i.subarray(0,o),n+20),a&&o<4&&e.set(a.subarray(o,4),n+20+o);}t.setInt32(n+24,r.dataHandle,false);}function N(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function Ke(e,t){return e.entries.filter(n=>n.tagName===t)}function ye(e,t){return e.tagName!==t.tagName?e.tagName<t.tagName?-1:1:e.tagNumber-t.tagNumber}function Y(e,t){let n=e.findIndex(r=>ye(r,t)>0);e.splice(n<0?e.length:n,0,t);}function I(e,t,n,r,i){if(r.byteLength!==i.elementCount*i.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let o=N(e,t,n);o?(o.elementType=i.elementType,o.elementSize=i.elementSize,o.elementCount=i.elementCount,o.payload=r,o.raw=void 0):Y(e.entries,{tagName:t,tagNumber:n,elementType:i.elementType,elementSize:i.elementSize,elementCount:i.elementCount,payload:r,dataHandle:0});}function et(e,t){let n=N(e,"DATA",t);if(!n)return;if(n.elementSize!==2)throw new Error(`DATA${t}: expected elementSize=2, got ${n.elementSize}`);let r=new Int16Array(n.elementCount),i=C(n.payload);for(let o=0;o<n.elementCount;o++)r[o]=i.getInt16(o*2,false);return r}function Q(e){let t=N(e,"FWO_",1);return t?U(t.payload.subarray(0,t.elementCount)):"GATC"}function K(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function B(e){return !!(N(e,"DATA",9)&&N(e,"DATA",10)&&N(e,"DATA",11)&&N(e,"DATA",12))}function tt(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function nt(e){let t=N(e,"RevC",1);if(!t)return;let n=C(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function rt(e){let t=Q(e);if(!K(t))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${t}"`);return {[t[0]]:1,[t[1]]:2,[t[2]]:3,[t[3]]:4}}function it(e){return M(e,2)??M(e,1)}function M(e,t){let n=N(e,"PBAS",t);if(n)return U(n.payload.subarray(0,n.elementCount)).replace(/\0+$/g,"")}function ot(e){return v(e,2)??v(e,1)}function v(e,t){let n=N(e,"PCON",t);if(!n)return;let r=new Array(n.elementCount);for(let i=0;i<n.elementCount;i++)r[i]=n.payload[i];return r}function at(e){return P(e,2)??P(e,1)}function P(e,t){let n=N(e,"PLOC",t);if(!n)return;if(n.elementSize!==2)throw new Error(`PLOC${t}: expected elementSize=2, got ${n.elementSize}`);let r=C(n.payload),i=new Array(n.elementCount);for(let o=0;o<n.elementCount;o++)i[o]=r.getUint16(o*2,false);return i}function st(e){let t=N(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=C(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}function mt(e,t,n={}){let{start:r,end:i}=t;if(!Number.isInteger(r)||!Number.isInteger(i)||r<0||i<=r)throw new Error(`cropAbif: invalid range [${r}, ${i})`);if(!B(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let o=Math.min(G(e,9),G(e,10),G(e,11),G(e,12));if(i>o)throw new Error(`cropAbif: range end ${i} exceeds the processed trace length ${o}`);let a=n.rawTrace??"omit",s=[];for(let c of e.entries)c.tagName==="DATA"&&c.tagNumber>=9&&c.tagNumber<=12?s.push(Se(c,r,i)):c.tagName==="DATA"&&c.tagNumber>=1&&c.tagNumber<=8?a==="full"&&s.push({...c}):c.tagName==="PBAS"||c.tagName==="PCON"||c.tagName==="PLOC"||s.push({...c});for(let c of xe(e))s.push(...Ne(e,c,r,i));return {version:e.version,tdir:e.tdir,entries:s,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function G(e,t){return N(e,"DATA",t)?.elementCount??0}function Se(e,t,n){if(e.elementSize!==2)throw new Error(`cropAbif: DATA${e.tagNumber} expected elementSize=2, got ${e.elementSize}`);let r=new Uint8Array(e.payload.subarray(t*2,n*2));return {tagName:"DATA",tagNumber:e.tagNumber,elementType:e.elementType,elementSize:2,elementCount:n-t,payload:r,dataHandle:e.dataHandle}}function xe(e){let t=new Set;for(let n of e.entries)n.tagName==="PBAS"&&t.add(n.tagNumber);return Array.from(t).sort((n,r)=>n-r)}function Ne(e,t,n,r){let i=M(e,t);if(i===void 0)return [];let o=P(e,t);if(o===void 0)throw new Error(`cropAbif: PBAS${t} has no PLOC${t} to crop by`);if(o.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PLOC${t} length mismatch (${i.length} vs ${o.length})`);let a=v(e,t);if(a!==void 0&&a.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PCON${t} length mismatch`);let s=[];for(let u=0;u<o.length;u++)o[u]>=n&&o[u]<r&&s.push(u);let c=s.map(u=>i[u]).join(""),m=s.map(u=>o[u]-n),d=[{tagName:"PBAS",tagNumber:t,elementType:2,elementSize:1,elementCount:c.length,payload:$(c),dataHandle:0},{tagName:"PLOC",tagNumber:t,elementType:4,elementSize:2,elementCount:m.length,payload:Ce(m),dataHandle:0}];if(a!==void 0){let u=s.map(p=>a[p]);d.push({tagName:"PCON",tagNumber:t,elementType:2,elementSize:1,elementCount:u.length,payload:Uint8Array.from(u),dataHandle:0});}return d}function Ce(e){let t=new Uint8Array(e.length*2),n=C(t);for(let r=0;r<e.length;r++)n.setUint16(r*2,Math.max(0,Math.min(65535,e[r])),false);return t}var we={1:"byte",2:"char",3:"word",4:"short",5:"long",7:"float",8:"double",10:"date",11:"time",12:"thumb",13:"bool",18:"pString",19:"cString",1023:"tdir"};function Z(e){return we[e]??(e>=1024?`user${e}`:`type${e}`)}function Re(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function Fe(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function ae(e){let t=e.subarray(0,16),n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${n}${e.byteLength>16?" \u2026":""}]`}function X(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function q(e,t,n,r){let i=Math.max(0,Math.min(t,Math.floor(e/n))),o=[];for(let a=0;a<i;a++)o.push(r(a*n));return o.length===1?{kind:"number",value:o[0]}:{kind:"numbers",value:o}}function se(e,t,n){let r=C(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:U(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return q(n.byteLength,t,2,i=>r.getUint16(i,false));case 4:return q(n.byteLength,t,2,i=>r.getInt16(i,false));case 5:return q(n.byteLength,t,4,i=>r.getInt32(i,false));case 7:return q(n.byteLength,t,4,i=>r.getFloat32(i,false));case 8:return q(n.byteLength,t,8,i=>r.getFloat64(i,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let i=r.getInt16(0,false),o=r.getUint8(2),a=r.getUint8(3);return {kind:"date",value:{year:i,month:o,day:a}}}case 11:return n.byteLength<4?{kind:"unknown",value:n}:{kind:"time",value:{hour:r.getUint8(0),minute:r.getUint8(1),second:r.getUint8(2),hsec:r.getUint8(3)}};case 13:{let i=[];for(let o=0;o<Math.min(t,n.byteLength);o++)i.push(r.getUint8(o)!==0);return {kind:"bools",value:i}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let i=r.getUint8(0);return {kind:"string",value:U(T(n,1,Math.min(i,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function Te(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return Re(e.value);case "string":return Fe(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:n,month:r,day:i}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(i).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:i}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(i).padStart(2,"0")}`}case "bytes":return `${Z(t)} ${ae(e.value)}`;case "unknown":return `${Z(t)} ${ae(e.value)}`}}function bt(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=oe(n),i=r.entries.map(f=>{let g=f.tagName==="PCON"&&f.elementSize===1?se(1,f.elementCount,f.payload):se(f.elementType,f.elementCount,f.payload);return {tag:f.tagName,tagNumber:f.tagNumber,elementType:f.elementType,elementTypeName:Z(f.elementType),elementSize:f.elementSize,elementCount:f.elementCount,rawElementCount:f.raw?.elementCount??f.elementCount,dataSize:f.raw?.dataSize??f.elementCount*f.elementSize,dataOffset:f.raw?.dataOffset??-1,inline:f.raw?.inline??f.elementCount*f.elementSize<=4,decoded:g,preview:Te(g,f.elementType)}}),o=Q(r);K(o)||(o="GATC");let a={},s={A:[],C:[],G:[],T:[]},c={A:[],C:[],G:[],T:[]},m={comments:[]},d={},u={},p={},l=f=>o[f];for(let f=0;f<r.entries.length;f++){let g=r.entries[f],A=i[f].decoded;if(g.tagName==="DATA"){let b=X(A);b&&(a[g.tagNumber]=b,g.tagNumber>=1&&g.tagNumber<=4?s[l(g.tagNumber-1)]=b:g.tagNumber>=9&&g.tagNumber<=12&&(c[l(g.tagNumber-9)]=b));}else if(g.tagName==="PBAS"&&A.kind==="string")d[g.tagNumber]=A.value;else if(g.tagName==="PCON"){let b=g.elementSize===1?Array.from(g.payload.subarray(0,g.elementCount)):X(A);b&&(u[g.tagNumber]=b);}else if(g.tagName==="PLOC"){let b=X(A);b&&(p[g.tagNumber]=b.map(j=>j<0?j+65536:j));}else if(g.tagName==="SPAC")if(g.elementSize===4&&g.payload.byteLength>=4){let b=C(g.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(m.samplingRate=b);}else A.kind==="number"&&(m.samplingRate=A.value);else if(g.tagName==="SMPL"&&A.kind==="string")m.sampleName=A.value;else if(g.tagName==="LANE"&&A.kind==="number")m.laneNumber=A.value;else if(g.tagName==="TUBE"&&A.kind==="string")m.tube=A.value;else if(g.tagName==="MCHN"&&A.kind==="string")m.machineName=A.value;else if(g.tagName==="MODL"&&A.kind==="string")m.machineModel=A.value;else if(g.tagName==="RUND"&&A.kind==="date"){let b=A.value;m.runDate=`${b.year}-${String(b.month).padStart(2,"0")}-${String(b.day).padStart(2,"0")}`;}else if(g.tagName==="RUNT"&&A.kind==="time"){let b=A.value;m.runTime=`${String(b.hour).padStart(2,"0")}:${String(b.minute).padStart(2,"0")}:${String(b.second).padStart(2,"0")}`;}else g.tagName==="CMNT"&&A.kind==="string"?m.comments.push(A.value):g.tagName==="RevC"&&g.tagNumber===1&&(A.kind==="number"?m.reverseComplemented=A.value!==0:A.kind==="numbers"&&(m.reverseComplemented=A.value.some(b=>b!==0)));}let h=Object.keys(d).map(Number).sort((f,g)=>f-g).map(f=>({version:f,role:f===1?"edited":f===2?"called":"unknown",sequence:d[f],confidences:u[f]??[],positions:p[f]??[]})),y,S=2 in d?2:1 in d?1:Object.keys(d).map(Number)[0];if(S!==void 0&&d[S]!==void 0){let f=d[S].toUpperCase(),g=u[S]??[];g.length!==f.length&&(g=Object.keys(u).map(Number).map(b=>u[b]).find(b=>b.length===f.length)??[]);let A=p[S]??[];A.length!==f.length&&(A=Object.keys(p).map(Number).map(b=>p[b]).find(b=>b.length===f.length)??[]),y={sequence:f,confidences:g,positions:A,pbasVersion:S};}if(!Number.isFinite(m.samplingRate)||(m.samplingRate??0)<=0){let f=y?.positions,g=Math.max(c.A.length,c.C.length,c.G.length,c.T.length);f&&f.length>1?m.samplingRate=(f[f.length-1]-f[0])/(f.length-1):y&&y.sequence.length>0&&g>0&&(m.samplingRate=g/y.sequence.length);}let w={baseOrder:o,dataChannels:a,data1To4:s,data9To12:c};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:m,chromatogram:w,baseCalls:y,baseCallVariants:h,entries:i}}function At(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function yt(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function wt(e,t){I(e,"PBAS",2,$(t),{elementType:2,elementSize:1,elementCount:t.length});}function Rt(e,t){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=Math.max(0,Math.min(255,Math.round(t[r])));I(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function Ft(e,t){let n=new Uint8Array(t.length*2),r=C(n);for(let i=0;i<t.length;i++)r.setUint16(i*2,Math.max(0,Math.min(65535,t[i])),false);I(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function Tt(e,t,n){let r=new Uint8Array(4);C(r).setFloat32(0,t,false),I(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let i=$(n),o=Math.min(255,i.length),a=new Uint8Array(1+o);a[0]=o,a.set(i.subarray(0,o),1),I(e,"SPAC",2,a,{elementType:18,elementSize:1,elementCount:1+o});let s=new Uint8Array(4);C(s).setFloat32(0,t,false),I(e,"SPAC",3,s,{elementType:7,elementSize:4,elementCount:1});}function Et(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function Lt(e){if(!B(e))for(let t=1;t<=4;t++){let n=N(e,"DATA",t);if(!n)continue;let r=8+t;N(e,"DATA",r)||Y(e.entries,{tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}function z(e){let t=typeof e=="string"?e:new TextDecoder().decode(e);return t.charCodeAt(0)===65279&&(t=t.slice(1)),t}function x(e){return z(e).split(/\r\n|\r|\n/)}function E(e){return e.replace(/\s+/g,"")}function L(e){return e.trim().length===0}function k(e){let t=e.trim(),n=t.search(/\s/);return n<0?t:t.slice(0,n)}var Ee=128,ue=8192;function kt(e){if(V(e,0,"ABIF")||V(e,Ee,"ABIF"))return "abif";if(V(e,0,".scf"))return "scf";if(V(e,0,"BAM"))return "bam";let t=$e(e);return t===void 0?"unknown":Le(t)}function Le(e){let t=e.trimStart();if(/^LOCUS\s/.test(t))return "genbank";if(/^ID\s/.test(t))return /(Reviewed|Unreviewed);| AA\.\s*$/.test(t)?"swissprot":"embl";if(/^#\s*STOCKHOLM/i.test(t))return "stockholm";if(/^#NEXUS/i.test(t))return "nexus";if(/^(CLUSTAL|MUSCLE|MAFFT|T-?COFFEE|PROBCONS|KALIGN|MVIEW|PROMALS)\b/i.test(t)||/multiple (sequence )?alignment/i.test(t)&&!/^[>@#]/.test(t))return "clustal";if(/^!!(NA|AA)_MULTIPLE_ALIGNMENT/i.test(t)||/\bMSF:\s*\d/.test(t))return "msf";if(/^\d+\s+\d+\s*$/.test(t))return "phylip";if(/^##gff-version/i.test(t))return "gff";if(/^H\t(?:[^\t]*\t)*VN:Z:[12]\./.test(t))return "gfa";if(/^@(HD|SQ|RG|PG|CO)\t/.test(t))return "sam";if(/^>(P1|F1|DL|DC|RL|RC|N1|N3|XX);/i.test(t))return "pir";switch(t.charCodeAt(0)){case 62:case 59:return "fasta";case 64:return "fastq"}return Ue(t)?"sam":/^S\t[!-~]+\t/.test(t)?"gfa":"unknown"}function Ue(e){let t=e.split(" ");if(t.length<11)return false;let[,n,,r,i,o]=t;return /^\d+$/.test(n)&&/^\d+$/.test(r)&&/^\d+$/.test(i)&&/^(\*|(\d+[MIDNSHPX=])+)$/.test(o)}function $e(e){let t=e.length>ue?e.subarray(0,ue):e;for(let n of z(t).split(/\r\n|\r|\n/))if(n.trim().length>0)return n}function V(e,t,n){if(e.length<t+n.length)return false;for(let r=0;r<n.length;r++)if(e[t+r]!==n.charCodeAt(r))return false;return true}function F(e,t,n){return t?{id:e,description:t,sequence:n}:{id:e,sequence:n}}function vt(e){return ce(e,"embl")}function Pt(e){return ce(e,"swissprot")}function ce(e,t){let n=x(e),r=[],i=false,o="",a="",s=[],c=[],m="header",d=()=>{i&&(r.push(F(Ie(t,o,a),s.join(" ").trim(),E(c.join("")))),i=false,o="",a="",s=[],c=[],m="header");};for(let u of n){if(u.startsWith("//")){d();continue}if(m==="sequence"){if(u.length===0||/^\s/.test(u)){c.push(u.replace(/[\s\d]/g,""));continue}m="header";}let p=u.slice(0,2);p==="ID"?(i&&d(),i=true,o=u.slice(2).trim()):p==="AC"?(a||(a=u.slice(2).split(";")[0].trim()),i=true):p==="DE"?(s.push(u.slice(2).trim()),i=true):p==="SQ"&&(m="sequence",i=true);}return d(),r}function Ie(e,t,n){if(e==="swissprot")return n||k(t);let r=t.split(";"),i=k(r[0]),o="";for(let a of r){let s=/^\s*SV\s+(\d+)/.exec(a);s&&(o=s[1]);}return (o?`${i}.${o}`:i)||n}var le=93,J=33,me=60,ke=255;function de(e){let t=x(e),n=[],r,i=[],o=()=>{r!==void 0&&n.push(Oe(r,i.join("")));};for(let a of t)if(a[0]===">")o(),r=a.slice(1),i=[];else {if(L(a)||a[0]===";")continue;if(r===void 0)continue;i.push(a);}return o(),n}function Vt(e){let t=x(e),n=[],r=0;for(;r<t.length;){if(L(t[r])||t[r][0]!=="@"){r++;continue}let i=t[r].slice(1);r++;let o=[];for(;r<t.length&&t[r][0]!=="+"&&t[r][0]!=="@";)o.push(t[r]),r++;let a=E(o.join(""));if(r>=t.length||t[r][0]==="@"){n.push(fe(i,a,""));continue}r++;let s="";for(;r<t.length&&s.length<a.length&&!(t[r][0]==="@"&&De(t,r));)s+=E(t[r]),r++;n.push(fe(i,a,s));}return n}function _t(e,t){let n=t?.lineWidth??me;return ne(e).map(r=>`${ee(">",r.id,r.description)}
2
- ${ze(r.sequence,n)}`).join("")}function Ht(e){return ne(e).map(qe).join("")}function Wt(e,t){let n=t?.lineWidth??me;return ne(e).map(r=>`${ee(">",r.id,r.description)}
3
- ${Me(r.qualities,n)}`).join("")}function jt(e){return !!e&&e.length>0&&!e.every(t=>t===ke)}function Oe(e,t){let{id:n,description:r}=ge(e),i=E(t);return r===void 0?{id:n,sequence:i}:{id:n,description:r,sequence:i}}function fe(e,t,n){let{id:r,description:i}=ge(e),o=new Array(t.length);for(let a=0;a<t.length;a++){let s=a<n.length?n.charCodeAt(a):J;o[a]=te(s-J);}return i===void 0?{id:r,sequence:t,qualities:o}:{id:r,description:i,sequence:t,qualities:o}}function ge(e){let t=e.trim(),n=t.search(/\s/);return n<0?{id:t}:{id:t.slice(0,n),description:t.slice(n+1).trim()||void 0}}function De(e,t){let n=t+1;for(;n<e.length&&e[n][0]!=="+"&&e[n][0]!=="@";)n++;return e[n]?.[0]==="+"}function qe(e){let{id:t,description:n,sequence:r,qualities:i}=e;if(i.length!==r.length)throw new Error(`FASTQ ${t}: ${i.length} quality scores for ${r.length} bases`);let o=i.map(ve).join("");return `${ee("@",t,n)}
1
+ 'use strict';function U(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function I(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function w(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function F(e,t,n){return e.subarray(t,t+n)}function ye(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var M=128,E=28;function se(e){if(e.byteLength<M)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(U(F(e,0,4))!=="ABIF")if(e.byteLength>=132&&U(F(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<M)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=w(e),i=r.getInt16(n+4,false),o=ie(e,r,n+6,n);if(o.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${o.tagName}"`);if(o.elementSize!==E)throw new Error(`Expected dir element size ${E}, got ${o.elementSize}`);let s=o.raw?.elementCount??o.elementCount,a=Math.max(0,s),c=r.getInt32(n+6+20,false);if(c<0||c+a*E>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${c}, entries=${a}, file=${e.byteLength-n}`);let u=[];for(let R=0;R<a;R++)u.push(ie(e,r,n+c+R*E,n));let d=o.raw?.dataSize??a*E,f=n+c+a*E,g=Math.min(Math.max(0,d-a*E),Math.max(0,e.byteLength-f)),l={entryCount:a,rawEntryCount:s,elementType:o.elementType,tagNumber:o.tagNumber,entrySize:o.elementSize,dataSize:d,dataOffset:c,dataOffsetBytes:o.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:o.dataHandle,paddingBytes:new Uint8Array(F(e,f,g))},h=new Uint8Array(F(e,n+6+E,M-6-E)),S=t===128?new Uint8Array(F(e,0,128)):void 0,C=Ce(e,n,c,d,u,t);return {version:i,tdir:l,entries:u,macBinaryOffset:t,macBinaryHeader:S,headerReserved:h,unreferencedRanges:C}}function Ce(e,t,n,r,i,o){let s=e.byteLength,a=[];o===128&&a.push([0,128]),a.push([t,t+M]);let c=Math.max(i.length*E,Math.max(0,r));a.push([t+n,t+n+c]);for(let l of i)if(l.raw&&!l.raw.inline){let h=t+l.raw.dataOffset;a.push([h,h+l.payload.byteLength]);}let u=a.map(([l,h])=>[Math.max(0,Math.min(l,s)),Math.max(0,Math.min(h,s))]).filter(([l,h])=>h>l).sort((l,h)=>l[0]-h[0]),d=[];for(let[l,h]of u){let S=d[d.length-1];S&&l<=S[1]?S[1]=Math.max(S[1],h):d.push([l,h]);}let f=[],g=0;for(let[l,h]of d)l>g&&f.push({offset:g,bytes:new Uint8Array(F(e,g,l-g))}),g=Math.max(g,h);return g<s&&f.push({offset:g,bytes:new Uint8Array(F(e,g,s-g))}),f}function ie(e,t,n,r){let i=U(F(e,n,4)),o=t.getInt32(n+4,false),s=t.getInt16(n+8,false),a=t.getInt16(n+10,false),c=t.getInt32(n+12,false),u=t.getInt32(n+16,false),d=t.getInt32(n+24,false),f=Math.max(0,c*Math.max(0,a)),g=u>=0?u:f,l=u>=0?u<=4:f<=4,h=Math.max(0,a>0?Math.min(c,Math.floor(g/a)):Math.min(c,g)),S,C;if(l)C=-1,S=new Uint8Array(F(e,n+20,Math.min(4,g)));else {C=t.getInt32(n+20,false);let m=r+C;if(C<0||m+g>e.byteLength)throw new Error(`Entry ${i}${o}: payload out of bounds (offset=${C}, size=${g})`);S=new Uint8Array(F(e,m,g));}let R=new Uint8Array(F(e,n+20,4));return {tagName:i,tagNumber:o,elementType:s,elementSize:a,elementCount:h,payload:S,dataHandle:d,raw:{elementCount:c,dataSize:u,dataOffset:C,inline:l,dataOffsetBytes:R}}}function it(e){let t=e.macBinaryOffset,n=e.entries.length,r=e.tdir.entryCount,i=e.entries.map(l=>l.raw&&l.payload.byteLength===l.raw.dataSize?l.raw:void 0),o=M;o=Math.max(o,e.tdir.dataOffset+Math.max(e.tdir.dataSize,r*E));for(let l of i)l&&!l.inline&&(o=Math.max(o,l.dataOffset+l.dataSize));for(let l of e.unreferencedRanges)o=Math.max(o,l.offset-t+l.bytes.length);let s=n>r,a=o,c=s?a:e.tdir.dataOffset,u=n===r?e.tdir.dataSize:n*E;s&&(a+=u);let d=new Array(n);for(let l=0;l<n;l++){let h=e.entries[l].payload.byteLength;if(i[l]||h<=4){d[l]=-1;continue}d[l]=a,a+=h;}let f=new Uint8Array(a),g=w(f);f.set(I("ABIF"),0),g.setInt16(4,e.version,false),f.set(e.headerReserved,6+E),oe(f,g,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:n,dataSize:u,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:c}}),n===r&&e.tdir.paddingBytes.length>0&&f.set(e.tdir.paddingBytes,c+n*E);for(let l=0;l<n;l++){let h=e.entries[l],S=i[l],C=c+l*E,R=h.payload.byteLength;oe(f,g,C,{tagName:h.tagName,tagNumber:h.tagNumber,elementType:h.elementType,elementSize:h.elementSize,elementCount:S?S.elementCount:h.elementCount,dataSize:S?S.dataSize:R,dataHandle:h.dataHandle,offsetSlot:R<=4?{kind:"inline",payload:h.payload,dataSize:R,staleTail:S?.dataOffsetBytes}:{kind:"external",value:S?S.dataOffset:d[l]}}),R>4&&f.set(h.payload,S?S.dataOffset:d[l]);}for(let l of e.unreferencedRanges)f.set(l.bytes,l.offset-t);return f}function oe(e,t,n,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set(I(r.tagName),n),t.setInt32(n+4,r.tagNumber,false),t.setInt16(n+8,r.elementType,false),t.setInt16(n+10,r.elementSize,false),t.setInt32(n+12,r.elementCount,false),t.setInt32(n+16,r.dataSize,false),r.offsetSlot.kind==="external")t.setInt32(n+20,r.offsetSlot.value,false);else {let{payload:i,dataSize:o,staleTail:s}=r.offsetSlot;e.fill(0,n+20,n+24),e.set(i.subarray(0,o),n+20),s&&o<4&&e.set(s.subarray(o,4),n+20+o);}t.setInt32(n+24,r.dataHandle,false);}function N(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function ot(e,t){return e.entries.filter(n=>n.tagName===t)}function xe(e,t){return e.tagName!==t.tagName?e.tagName<t.tagName?-1:1:e.tagNumber-t.tagNumber}function Q(e,t){let n=e.findIndex(r=>xe(r,t)>0);e.splice(n<0?e.length:n,0,t);}function k(e,t,n,r,i){if(r.byteLength!==i.elementCount*i.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let o=N(e,t,n);o?(o.elementType=i.elementType,o.elementSize=i.elementSize,o.elementCount=i.elementCount,o.payload=r,o.raw=void 0):Q(e.entries,{tagName:t,tagNumber:n,elementType:i.elementType,elementSize:i.elementSize,elementCount:i.elementCount,payload:r,dataHandle:0});}function ut(e,t){let n=N(e,"DATA",t);if(!n)return;if(n.elementSize!==2)throw new Error(`DATA${t}: expected elementSize=2, got ${n.elementSize}`);let r=new Int16Array(n.elementCount),i=w(n.payload);for(let o=0;o<n.elementCount;o++)r[o]=i.getInt16(o*2,false);return r}function X(e){let t=N(e,"FWO_",1);return t?U(t.payload.subarray(0,t.elementCount)):"GATC"}function K(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function B(e){return !!(N(e,"DATA",9)&&N(e,"DATA",10)&&N(e,"DATA",11)&&N(e,"DATA",12))}function ft(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function lt(e){let t=N(e,"RevC",1);if(!t)return;let n=w(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function mt(e){let t=X(e);if(!K(t))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${t}"`);return {[t[0]]:1,[t[1]]:2,[t[2]]:3,[t[3]]:4}}function dt(e){return P(e,2)??P(e,1)}function P(e,t){let n=N(e,"PBAS",t);if(n)return U(n.payload.subarray(0,n.elementCount)).replace(/\0+$/g,"")}function gt(e){return v(e,2)??v(e,1)}function v(e,t){let n=N(e,"PCON",t);if(!n)return;let r=new Array(n.elementCount);for(let i=0;i<n.elementCount;i++)r[i]=n.payload[i];return r}function pt(e){return z(e,2)??z(e,1)}function z(e,t){let n=N(e,"PLOC",t);if(!n)return;if(n.elementSize!==2)throw new Error(`PLOC${t}: expected elementSize=2, got ${n.elementSize}`);let r=w(n.payload),i=new Array(n.elementCount);for(let o=0;o<n.elementCount;o++)i[o]=r.getUint16(o*2,false);return i}function ht(e){let t=N(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=w(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}function Ct(e,t,n={}){let{start:r,end:i}=t;if(!Number.isInteger(r)||!Number.isInteger(i)||r<0||i<=r)throw new Error(`cropAbif: invalid range [${r}, ${i})`);if(!B(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let o=Math.min(G(e,9),G(e,10),G(e,11),G(e,12));if(i>o)throw new Error(`cropAbif: range end ${i} exceeds the processed trace length ${o}`);let s=n.rawTrace??"omit",a=[];for(let c of e.entries)c.tagName==="DATA"&&c.tagNumber>=9&&c.tagNumber<=12?a.push(Ne(c,r,i)):c.tagName==="DATA"&&c.tagNumber>=1&&c.tagNumber<=8?s==="full"&&a.push({...c}):c.tagName==="PBAS"||c.tagName==="PCON"||c.tagName==="PLOC"||a.push({...c});for(let c of we(e))a.push(...Re(e,c,r,i));return {version:e.version,tdir:e.tdir,entries:a,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function G(e,t){return N(e,"DATA",t)?.elementCount??0}function Ne(e,t,n){if(e.elementSize!==2)throw new Error(`cropAbif: DATA${e.tagNumber} expected elementSize=2, got ${e.elementSize}`);let r=new Uint8Array(e.payload.subarray(t*2,n*2));return {tagName:"DATA",tagNumber:e.tagNumber,elementType:e.elementType,elementSize:2,elementCount:n-t,payload:r,dataHandle:e.dataHandle}}function we(e){let t=new Set;for(let n of e.entries)n.tagName==="PBAS"&&t.add(n.tagNumber);return Array.from(t).sort((n,r)=>n-r)}function Re(e,t,n,r){let i=P(e,t);if(i===void 0)return [];let o=z(e,t);if(o===void 0)throw new Error(`cropAbif: PBAS${t} has no PLOC${t} to crop by`);if(o.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PLOC${t} length mismatch (${i.length} vs ${o.length})`);let s=v(e,t);if(s!==void 0&&s.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PCON${t} length mismatch`);let a=[];for(let f=0;f<o.length;f++)o[f]>=n&&o[f]<r&&a.push(f);let c=a.map(f=>i[f]).join(""),u=a.map(f=>o[f]-n),d=[{tagName:"PBAS",tagNumber:t,elementType:2,elementSize:1,elementCount:c.length,payload:I(c),dataHandle:0},{tagName:"PLOC",tagNumber:t,elementType:4,elementSize:2,elementCount:u.length,payload:Ee(u),dataHandle:0}];if(s!==void 0){let f=a.map(g=>s[g]);d.push({tagName:"PCON",tagNumber:t,elementType:2,elementSize:1,elementCount:f.length,payload:Uint8Array.from(f),dataHandle:0});}return d}function Ee(e){let t=new Uint8Array(e.length*2),n=w(t);for(let r=0;r<e.length;r++)n.setUint16(r*2,Math.max(0,Math.min(65535,e[r])),false);return t}var Te={1:"byte",2:"char",3:"word",4:"short",5:"long",7:"float",8:"double",10:"date",11:"time",12:"thumb",13:"bool",18:"pString",19:"cString",1023:"tdir"};function J(e){return Te[e]??(e>=1024?`user${e}`:`type${e}`)}function Fe(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function Le(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function ae(e){let t=e.subarray(0,16),n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${n}${e.byteLength>16?" \u2026":""}]`}function Z(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function q(e,t,n,r){let i=Math.max(0,Math.min(t,Math.floor(e/n))),o=[];for(let s=0;s<i;s++)o.push(r(s*n));return o.length===1?{kind:"number",value:o[0]}:{kind:"numbers",value:o}}function ce(e,t,n){let r=w(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:U(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return q(n.byteLength,t,2,i=>r.getUint16(i,false));case 4:return q(n.byteLength,t,2,i=>r.getInt16(i,false));case 5:return q(n.byteLength,t,4,i=>r.getInt32(i,false));case 7:return q(n.byteLength,t,4,i=>r.getFloat32(i,false));case 8:return q(n.byteLength,t,8,i=>r.getFloat64(i,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let i=r.getInt16(0,false),o=r.getUint8(2),s=r.getUint8(3);return {kind:"date",value:{year:i,month:o,day:s}}}case 11:return n.byteLength<4?{kind:"unknown",value:n}:{kind:"time",value:{hour:r.getUint8(0),minute:r.getUint8(1),second:r.getUint8(2),hsec:r.getUint8(3)}};case 13:{let i=[];for(let o=0;o<Math.min(t,n.byteLength);o++)i.push(r.getUint8(o)!==0);return {kind:"bools",value:i}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let i=r.getUint8(0);return {kind:"string",value:U(F(n,1,Math.min(i,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function Ue(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return Fe(e.value);case "string":return Le(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:n,month:r,day:i}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(i).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:i}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(i).padStart(2,"0")}`}case "bytes":return `${J(t)} ${ae(e.value)}`;case "unknown":return `${J(t)} ${ae(e.value)}`}}function Et(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=se(n),i=r.entries.map(m=>{let p=m.tagName==="PCON"&&m.elementSize===1?ce(1,m.elementCount,m.payload):ce(m.elementType,m.elementCount,m.payload);return {tag:m.tagName,tagNumber:m.tagNumber,elementType:m.elementType,elementTypeName:J(m.elementType),elementSize:m.elementSize,elementCount:m.elementCount,rawElementCount:m.raw?.elementCount??m.elementCount,dataSize:m.raw?.dataSize??m.elementCount*m.elementSize,dataOffset:m.raw?.dataOffset??-1,inline:m.raw?.inline??m.elementCount*m.elementSize<=4,decoded:p,preview:Ue(p,m.elementType)}}),o=X(r);K(o)||(o="GATC");let s={},a={A:[],C:[],G:[],T:[]},c={A:[],C:[],G:[],T:[]},u={comments:[]},d={},f={},g={},l=m=>o[m];for(let m=0;m<r.entries.length;m++){let p=r.entries[m],A=i[m].decoded;if(p.tagName==="DATA"){let b=Z(A);b&&(s[p.tagNumber]=b,p.tagNumber>=1&&p.tagNumber<=4?a[l(p.tagNumber-1)]=b:p.tagNumber>=9&&p.tagNumber<=12&&(c[l(p.tagNumber-9)]=b));}else if(p.tagName==="PBAS"&&A.kind==="string")d[p.tagNumber]=A.value;else if(p.tagName==="PCON"){let b=p.elementSize===1?Array.from(p.payload.subarray(0,p.elementCount)):Z(A);b&&(f[p.tagNumber]=b);}else if(p.tagName==="PLOC"){let b=Z(A);b&&(g[p.tagNumber]=b.map(Y=>Y<0?Y+65536:Y));}else if(p.tagName==="SPAC")if(p.elementSize===4&&p.payload.byteLength>=4){let b=w(p.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(u.samplingRate=b);}else A.kind==="number"&&(u.samplingRate=A.value);else if(p.tagName==="SMPL"&&A.kind==="string")u.sampleName=A.value;else if(p.tagName==="LANE"&&A.kind==="number")u.laneNumber=A.value;else if(p.tagName==="TUBE"&&A.kind==="string")u.tube=A.value;else if(p.tagName==="MCHN"&&A.kind==="string")u.machineName=A.value;else if(p.tagName==="MODL"&&A.kind==="string")u.machineModel=A.value;else if(p.tagName==="RUND"&&A.kind==="date"){let b=A.value;u.runDate=`${b.year}-${String(b.month).padStart(2,"0")}-${String(b.day).padStart(2,"0")}`;}else if(p.tagName==="RUNT"&&A.kind==="time"){let b=A.value;u.runTime=`${String(b.hour).padStart(2,"0")}:${String(b.minute).padStart(2,"0")}:${String(b.second).padStart(2,"0")}`;}else p.tagName==="CMNT"&&A.kind==="string"?u.comments.push(A.value):p.tagName==="RevC"&&p.tagNumber===1&&(A.kind==="number"?u.reverseComplemented=A.value!==0:A.kind==="numbers"&&(u.reverseComplemented=A.value.some(b=>b!==0)));}let h=Object.keys(d).map(Number).sort((m,p)=>m-p).map(m=>({version:m,role:m===1?"edited":m===2?"called":"unknown",sequence:d[m],confidences:f[m]??[],positions:g[m]??[]})),S,C=2 in d?2:1 in d?1:Object.keys(d).map(Number)[0];if(C!==void 0&&d[C]!==void 0){let m=d[C].toUpperCase(),p=f[C]??[];p.length!==m.length&&(p=Object.keys(f).map(Number).map(b=>f[b]).find(b=>b.length===m.length)??[]);let A=g[C]??[];A.length!==m.length&&(A=Object.keys(g).map(Number).map(b=>g[b]).find(b=>b.length===m.length)??[]),S={sequence:m,confidences:p,positions:A,pbasVersion:C};}if(!Number.isFinite(u.samplingRate)||(u.samplingRate??0)<=0){let m=S?.positions,p=Math.max(c.A.length,c.C.length,c.G.length,c.T.length);m&&m.length>1?u.samplingRate=(m[m.length-1]-m[0])/(m.length-1):S&&S.sequence.length>0&&p>0&&(u.samplingRate=p/S.sequence.length);}let R={baseOrder:o,dataChannels:s,data1To4:a,data9To12:c};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:u,chromatogram:R,baseCalls:S,baseCallVariants:h,entries:i}}function Tt(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function Ft(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function kt(e,t){k(e,"PBAS",2,I(t),{elementType:2,elementSize:1,elementCount:t.length});}function Ot(e,t){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=Math.max(0,Math.min(255,Math.round(t[r])));k(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function Dt(e,t){let n=new Uint8Array(t.length*2),r=w(n);for(let i=0;i<t.length;i++)r.setUint16(i*2,Math.max(0,Math.min(65535,t[i])),false);k(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function Mt(e,t,n){let r=new Uint8Array(4);w(r).setFloat32(0,t,false),k(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let i=I(n),o=Math.min(255,i.length),s=new Uint8Array(1+o);s[0]=o,s.set(i.subarray(0,o),1),k(e,"SPAC",2,s,{elementType:18,elementSize:1,elementCount:1+o});let a=new Uint8Array(4);w(a).setFloat32(0,t,false),k(e,"SPAC",3,a,{elementType:7,elementSize:4,elementCount:1});}function qt(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function Pt(e){if(!B(e))for(let t=1;t<=4;t++){let n=N(e,"DATA",t);if(!n)continue;let r=8+t;N(e,"DATA",r)||Q(e.entries,{tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}function x(e,t,n){return t?{id:e,description:t,sequence:n}:{id:e,sequence:n}}function D(e){let t=typeof e=="string"?e:new TextDecoder().decode(e);return t.charCodeAt(0)===65279&&(t=t.slice(1)),t}function y(e){return D(e).split(/\r\n|\r|\n/)}function T(e){return e.replace(/\s+/g,"")}function L(e){return e.trim().length===0}function O(e){let t=e.trim(),n=t.search(/\s/);return n<0?t:t.slice(0,n)}function _t(e){let t=[],n=null,r="",i=[],o=0,s=0,a=()=>{n&&r&&i.length>0&&t.push(x(r,n,T(i.join("")))),n=null,r="",i=[],o=0,s=0;},c=(u,d,f)=>{a();let g=u.trim().split(/\s+/);n=d,r=f(g[1]??""),s=/^\d+$/.test(g[2]??"")?Number.parseInt(g[2],10):Number.POSITIVE_INFINITY;};for(let u of y(e)){if(/^CO\s/.test(u)){c(u,"consensus",f=>`Contig${f}`);continue}if(/^RD\s/.test(u)){c(u,"read",f=>f);continue}if(n===null)continue;if(L(u)||o>=s){a();continue}let d=T(u);i.push(d),o+=d.length,o>=s&&a();}return a(),t}var Ie=128,V=8192;function Yt(e){if(H(e,0,"ABIF")||H(e,Ie,"ABIF"))return "abif";if(H(e,0,".scf"))return "scf";if(H(e,0,"BAM"))return "bam";let t=De(e);if(t===void 0)return "unknown";let n=ke(t),r=n==="clustal"&&!ue.test(t.trimStart());return (n==="unknown"||r)&&$e(e)?"msf":n}function $e(e){let t=e.length>V?e.subarray(0,V):e,n=D(t),r=/\bMSF:\s*\d+\b[^\n]*\bCheck:\s*\d/.test(n)&&/^\s*Name:\s+.*\bLen:\s*\d/im.test(n),i=/^\s*Name:\s+\S+\s+Len:\s*\d+\s+Check:\s*\d+\s+Weight:/im.test(n);return r||i}var ue=/^(CLUSTAL|MUSCLE|MAFFT|T-?COFFEE|PROBCONS|KALIGN|MVIEW|PROMALS)\b/i;function ke(e){let t=e.trimStart();if(/^LOCUS\s/.test(t))return "genbank";if(/^ID\s/.test(t))return /(Reviewed|Unreviewed);| AA\.\s*$/.test(t)?"swissprot":"embl";if(/^#\s*STOCKHOLM/i.test(t))return "stockholm";if(/^#NEXUS/i.test(t))return "nexus";if(/^#mega\b/i.test(t))return "mega";if(/^HEADER\s{2,}/.test(t)||/^(ATOM|HETATM)\s+\d+\s/.test(t)||/^MODEL\s+\d/.test(t)||/^CRYST1\s/.test(t))return "pdb";if(/^AS\s+\d+\s+\d+\s*$/.test(t))return "ace";if(ue.test(t)||/multiple (sequence )?alignment/i.test(t)&&!/^[>@#]/.test(t)&&!/genedoc/i.test(t))return "clustal";if(/^!!(NA|AA)_MULTIPLE_ALIGNMENT/i.test(t)||/\bMSF:\s*\d/.test(t))return "msf";if(/^\d+\s+\d+\s*$/.test(t))return "phylip";if(/^##gff-version/i.test(t))return "gff";if(/^H\t(?:[^\t]*\t)*VN:Z:[12]\./.test(t))return "gfa";if(/^@(HD|SQ|RG|PG|CO)\t/.test(t))return "sam";if(/^>(P1|F1|DL|DC|RL|RC|N1|N3|XX);/i.test(t))return "pir";switch(t.charCodeAt(0)){case 62:case 59:return "fasta";case 64:return "fastq"}return Oe(t)?"sam":/^S\t[!-~]+\t/.test(t)?"gfa":"unknown"}function Oe(e){let t=e.split(" ");if(t.length<11)return false;let[,n,,r,i,o]=t;return /^\d+$/.test(n)&&/^\d+$/.test(r)&&/^\d+$/.test(i)&&/^(\*|(\d+[MIDNSHPX=])+)$/.test(o)}function De(e){let t=e.length>V?e.subarray(0,V):e;for(let n of D(t).split(/\r\n|\r|\n/))if(n.trim().length>0)return n}function H(e,t,n){if(e.length<t+n.length)return false;for(let r=0;r<n.length;r++)if(e[t+r]!==n.charCodeAt(r))return false;return true}function Jt(e){return fe(e,"embl")}function en(e){return fe(e,"swissprot")}function fe(e,t){let n=y(e),r=[],i=false,o="",s="",a=[],c=[],u="header",d=()=>{i&&(r.push(x(Me(t,o,s),a.join(" ").trim(),T(c.join("")))),i=false,o="",s="",a=[],c=[],u="header");};for(let f of n){if(f.startsWith("//")){d();continue}if(u==="sequence"){if(f.length===0||/^\s/.test(f)){c.push(f.replace(/[\s\d]/g,""));continue}u="header";}let g=f.slice(0,2);g==="ID"?(i&&d(),i=true,o=f.slice(2).trim()):g==="AC"?(s||(s=f.slice(2).split(";")[0].trim()),i=true):g==="DE"?(a.push(f.slice(2).trim()),i=true):g==="SQ"&&(u="sequence",i=true);}return d(),r}function Me(e,t,n){if(e==="swissprot")return n||O(t);let r=t.split(";"),i=O(r[0]),o="";for(let s of r){let a=/^\s*SV\s+(\d+)/.exec(s);a&&(o=a[1]);}return (o?`${i}.${o}`:i)||n}var le=93,ee=33,de=60,qe=255;function ge(e){let t=y(e),n=[],r,i=[],o=()=>{r!==void 0&&n.push(Pe(r,i.join("")));};for(let s of t)if(s[0]===">")o(),r=s.slice(1),i=[];else {if(L(s)||s[0]===";")continue;if(r===void 0)continue;i.push(s);}return o(),n}function rn(e){let t=y(e),n=[],r=0;for(;r<t.length;){if(L(t[r])||t[r][0]!=="@"){r++;continue}let i=t[r].slice(1);r++;let o=[];for(;r<t.length&&t[r][0]!=="+"&&t[r][0]!=="@";)o.push(t[r]),r++;let s=T(o.join(""));if(r>=t.length||t[r][0]==="@"){n.push(me(i,s,""));continue}r++;let a="";for(;r<t.length&&a.length<s.length&&!(t[r][0]==="@"&&ve(t,r));)a+=T(t[r]),r++;n.push(me(i,s,a));}return n}function on(e,t){let n=t?.lineWidth??de;return re(e).map(r=>`${te(">",r.id,r.description)}
2
+ ${Be(r.sequence,n)}`).join("")}function sn(e){return re(e).map(ze).join("")}function an(e,t){let n=t?.lineWidth??de;return re(e).map(r=>`${te(">",r.id,r.description)}
3
+ ${Ge(r.qualities,n)}`).join("")}function cn(e){return !!e&&e.length>0&&!e.every(t=>t===qe)}function Pe(e,t){let{id:n,description:r}=pe(e),i=T(t);return r===void 0?{id:n,sequence:i}:{id:n,description:r,sequence:i}}function me(e,t,n){let{id:r,description:i}=pe(e),o=new Array(t.length);for(let s=0;s<t.length;s++){let a=s<n.length?n.charCodeAt(s):ee;o[s]=ne(a-ee);}return i===void 0?{id:r,sequence:t,qualities:o}:{id:r,description:i,sequence:t,qualities:o}}function pe(e){let t=e.trim(),n=t.search(/\s/);return n<0?{id:t}:{id:t.slice(0,n),description:t.slice(n+1).trim()||void 0}}function ve(e,t){let n=t+1;for(;n<e.length&&e[n][0]!=="+"&&e[n][0]!=="@";)n++;return e[n]?.[0]==="+"}function ze(e){let{id:t,description:n,sequence:r,qualities:i}=e;if(i.length!==r.length)throw new Error(`FASTQ ${t}: ${i.length} quality scores for ${r.length} bases`);let o=i.map(He).join("");return `${te("@",t,n)}
4
4
  ${r}
5
5
  +
6
6
  ${o}
7
- `}function ee(e,t,n){let r=n?`${t} ${n}`:t;if(r.includes(`
8
- `))throw new Error("FASTX header must not contain a newline");return e+r}function ze(e,t){if(e.length===0)return "";if(t<=0||e.length<=t)return `${e}
7
+ `}function te(e,t,n){let r=n?`${t} ${n}`:t;if(r.includes(`
8
+ `))throw new Error("FASTX header must not contain a newline");return e+r}function Be(e,t){if(e.length===0)return "";if(t<=0||e.length<=t)return `${e}
9
9
  `;let n="";for(let r=0;r<e.length;r+=t)n+=`${e.slice(r,r+t)}
10
- `;return n}function Me(e,t){if(e.length===0)return "";let n=e.map(te),r=t<=0?n.length:t,i="";for(let o=0;o<n.length;o+=r)i+=`${n.slice(o,o+r).join(" ")}
11
- `;return i}function te(e){let t=Math.round(e);return t<0?0:t>le?le:t}function ve(e){return String.fromCharCode(te(e)+J)}function ne(e){return Array.isArray(e)?e:[e]}var Pe=/^([A-Za-z][A-Za-z0-9_]*)/;function Zt(e){let t=x(e),n=[],r=false,i="",o="",a="",s=[],c=[],m="header",d=()=>{if(!r)return;let u=a||o||i;n.push(F(u,s.join(" ").trim(),E(c.join("")))),r=false,i=o=a="",s=[],c=[],m="header";};for(let u of t){if(u.startsWith("//")){d();continue}let p=u.length>0&&!/^\s/.test(u);if(m==="origin")if(p)m="header";else {c.push(u.replace(/[\s\d]/g,""));continue}if(m==="definition"&&!p){s.push(u.trim());continue}if(!p)continue;let l=(Pe.exec(u)?.[1]??"").toUpperCase(),h=u.slice(l.length).trim();l==="LOCUS"&&r&&d(),r=true,m="header",l==="LOCUS"?i=k(h):l==="ACCESSION"?o=k(h):l==="VERSION"?a=k(h):l==="DEFINITION"?(s=[h],m="definition"):l==="ORIGIN"&&(m="origin");}return d(),n}function Be(e){let t=[];for(let n of x(e)){if(n.charCodeAt(0)!==83||n.charCodeAt(1)!==9)continue;let r=n.split(" "),i=r[1];if(!i)continue;let o=/^\d+$/.test(r[2]??"")&&r[3]!==void 0?r[3]:r[2];!o||o==="*"||t.push(F(i,"",o));}return t}function cn(e){let t=x(e),n=t.findIndex(r=>/^##FASTA\s*$/i.test(r.trim()));return n<0?[]:de(t.slice(n+1).join(`
12
- `))}var O=class{constructor(){this.order=[];this.blocks=new Map;}add(t,n){let r=this.blocks.get(t);r?r.push(n):(this.blocks.set(t,[n]),this.order.push(t));}toRecords(){return this.order.map(t=>F(t,"",E((this.blocks.get(t)??[]).join(""))))}},Ge=/^[A-Za-z0-9.*?~-]+$/;function gn(e){let t=new O,n=false;for(let r of x(e)){if(L(r)||/^\s/.test(r)||!n&&(n=true,/multiple (sequence )?alignment/i.test(r)||/^(CLUSTAL|MUSCLE|MAFFT|T-?COFFEE|PROBCONS|KALIGN|MVIEW|PROMALS)/i.test(r)))continue;let i=/^(\S+)\s+(\S+)/.exec(r);i&&Ge.test(i[2])&&t.add(i[1],i[2]);}return t.toRecords()}function pn(e){let t=[],n=new O;for(let r of x(e)){if(r.startsWith("//")){t.push(...n.toRecords()),n=new O;continue}if(L(r)||r.startsWith("#"))continue;let i=/^(\S+)\s+(\S+)/.exec(r);i&&n.add(i[1],i[2]);}return t.push(...n.toRecords()),t}function hn(e){let t=x(e),n=0;for(;n<t.length&&L(t[n]);)n++;let r=(t[n]??"").trim().split(/\s+/),i=Number.parseInt(r[0]??"",10),o=Number.parseInt(r[1]??"",10);if(!Number.isFinite(i)||i<=0)return [];n++;let a=[],s=[];for(;n<t.length&&a.length<i;n++){if(L(t[n]))continue;let d=/^(\S+)\s+(.*)$/.exec(t[n]);d&&(a.push(d[1]),s.push(d[2].replace(/\s+/g,"")));}let c=a.length;if(c===0)return [];let m=Number.isFinite(o)&&o>0?o:Number.POSITIVE_INFINITY;for(let d=0;n<t.length;n++){if(L(t[n]))continue;let u=d%c;s[u].length<m&&(s[u]+=t[n].replace(/\s+/g,"")),d++;}return a.map((d,u)=>F(d,"",m===Number.POSITIVE_INFINITY?s[u]:s[u].slice(0,m)))}function bn(e){let t=z(e).replace(/\[[^\]]*\]/g,""),n=new O,r=false;for(let i of t.split(/\r\n|\r|\n/)){if(!r){/^\s*matrix\b/i.test(i)&&(r=true);continue}let o=i.trim();if(o===";")break;if(L(o))continue;let a=o.endsWith(";"),s=a?o.slice(0,-1).trim():o,c=/^("[^"]+"|'[^']+'|\S+)\s+(.+)$/.exec(s);if(c&&n.add(c[1].replace(/^['"]|['"]$/g,""),c[2].replace(/\s+/g,"")),a)break}return n.toRecords()}function An(e){let t=new O,n=false;for(let r of x(e)){if(!n){r.trimStart().startsWith("//")&&(n=true);continue}if(L(r))continue;let i=/^\s*(\S+)\s+(.+)$/.exec(r);i&&t.add(i[1],i[2].replace(/\s+/g,""));}return t.toRecords()}function Cn(e){let t=[],n,r="",i=[],o=false,a=()=>{if(n===void 0)return;let s=E(i.join(""));s.endsWith("*")&&(s=s.slice(0,-1)),t.push(F(n,r,s)),n=void 0,r="",i=[],o=false;};for(let s of x(e))if(s.startsWith(">")){a();let c=s.slice(1),m=c.indexOf(";");n=(m>=0?c.slice(m+1):c).trim(),o=true;}else {if(n===void 0)continue;o?(r=s.trim(),o=false):i.push(s);}return a(),t}function _(e){return (e&2304)!==0}function H(e,t){if(t&1){if(t&64)return `${e}/1`;if(t&128)return `${e}/2`}return e}function W(e,t,n){return n&4||!e||e==="*"?"unmapped":`${e}:${t} (${n&16?"-":"+"})`}var Ve="=ACMGRSVTWYHKDBN",pe=32;function _e(e){let t=[];if(!(e[0]===66&&e[1]===65&&e[2]===77&&e[3]===1))return t;let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=new TextDecoder,i=(o,a)=>r.decode(e.subarray(o,o+Math.max(0,a-1)));try{let o=e.length,a=4;if(a+4>o)return t;let s=n.getInt32(a,!0);if(a+=4,s<0||a+s+4>o)return t;a+=s;let c=n.getInt32(a,!0);if(a+=4,c<0)return t;let m=[];for(let d=0;d<c;d++){if(a+4>o)return t;let u=n.getInt32(a,!0);if(a+=4,u<=0||a+u+4>o)return t;m.push(i(a,u)),a+=u+4;}for(;a+4<=e.length;){let d=n.getInt32(a,!0);if(a+=4,d<pe||a+d>e.length)break;let u=a+d,p=n.getInt32(a,!0),l=n.getInt32(a+4,!0),h=n.getUint8(a+8),y=n.getUint16(a+12,!0),S=n.getUint16(a+14,!0),w=n.getInt32(a+16,!0),f=a+pe,g=i(f,h);f+=h+y*4;let A=w+1>>1;if(w>0&&f+A<=u&&!_(S)){let b=p>=0&&p<m.length?m[p]:"*";t.push(F(H(g,S),W(b,l+1,S),He(e,f,w)));}a=u;}}catch{}return t}function He(e,t,n){let r="";for(let i=0;i<n;i++){let o=e[t+(i>>1)];r+=Ve[i&1?o&15:o>>4];}return r}function We(e){let t=[];for(let n of x(e)){if(n.length===0||n.charCodeAt(0)===64)continue;let r=n.split(" ");if(r.length<11)continue;let i=r[9];if(!i||i==="*")continue;let o=he(r[1]);_(o)||t.push(F(H(r[0],o),W(r[2],he(r[3]),o),i));}return t}function he(e){let t=Number.parseInt(e,10);return Number.isFinite(t)?t:0}
13
- exports.ENTRY_SIZE=R;exports.HEADER_SIZE=D;exports.MAX_PHRED=le;exports.averagePeakSpacing=Et;exports.channelMaxLength=yt;exports.cropAbif=mt;exports.dataChannelRole=tt;exports.detectFormat=kt;exports.ensureRawDataChannels=Lt;exports.findEntries=Ke;exports.findEntry=N;exports.formatFasta=_t;exports.formatFastq=Ht;exports.formatQual=Wt;exports.getChannelMap=rt;exports.getConfidences=ot;exports.getConfidencesForVersion=v;exports.getDataChannel=et;exports.getFwo=Q;exports.getPositions=at;exports.getPositionsForVersion=P;exports.getReverseComplemented=nt;exports.getSamplingRate=st;exports.getSequence=it;exports.getSequenceForVersion=M;exports.hasData9To12Block=B;exports.hasSignals=At;exports.hasUsableQuality=jt;exports.insertEntrySorted=Y;exports.isFwoPermutation=K;exports.makeSeqRecord=F;exports.parseAbif=bt;exports.parseBam=_e;exports.parseClustal=gn;exports.parseEmbl=vt;exports.parseFasta=de;exports.parseFastq=Vt;exports.parseGenbank=Zt;exports.parseGfa=Be;exports.parseGff=cn;exports.parseMsf=An;exports.parseNexus=bn;exports.parsePhylip=hn;exports.parsePir=Cn;exports.parseSam=We;exports.parseStockholm=pn;exports.parseSwissprot=Pt;exports.readAbif=oe;exports.setAveragePeakSpacing=Tt;exports.setConfidences=Rt;exports.setPositions=Ft;exports.setSequence=wt;exports.tagNameFromInt32=be;exports.upsertEntry=I;exports.writeAbif=Qe;//# sourceMappingURL=index.js.map
10
+ `;return n}function Ge(e,t){if(e.length===0)return "";let n=e.map(ne),r=t<=0?n.length:t,i="";for(let o=0;o<n.length;o+=r)i+=`${n.slice(o,o+r).join(" ")}
11
+ `;return i}function ne(e){let t=Math.round(e);return t<0?0:t>le?le:t}function He(e){return String.fromCharCode(ne(e)+ee)}function re(e){return Array.isArray(e)?e:[e]}var Ve=/^([A-Za-z][A-Za-z0-9_]*)/;function dn(e){let t=y(e),n=[],r=false,i="",o="",s="",a=[],c=[],u="header",d=()=>{if(!r)return;let f=s||o||i;n.push(x(f,a.join(" ").trim(),T(c.join("")))),r=false,i=o=s="",a=[],c=[],u="header";};for(let f of t){if(f.startsWith("//")){d();continue}let g=f.length>0&&!/^\s/.test(f);if(u==="origin")if(g)u="header";else {c.push(f.replace(/[\s\d]/g,""));continue}if(u==="definition"&&!g){a.push(f.trim());continue}if(!g)continue;let l=(Ve.exec(f)?.[1]??"").toUpperCase(),h=f.slice(l.length).trim();l==="LOCUS"&&r&&d(),r=true,u="header",l==="LOCUS"?i=O(h):l==="ACCESSION"?o=O(h):l==="VERSION"?s=O(h):l==="DEFINITION"?(a=[h],u="definition"):l==="ORIGIN"&&(u="origin");}return d(),n}function _e(e){let t=[];for(let n of y(e)){if(n.charCodeAt(0)!==83||n.charCodeAt(1)!==9)continue;let r=n.split(" "),i=r[1];if(!i)continue;let o=/^\d+$/.test(r[2]??"")&&r[3]!==void 0?r[3]:r[2];!o||o==="*"||t.push(x(i,"",o));}return t}function Nn(e){let t=y(e),n=t.findIndex(r=>/^##FASTA\s*$/i.test(r.trim()));return n<0?[]:ge(t.slice(n+1).join(`
12
+ `))}var $=class{constructor(){this.order=[];this.blocks=new Map;}add(t,n){let r=this.blocks.get(t);r?r.push(n):(this.blocks.set(t,[n]),this.order.push(t));}toRecords(){return this.order.map(t=>x(t,"",T((this.blocks.get(t)??[]).join(""))))}},We=/^[A-Za-z0-9.*?~-]+$/;function Fn(e){let t=new $,n=false;for(let r of y(e)){if(L(r)||/^\s/.test(r)||!n&&(n=true,/multiple (sequence )?alignment/i.test(r)||/^(CLUSTAL|MUSCLE|MAFFT|T-?COFFEE|PROBCONS|KALIGN|MVIEW|PROMALS)/i.test(r)))continue;let i=/^(\S+)\s+(\S+)/.exec(r);i&&We.test(i[2])&&t.add(i[1],i[2]);}return t.toRecords()}function Ln(e){let t=[],n=new $;for(let r of y(e)){if(r.startsWith("//")){t.push(...n.toRecords()),n=new $;continue}if(L(r)||r.startsWith("#"))continue;let i=/^(\S+)\s+(\S+)/.exec(r);i&&n.add(i[1],i[2]);}return t.push(...n.toRecords()),t}function Un(e){let t=y(e),n=0;for(;n<t.length&&L(t[n]);)n++;let r=(t[n]??"").trim().split(/\s+/),i=Number.parseInt(r[0]??"",10),o=Number.parseInt(r[1]??"",10);if(!Number.isFinite(i)||i<=0)return [];n++;let s=[],a=[];for(;n<t.length&&s.length<i;n++){if(L(t[n]))continue;let d=/^(\S+)\s+(.*)$/.exec(t[n]);d&&(s.push(d[1]),a.push(d[2].replace(/\s+/g,"")));}let c=s.length;if(c===0)return [];let u=Number.isFinite(o)&&o>0?o:Number.POSITIVE_INFINITY;for(let d=0;n<t.length;n++){if(L(t[n]))continue;let f=d%c;a[f].length<u&&(a[f]+=t[n].replace(/\s+/g,"")),d++;}return s.map((d,f)=>x(d,"",u===Number.POSITIVE_INFINITY?a[f]:a[f].slice(0,u)))}function In(e){let t=D(e).replace(/\[[^\]]*\]/g,""),n=new $,r=false;for(let i of t.split(/\r\n|\r|\n/)){if(!r){/^\s*matrix\b/i.test(i)&&(r=true);continue}let o=i.trim();if(o===";")break;if(L(o))continue;let s=o.endsWith(";"),a=s?o.slice(0,-1).trim():o,c=/^("[^"]+"|'[^']+'|\S+)\s+(.+)$/.exec(a);if(c&&n.add(c[1].replace(/^['"]|['"]$/g,""),c[2].replace(/\s+/g,"")),s)break}return n.toRecords()}function $n(e){let t=new $,n=false;for(let r of y(e)){if(!n){r.trimStart().startsWith("//")&&(n=true);continue}if(L(r))continue;let i=/^\s*(\S+)\s+(.+)$/.exec(r);if(!i)continue;let o=i[2].replace(/\s+/g,"");/\d/.test(o)||t.add(i[1],o);}return t.toRecords()}function kn(e){let t=new $,n,r=false,i=false,o=s=>{let a="";for(let c of s)i?c==='"'&&(i=false):c==='"'?i=true:a+=c;return a.replace(/\s+/g,"")};for(let s of y(e)){if(i){let c=o(s);n!==void 0&&c&&t.add(n,c);continue}let a=s.trim();if(a.length!==0){if(r){a.includes(";")&&(r=false);continue}if(!/^#mega\b/i.test(a)){if(a.startsWith("!")){a.includes(";")||(r=true);continue}if(a.startsWith("#")){let c=/^#(\S+)\s*(.*)$/.exec(a);if(c){n=c[1];let u=o(c[2]);u&&t.add(n,u);}}else if(n!==void 0){let c=o(a);c&&t.add(n,c);}}}}return t.toRecords()}var be={ALA:"A",ARG:"R",ASN:"N",ASP:"D",CYS:"C",GLN:"Q",GLU:"E",GLY:"G",HIS:"H",ILE:"I",LEU:"L",LYS:"K",MET:"M",PHE:"F",PRO:"P",SER:"S",THR:"T",TRP:"W",TYR:"Y",VAL:"V",MSE:"M",SEC:"U",PYL:"O",ASX:"B",GLX:"Z",UNK:"X",DA:"A",DC:"C",DG:"G",DT:"T",DU:"U",DI:"I",A:"A",C:"C",G:"G",U:"U",T:"T",I:"I",N:"N"};function je(e){return be[e.toUpperCase()]??"X"}function Ye(e){return e.length>=2&&Object.prototype.hasOwnProperty.call(be,e.toUpperCase())}function Qe(e){if(e.length>=20&&/^\d+$/.test(e.slice(7,10).trim())&&/^\d+$/.test(e.slice(13,17).trim())){let r=e.slice(19).trim().split(/\s+/).filter(Boolean);if(r.length>0)return {chain:e[11],codes:r}}let n=e.trim().split(/\s+/);return n.length>=5?{chain:n[2],codes:n.slice(4)}:null}function he(e,t,n){let r=e.map.get(t);r||(e.map.set(t,r=[]),e.order.push(t)),r.push(n);}function Pn(e){let t=y(e),n={order:[],map:new Map},r={order:[],map:new Map},i=new Set,o=false;for(let a of t)if(a.startsWith("SEQRES")){let c=Qe(a);if(c)for(let u of c.codes)he(n,c.chain,u);}else if(a.startsWith("ENDMDL"))o=true;else if(!o&&a.length>=27&&(a.startsWith("ATOM")||a.startsWith("HETATM"))){let c=a.slice(17,20).trim();if(a.startsWith("ATOM")||Ye(c)){let u=a[21],d=`${u}|${a.slice(22,27)}`;i.has(d)||(i.add(d),he(r,u,c));}}return [...n.order,...r.order.filter(a=>!n.map.has(a))].map(a=>{let c=n.map.get(a)??r.map.get(a)??[];return x(a.trim(),"",c.map(je).join(""))})}function Hn(e){let t=[],n,r="",i=[],o=false,s=()=>{if(n===void 0)return;let a=T(i.join(""));a.endsWith("*")&&(a=a.slice(0,-1)),t.push(x(n,r,a)),n=void 0,r="",i=[],o=false;};for(let a of y(e))if(a.startsWith(">")){s();let c=a.slice(1),u=c.indexOf(";");n=(u>=0?c.slice(u+1):c).trim(),o=true;}else {if(n===void 0)continue;o?(r=a.trim(),o=false):i.push(a);}return s(),t}function _(e){return (e&2304)!==0}function W(e,t){if(t&1){if(t&64)return `${e}/1`;if(t&128)return `${e}/2`}return e}function j(e,t,n){return n&4||!e||e==="*"?"unmapped":`${e}:${t} (${n&16?"-":"+"})`}var Xe="=ACMGRSVTWYHKDBN",Ae=32;function Ke(e){let t=[];if(!(e[0]===66&&e[1]===65&&e[2]===77&&e[3]===1))return t;let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=new TextDecoder,i=(o,s)=>r.decode(e.subarray(o,o+Math.max(0,s-1)));try{let o=e.length,s=4;if(s+4>o)return t;let a=n.getInt32(s,!0);if(s+=4,a<0||s+a+4>o)return t;s+=a;let c=n.getInt32(s,!0);if(s+=4,c<0)return t;let u=[];for(let d=0;d<c;d++){if(s+4>o)return t;let f=n.getInt32(s,!0);if(s+=4,f<=0||s+f+4>o)return t;u.push(i(s,f)),s+=f+4;}for(;s+4<=e.length;){let d=n.getInt32(s,!0);if(s+=4,d<Ae||s+d>e.length)break;let f=s+d,g=n.getInt32(s,!0),l=n.getInt32(s+4,!0),h=n.getUint8(s+8),S=n.getUint16(s+12,!0),C=n.getUint16(s+14,!0),R=n.getInt32(s+16,!0),m=s+Ae,p=i(m,h);m+=h+S*4;let A=R+1>>1;if(R>0&&m+A<=f&&!_(C)){let b=g>=0&&g<u.length?u[g]:"*";t.push(x(W(p,C),j(b,l+1,C),Ze(e,m,R)));}s=f;}}catch{}return t}function Ze(e,t,n){let r="";for(let i=0;i<n;i++){let o=e[t+(i>>1)];r+=Xe[i&1?o&15:o>>4];}return r}function Je(e){let t=[];for(let n of y(e)){if(n.length===0||n.charCodeAt(0)===64)continue;let r=n.split(" ");if(r.length<11)continue;let i=r[9];if(!i||i==="*")continue;let o=Se(r[1]);_(o)||t.push(x(W(r[0],o),j(r[2],Se(r[3]),o),i));}return t}function Se(e){let t=Number.parseInt(e,10);return Number.isFinite(t)?t:0}var et=128;function sr(e){let t=typeof e=="string"?new TextEncoder().encode(e):e;if(t.length<et)return [];let n=new DataView(t.buffer,t.byteOffset,t.byteLength);if(n.getUint32(0,false)!==779314022)return [];let r=n.getUint32(12,false),i=n.getUint32(24,false),o=String.fromCharCode(t[36],t[37],t[38],t[39]);if(r===0||i===0)return [];let s=[];if(Number.parseFloat(o)>=3){let c=i+r*8;for(let u=0;u<r&&c+u<t.length;u++)s.push(t[c+u]);}else for(let c=0;c<r;c++){let u=i+c*12+8;if(u>=t.length)break;s.push(t[u]);}let a=s.filter(c=>c>32&&c<127).map(c=>String.fromCharCode(c)).join("");return a.length===0?[]:[x(tt(t,n),"",a)]}function tt(e,t){let n=t.getUint32(28,false),r=t.getUint32(32,false);if(n===0||r===0||r+n>e.length)return "scf";let i="";for(let s=r;s<r+n;s++)i+=String.fromCharCode(e[s]);let o=/^NAME=(.+)$/im.exec(i);return o&&o[1].trim()||"scf"}
13
+ exports.ENTRY_SIZE=E;exports.HEADER_SIZE=M;exports.MAX_PHRED=le;exports.averagePeakSpacing=qt;exports.channelMaxLength=Ft;exports.cropAbif=Ct;exports.dataChannelRole=ft;exports.detectFormat=Yt;exports.ensureRawDataChannels=Pt;exports.findEntries=ot;exports.findEntry=N;exports.formatFasta=on;exports.formatFastq=sn;exports.formatQual=an;exports.getChannelMap=mt;exports.getConfidences=gt;exports.getConfidencesForVersion=v;exports.getDataChannel=ut;exports.getFwo=X;exports.getPositions=pt;exports.getPositionsForVersion=z;exports.getReverseComplemented=lt;exports.getSamplingRate=ht;exports.getSequence=dt;exports.getSequenceForVersion=P;exports.hasData9To12Block=B;exports.hasSignals=Tt;exports.hasUsableQuality=cn;exports.insertEntrySorted=Q;exports.isFwoPermutation=K;exports.makeSeqRecord=x;exports.parseAbif=Et;exports.parseAce=_t;exports.parseBam=Ke;exports.parseClustal=Fn;exports.parseEmbl=Jt;exports.parseFasta=ge;exports.parseFastq=rn;exports.parseGenbank=dn;exports.parseGfa=_e;exports.parseGff=Nn;exports.parseMega=kn;exports.parseMsf=$n;exports.parseNexus=In;exports.parsePdb=Pn;exports.parsePhylip=Un;exports.parsePir=Hn;exports.parseSam=Je;exports.parseScf=sr;exports.parseStockholm=Ln;exports.parseSwissprot=en;exports.readAbif=se;exports.setAveragePeakSpacing=Mt;exports.setConfidences=Ot;exports.setPositions=Dt;exports.setSequence=kt;exports.tagNameFromInt32=ye;exports.upsertEntry=k;exports.writeAbif=it;//# sourceMappingURL=index.js.map
14
14
  //# sourceMappingURL=index.js.map