@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 +104 -20
- package/dist/index.d.ts +104 -20
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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`)
|
|
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
|
-
|
|
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`)
|
|
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
|
-
|
|
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
|
-
${
|
|
3
|
-
${
|
|
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
|
|
8
|
-
`))throw new Error("FASTX header must not contain a newline");return e+r}function
|
|
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
|
|
11
|
-
`;return i}function
|
|
12
|
-
`))}var
|
|
13
|
-
exports.ENTRY_SIZE=
|
|
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
|