@cosyte/synth 0.0.3 → 0.0.4

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.
Files changed (49) hide show
  1. package/CHANGELOG.md +297 -0
  2. package/README.md +6 -2
  3. package/dist/astm/index.cjs +83 -42
  4. package/dist/astm/index.cjs.map +1 -1
  5. package/dist/astm/index.d.cts +1 -1
  6. package/dist/astm/index.d.ts +1 -1
  7. package/dist/astm/index.mjs +83 -42
  8. package/dist/astm/index.mjs.map +1 -1
  9. package/dist/ccda/index.cjs +89 -44
  10. package/dist/ccda/index.cjs.map +1 -1
  11. package/dist/ccda/index.d.cts +5 -3
  12. package/dist/ccda/index.d.ts +5 -3
  13. package/dist/ccda/index.mjs +89 -44
  14. package/dist/ccda/index.mjs.map +1 -1
  15. package/dist/deid/index.cjs +92 -13
  16. package/dist/deid/index.cjs.map +1 -1
  17. package/dist/deid/index.d.cts +1 -1
  18. package/dist/deid/index.d.ts +1 -1
  19. package/dist/deid/index.mjs +93 -14
  20. package/dist/deid/index.mjs.map +1 -1
  21. package/dist/fhir/index.cjs +78 -5
  22. package/dist/fhir/index.cjs.map +1 -1
  23. package/dist/fhir/index.mjs +78 -5
  24. package/dist/fhir/index.mjs.map +1 -1
  25. package/dist/hl7/index.cjs +89 -41
  26. package/dist/hl7/index.cjs.map +1 -1
  27. package/dist/hl7/index.d.cts +1 -1
  28. package/dist/hl7/index.d.ts +1 -1
  29. package/dist/hl7/index.mjs +89 -41
  30. package/dist/hl7/index.mjs.map +1 -1
  31. package/dist/index.cjs +91 -40
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.cts +126 -8
  34. package/dist/index.d.ts +126 -8
  35. package/dist/index.mjs +89 -41
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/ncpdp/index.cjs +56 -4
  38. package/dist/ncpdp/index.cjs.map +1 -1
  39. package/dist/ncpdp/index.mjs +56 -4
  40. package/dist/ncpdp/index.mjs.map +1 -1
  41. package/dist/{quirk-JLyO1Ncj.d.ts → quirk-C9t9CkPS.d.ts} +17 -6
  42. package/dist/{quirk-DmkgoZdh.d.cts → quirk-DYMDojVw.d.cts} +17 -6
  43. package/dist/x12/index.cjs +82 -13
  44. package/dist/x12/index.cjs.map +1 -1
  45. package/dist/x12/index.d.cts +2 -1
  46. package/dist/x12/index.d.ts +2 -1
  47. package/dist/x12/index.mjs +83 -14
  48. package/dist/x12/index.mjs.map +1 -1
  49. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/rng/splitmix32.ts","../../src/rng/sfc32.ts","../../src/rng/rng.ts","../../src/corpus.ts","../../src/safe/reserved.ts","../../src/safe/names-pool.ts","../../src/safe/providers.ts","../../src/safe/index.ts","../../src/ncpdp/identity.ts","../../src/ncpdp/example-codes.ts","../../src/ncpdp/script.ts","../../src/ncpdp/telecom.ts","../../src/ncpdp/round-trip.ts","../../src/ncpdp/index.ts"],"names":["phone","address","npi","dea","codedValue","decimalValue","buildNewRx","serializeScript","header","ScriptMessage","serializeTelecom","buildTelecomRequest","parseScript","parseTelecom"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `splitmix32` — a tiny, well-studied 32-bit mixing PRNG used **only** to expand a single integer\n * seed into the four 32-bit state words that seed {@link ../rng/sfc32.sfc32}. It is not the corpus\n * generator itself (that is `sfc32`); it exists so that a one-number seed deterministically produces a\n * well-distributed 128-bit `sfc32` state, avoiding the poor low-bit behavior of naive\n * `state = seed`-style initialization.\n *\n * Zero-dependency, `Math.random`-free (lint-enforced): the whole point of the library is that a seed —\n * and only the seed — determines the output, on any machine, any run.\n *\n * @module\n */\n\n/**\n * A stateful `splitmix32` step function. Each call advances the internal 32-bit state and returns the\n * next unsigned 32-bit integer. Deterministic for a given seed.\n *\n * @param seed - The 32-bit seed. Coerced to a 32-bit integer via `| 0`.\n * @returns A nullary function returning the next `uint32` in the stream.\n * @example\n * ```ts\n * import { splitmix32 } from \"@cosyte/synth\";\n * const next = splitmix32(12345);\n * const a = next(); // deterministic uint32\n * ```\n */\nexport function splitmix32(seed: number): () => number {\n let a = seed | 0;\n return function next(): number {\n a = (a + 0x9e3779b9) | 0;\n let t = a ^ (a >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t = t ^ (t >>> 15);\n t = Math.imul(t, 0x735a2d97);\n t = t ^ (t >>> 15);\n return t >>> 0;\n };\n}\n","/**\n * `sfc32` (Small Fast Counter, 32-bit, 128-bit state) — the deterministic, non-cryptographic PRNG that\n * drives every value `@cosyte/synth` generates. Chosen over `mulberry32` (whose author flags that it\n * skips ~1/3 of 32-bit outputs) and over a CSPRNG (`node:crypto`, which is **not seedable** and would\n * defeat reproducibility). A synthetic-fixture generator has **no secrets** — statistical quality plus\n * byte-for-byte reproducibility is exactly the right trade.\n *\n * The state is four 32-bit words. This module exposes the raw step function; {@link ../rng/rng.Rng}\n * wraps it with a seed-expansion ({@link ./splitmix32.splitmix32}) and the ergonomic draw helpers.\n *\n * @module\n */\n\n/**\n * The mutable four-word `sfc32` state. Threaded explicitly (never global) by {@link ../rng/rng.Rng}.\n */\nexport interface Sfc32State {\n /** State word `a`. */\n a: number;\n /** State word `b`. */\n b: number;\n /** State word `c`. */\n c: number;\n /** Counter word `d`. */\n d: number;\n}\n\n/**\n * Advance an {@link Sfc32State} in place by one step and return the next unsigned 32-bit integer.\n *\n * This is the canonical `sfc32` step. The state object is mutated (the counter `d` increments and the\n * mixing words rotate); callers that need reproducible independence hold their own state and never\n * share it — {@link ../rng/rng.Rng} creates a fresh state per seed so two runs from the same seed are\n * identical.\n *\n * @param s - The state to advance. Mutated in place.\n * @returns The next `uint32` in the stream.\n * @example\n * ```ts\n * import { sfc32Next, type Sfc32State } from \"@cosyte/synth\";\n * const s: Sfc32State = { a: 1, b: 2, c: 3, d: 4 };\n * const x = sfc32Next(s); // uint32\n * ```\n */\nexport function sfc32Next(s: Sfc32State): number {\n s.a |= 0;\n s.b |= 0;\n s.c |= 0;\n s.d |= 0;\n const t = (((s.a + s.b) | 0) + s.d) | 0;\n s.d = (s.d + 1) | 0;\n s.a = s.b ^ (s.b >>> 9);\n s.b = (s.c + (s.c << 3)) | 0;\n s.c = (s.c << 21) | (s.c >>> 11);\n s.c = (s.c + t) | 0;\n return t >>> 0;\n}\n","/**\n * `Rng` — the seeded, deterministic random source every `@cosyte/synth` provider draws from.\n *\n * **The reproducibility contract.** A seed — and only the seed — determines the output.\n * `createRng(seed)` expands the integer seed through {@link ./splitmix32.splitmix32} into the four\n * `sfc32` state words, then every draw advances that state via {@link ./sfc32.sfc32Next}. Two `Rng`s\n * created from the same seed emit the **identical** sequence on any machine, any run — the property\n * the parsers', `transform`'s, and `deid`'s regression suites depend on.\n *\n * **Explicit, never global.** An `Rng` is a value you thread through a build; there is no ambient\n * shared generator and **`Math.random` is lint-banned** in `src/` (it is not seedable — its seed is\n * engine-chosen and cannot be reset, so a corpus built on it is not reproducible). Because each\n * generation creates a fresh `Rng` from its seed, generations are independent and parallel-safe.\n *\n * The `Rng` object is stateful by nature (a PRNG advances). Immutability in this library lives where it\n * is testable and matters: the generated **artifacts and the `Corpus` are deep-frozen** (see\n * `../corpus.ts`). Determinism, not object-immutability, is the `Rng`'s guarantee.\n *\n * @module\n */\n\nimport { splitmix32 } from \"./splitmix32.js\";\nimport { sfc32Next, type Sfc32State } from \"./sfc32.js\";\n\n/**\n * A seeded, deterministic random source. Created via {@link createRng}; passed explicitly to every\n * provider. All draw methods advance the internal state deterministically.\n */\nexport interface Rng {\n /** The integer seed this generator was created from (part of the `Corpus` manifest). */\n readonly seed: number;\n /** The next unsigned 32-bit integer. */\n nextUint32(): number;\n /** The next float in `[0, 1)`. */\n float(): number;\n /**\n * A uniformly-distributed integer in the inclusive range `[min, max]`.\n *\n * @param min - Inclusive lower bound (integer).\n * @param max - Inclusive upper bound (integer, `>= min`).\n */\n int(min: number, max: number): number;\n /** `true` with probability `p` (default `0.5`). */\n bool(p?: number): boolean;\n /**\n * Pick one element from a non-empty array.\n *\n * @param items - A non-empty readonly array.\n */\n pick<T>(items: readonly T[]): T;\n /**\n * A string of `n` decimal digits (`0`–`9`), each drawn uniformly.\n *\n * @param n - The number of digits (`>= 0`).\n */\n digits(n: number): string;\n}\n\n/**\n * The concrete {@link Rng}. Holds the mutable `sfc32` state; every method advances it deterministically.\n */\nclass Sfc32Rng implements Rng {\n public readonly seed: number;\n readonly #state: Sfc32State;\n\n public constructor(seed: number) {\n this.seed = seed | 0;\n // Expand the single seed into four well-distributed state words. Seeding sfc32 directly from the\n // raw seed gives poor low-bit behavior; splitmix32 is the standard fix (bryc / roadmap §5).\n const mix = splitmix32(this.seed);\n this.#state = { a: mix(), b: mix(), c: mix(), d: mix() };\n // A short warm-up so nearby seeds diverge immediately.\n for (let i = 0; i < 8; i += 1) sfc32Next(this.#state);\n }\n\n public nextUint32(): number {\n return sfc32Next(this.#state);\n }\n\n public float(): number {\n return this.nextUint32() / 0x1_0000_0000;\n }\n\n public int(min: number, max: number): number {\n if (max < min) throw new RangeError(`Rng.int: max (${String(max)}) < min (${String(min)})`);\n const span = max - min + 1;\n return min + Math.floor(this.float() * span);\n }\n\n public bool(p = 0.5): boolean {\n return this.float() < p;\n }\n\n public pick<T>(items: readonly T[]): T {\n if (items.length === 0) throw new RangeError(\"Rng.pick: empty array\");\n // `int(0, length-1)` is always in-bounds on a non-empty array, so this access cannot be a hole;\n // the cast discharges `noUncheckedIndexedAccess`'s `T | undefined` without a runtime re-check.\n return items[this.int(0, items.length - 1)] as T;\n }\n\n public digits(n: number): string {\n let out = \"\";\n for (let i = 0; i < n; i += 1) out += String(this.int(0, 9));\n return out;\n }\n}\n\n/**\n * Create a seeded, deterministic {@link Rng}. The same `seed` yields the same sequence everywhere.\n *\n * @param seed - The integer seed. Coerced to a 32-bit integer.\n * @returns A fresh, independent {@link Rng}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * const rng = createRng(12345);\n * rng.int(1, 6); // deterministic for seed 12345\n * ```\n */\nexport function createRng(seed: number): Rng {\n return new Sfc32Rng(seed);\n}\n","/**\n * The `Corpus` abstraction — a seed plus a self-describing manifest of what was generated, so a\n * fixture set is itself reproducible and regenerable. A downstream repo pins a seed\n * and gets a stable fixture set that regenerates identically.\n *\n * Generated artifacts and the `Corpus` are **deep-frozen** — this is where the archetype's immutability\n * invariant lives in a generator: a consumer cannot mutate a shared fixture out from under\n * another test.\n *\n * @module\n */\n\n/** The format an artifact was generated for. */\nexport type SynthFormat = \"hl7v2\" | \"fhir\" | \"ccda\" | \"x12\" | \"ncpdp\" | \"astm\";\n\n/**\n * One generated artifact — the serialized wire text plus the metadata needed to reproduce and check\n * it. `warnings` records what the artifact's own parser reported on the round-trip (zero for a\n * spec-clean artifact).\n */\nexport interface Artifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** A format-specific kind label (e.g. `\"ADT^A01\"`). */\n readonly kind: string;\n /** The serialized wire text, produced by the parser's own conservative serializer. */\n readonly content: string;\n /** The warning codes the parser emitted when the artifact was round-tripped (empty = spec-clean). */\n readonly warnings: readonly string[];\n}\n\n/** A self-describing manifest of a {@link Corpus}. */\nexport interface CorpusManifest {\n /** The formats present in the corpus. */\n readonly formats: readonly SynthFormat[];\n /** Per-kind artifact counts (e.g. `{ \"ADT^A01\": 3 }`). */\n readonly counts: Readonly<Record<string, number>>;\n /** The quirk names applied. */\n readonly quirks: readonly string[];\n}\n\n/** A reproducible, self-describing set of generated artifacts. */\nexport interface Corpus {\n /** The seed the corpus was generated from — regenerating from it yields byte-identical artifacts. */\n readonly seed: number;\n /** The manifest describing what was generated. */\n readonly manifest: CorpusManifest;\n /** The generated artifacts, in generation order. */\n readonly artifacts: readonly Artifact[];\n}\n\n/**\n * Assemble a deep-frozen {@link Corpus} from a seed and its artifacts, deriving the manifest.\n *\n * @param seed - The seed the artifacts were generated from.\n * @param artifacts - The generated artifacts, in order.\n * @param quirks - The quirk names applied (default none).\n * @returns A deep-frozen, self-describing {@link Corpus}.\n * @example\n * ```ts\n * import { makeCorpus } from \"@cosyte/synth\";\n * const corpus = makeCorpus(1, [{ format: \"hl7v2\", kind: \"ADT^A01\", content, warnings: [] }]);\n * corpus.manifest.counts[\"ADT^A01\"]; // 1\n * ```\n */\nexport function makeCorpus(\n seed: number,\n artifacts: readonly Artifact[],\n quirks: readonly string[] = [],\n): Corpus {\n const counts: Record<string, number> = {};\n const formats = new Set<SynthFormat>();\n const frozenArtifacts = artifacts.map((a) => {\n counts[a.kind] = (counts[a.kind] ?? 0) + 1;\n formats.add(a.format);\n return Object.freeze({ ...a, warnings: Object.freeze([...a.warnings]) });\n });\n const manifest: CorpusManifest = Object.freeze({\n formats: Object.freeze([...formats]),\n counts: Object.freeze(counts),\n quirks: Object.freeze([...quirks]),\n });\n return Object.freeze({\n seed,\n manifest,\n artifacts: Object.freeze(frozenArtifacts),\n });\n}\n","/**\n * The reserved / never-collide identifier facts that make a `@cosyte/synth` value **provably\n * synthetic** — the ground truth behind the synthetic-safety invariant.\n *\n * These are **facts**, not copyrighted prose: authoritative ranges published by SSA, NANPA, and the\n * IETF that are guaranteed never to denote a real person or a real routable resource. Every provider\n * draws only from these; the predicates here are the executable half of the CI synthetic-safety gate —\n * they let a test assert that no emitted value falls **outside** a reserved source.\n *\n * Sources:\n * - **SSN** — SSA never issues area numbers `000`, `666`, or `900–999`; the `987-65-4320…4329` block\n * is SSA's explicitly-reserved advertising range. (ssa.gov)\n * - **Phone** — NANP reserves `555-0100…555-0199` as the fictional/non-working line range. (nanpa.com)\n * - **Email/domain** — RFC 2606 / RFC 6761 reserved: `example.com`/`.net`/`.org` and the `.example`,\n * `.test`, `.invalid`, `.localhost` TLDs.\n * - **IP** — RFC 5737 IPv4 TEST-NET-1/2/3 (`192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`) and\n * RFC 3849 IPv6 documentation prefix `2001:db8::/32`.\n * - **NPI** — a real National Provider Identifier is a 10-digit number whose last digit is a Luhn\n * check digit computed over the `80840` prefix + the 9-digit base (CMS NPI check-digit rule, ISO\n * 7812). A number whose check digit is **wrong** therefore cannot be a NPPES-issued NPI. `synth`\n * emits NPIs with a deliberately-invalid check digit, so no generated NPI can collide with a real\n * provider.\n *\n * @module\n */\n\n/**\n * The synthetic **assigning authority** `@cosyte/synth` mints MRNs / account / member identifiers\n * under. There is **no** reserved MRN range (an MRN is unique only within its assigning-authority /\n * OID namespace), so — a documented design decision — every synthetic identifier\n * is scoped to a namespace that clearly cannot be a real facility's: a `SYNTH`-labelled authority whose\n * OID lives under HL7's designated **example** root `2.16.840.1.113883.19`. A value under this AA can\n * never collide with a real record because the *namespace itself* is synthetic.\n */\nexport const SYNTHETIC_ASSIGNING_AUTHORITY = Object.freeze({\n /** The human-readable assigning-authority namespace id (HL7 HD.1). */\n namespaceId: \"COSYTE-SYNTH\",\n /** The universal id — an OID under HL7's example arc `2.16.840.1.113883.19` (HD.2). */\n universalId: \"2.16.840.1.113883.19.999\",\n /** The universal id type (HD.3). */\n universalIdType: \"ISO\",\n});\n\n/** RFC 2606 / 6761 reserved email domains `@cosyte/synth` draws from. */\nexport const RESERVED_EMAIL_DOMAINS: readonly string[] = Object.freeze([\n \"example.com\",\n \"example.org\",\n \"example.net\",\n]);\n\n/** RFC 5737 IPv4 documentation (TEST-NET) `/24` network prefixes. */\nexport const TEST_NET_V4_PREFIXES: readonly string[] = Object.freeze([\n \"192.0.2\", // TEST-NET-1\n \"198.51.100\", // TEST-NET-2\n \"203.0.113\", // TEST-NET-3\n]);\n\n/** RFC 3849 IPv6 documentation prefix. */\nexport const DOC_V6_PREFIX = \"2001:db8\";\n\n/**\n * The `80840` prefix prepended to a 10-digit NPI before the Luhn check (the CMS NPI check-digit\n * rule — `80840` is the ISO 7812 issuer identifier for the US health-application namespace). A real\n * NPI satisfies `luhn(\"80840\" + npi) ≡ 0 (mod 10)`.\n */\nexport const NPI_LUHN_PREFIX = \"80840\";\n\n/**\n * The Luhn sum (mod 10) of a numeric string, doubling every second digit from the right. Used to\n * verify (or deliberately break) an NPI check digit.\n *\n * @param digits - A string of decimal digits.\n * @returns The Luhn sum modulo 10 (0 ⇒ the string passes the Luhn check).\n * @internal\n */\nexport function luhnMod10(digits: string): number {\n let sum = 0;\n // Standard Luhn: the RIGHTMOST digit is never doubled; doubling starts one position in and\n // alternates. For a full payload+check string this makes a Luhn-valid string sum to 0 (mod 10);\n // for a payload with a `0` placeholder in the check position it yields the complement of the\n // correct check digit.\n let double = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let d = digits.charCodeAt(i) - 48;\n if (d < 0 || d > 9) continue;\n if (double) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n double = !double;\n }\n return sum % 10;\n}\n\n/**\n * The correct NPI check digit for a 9-digit base — the value that makes `80840` + base + check pass\n * the Luhn check.\n *\n * @param base9 - The 9-digit NPI base (positions 1–9).\n * @returns The check digit (`0`–`9`) a real NPI would carry for this base.\n * @example\n * ```ts\n * import { npiCheckDigit } from \"@cosyte/synth\";\n * npiCheckDigit(\"123456789\"); // 3 — so 1234567893 is a Luhn-valid NPI shape\n * ```\n */\nexport function npiCheckDigit(base9: string): number {\n // Luhn over \"80840\" + base9 with a trailing 0 check placeholder; the check digit closes the sum.\n const partial = luhnMod10(`${NPI_LUHN_PREFIX}${base9}0`);\n return (10 - partial) % 10;\n}\n\n/**\n * The DEA-registration prefix letters `@cosyte/synth` draws a synthetic DEA number's first character\n * from. A real DEA number is `<registrant-type><last-name-initial>` + 7 digits; the first letter is the\n * registrant type (A/B/F/G/M/P/R/X are the widely-published values; the second letter is the\n * registrant's last-name initial). These letters are a **fact** about the number's shape, not\n * copyrighted prose — they only shape the value; the synthetic guarantee is the deliberately-**invalid\n * checksum** (see {@link dea} / {@link isSyntheticDea}).\n */\nexport const DEA_REGISTRANT_TYPES: readonly string[] = Object.freeze([\n \"A\",\n \"B\",\n \"F\",\n \"G\",\n \"M\",\n \"P\",\n \"R\",\n \"X\",\n]);\n\n/**\n * The correct DEA check digit for a 7-digit numeric base. The published DEA checksum is\n * `(d1 + d3 + d5) + 2·(d2 + d4 + d6)`, whose **units digit** is the 7th (check) digit. A real DEA\n * number satisfies this; a number whose 7th digit differs cannot be a validly-issued DEA registration.\n *\n * @param base6 - The first 6 digits of the DEA number (positions 1–6).\n * @returns The check digit (`0`–`9`) a real DEA number would carry for this base.\n * @example\n * ```ts\n * import { deaCheckDigit } from \"@cosyte/synth\";\n * deaCheckDigit(\"123456\"); // the units digit of (1+3+5) + 2·(2+4+6)\n * ```\n */\nexport function deaCheckDigit(base6: string): number {\n let odd = 0;\n let even = 0;\n for (let i = 0; i < 6; i += 1) {\n const digit = base6.charCodeAt(i) - 48;\n if (i % 2 === 0) odd += digit;\n else even += digit;\n }\n return (odd + 2 * even) % 10;\n}\n\n/**\n * Whether a DEA number (`XX` + 7 digits, case-insensitive) is **provably synthetic** — its check digit\n * (the 7th digit) does **not** match the published DEA checksum, so it cannot be a validly-issued DEA\n * registration. A checksum-valid DEA number (which *could* denote a real prescriber) returns `false`; a\n * value that is not the DEA shape returns `false`.\n *\n * @param value - The candidate DEA number (with or without incidental separators).\n * @returns `true` when the DEA number's checksum is wrong (never a real DEA registration).\n * @example\n * ```ts\n * import { isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(\"AF1234561\"); // depends on the base — true when the 7th digit is wrong\n * ```\n */\nexport function isSyntheticDea(value: string): boolean {\n const compact = value.replace(/[\\s-]/g, \"\").toUpperCase();\n if (!/^[A-Z]{2}\\d{7}$/.test(compact)) return false;\n const digits = compact.slice(2);\n const check = digits.charCodeAt(6) - 48;\n return deaCheckDigit(digits.slice(0, 6)) !== check;\n}\n\n/**\n * Whether a 10-digit NPI is **provably synthetic** — i.e. its check digit is invalid, so it cannot be\n * a NPPES-issued NPI. A Luhn-valid 10-digit NPI (which *could* denote a real registered provider)\n * returns `false`; a non-10-digit value returns `false` (not an NPI shape).\n *\n * @param value - The candidate NPI (digits only, or with incidental separators).\n * @returns `true` when the NPI's check digit is wrong (never a real NPI).\n * @example\n * ```ts\n * import { isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(\"1234567894\"); // true — invalid check digit (valid would be 1234567893)\n * isSyntheticNpi(\"1234567893\"); // false — Luhn-valid, could be a real NPI\n * ```\n */\nexport function isSyntheticNpi(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 10) return false;\n return luhnMod10(`${NPI_LUHN_PREFIX}${digits}`) !== 0;\n}\n\n/**\n * Whether a `ddd-dd-dddd` (or `ddddddddd`) SSN string is drawn from an SSA never-issued / reserved\n * space — area `000`, `666`, or `900–999`. A real, issuable SSN returns `false`.\n *\n * @param value - The candidate SSN (dashes optional).\n * @returns `true` when the SSN is provably synthetic.\n * @example\n * ```ts\n * import { isSyntheticSsn } from \"@cosyte/synth\";\n * isSyntheticSsn(\"900-12-3456\"); // true (never issued)\n * isSyntheticSsn(\"123456789\"); // false (issuable area 123)\n * ```\n */\nexport function isSyntheticSsn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n const area = Number(digits.slice(0, 3));\n return area === 0 || area === 666 || area >= 900;\n}\n\n/**\n * Whether a phone string contains the NANP `555-0100…555-0199` reserved fictional line range.\n *\n * @param value - The candidate phone (any formatting).\n * @returns `true` when the number is in the reserved fictional block.\n * @example\n * ```ts\n * import { isSyntheticPhone } from \"@cosyte/synth\";\n * isSyntheticPhone(\"(202) 555-0142\"); // true\n * ```\n */\nexport function isSyntheticPhone(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n // The reserved guarantee is the 7-digit tail: exchange 555 + line 01NN.\n const tail = digits.slice(-7);\n return /^555 ?01\\d\\d$/.test(tail) || /^55501\\d\\d$/.test(tail);\n}\n\n/**\n * Whether an email's domain is an RFC 2606 / 6761 reserved / test domain.\n *\n * @param value - The candidate email address.\n * @returns `true` when the domain is reserved (never real).\n * @example\n * ```ts\n * import { isSyntheticEmail } from \"@cosyte/synth\";\n * isSyntheticEmail(\"faux.testerson@example.com\"); // true\n * ```\n */\nexport function isSyntheticEmail(value: string): boolean {\n const at = value.lastIndexOf(\"@\");\n if (at < 0) return false;\n const domain = value.slice(at + 1).toLowerCase();\n if (RESERVED_EMAIL_DOMAINS.includes(domain)) return true;\n return /\\.(example|test|invalid|localhost)$/.test(domain);\n}\n\n/**\n * Whether an IP string is in an RFC 5737 (IPv4 TEST-NET) or RFC 3849 (IPv6 documentation) reserved\n * block. A real routable address returns `false`.\n *\n * @param value - The candidate IPv4 or IPv6 address.\n * @returns `true` when the address is a reserved documentation address.\n * @example\n * ```ts\n * import { isSyntheticIp } from \"@cosyte/synth\";\n * isSyntheticIp(\"192.0.2.44\"); // true (TEST-NET-1)\n * isSyntheticIp(\"8.8.8.8\"); // false (real)\n * ```\n */\nexport function isSyntheticIp(value: string): boolean {\n if (value.toLowerCase().startsWith(`${DOC_V6_PREFIX}:`)) return true;\n return TEST_NET_V4_PREFIXES.some((prefix) => value.startsWith(`${prefix}.`));\n}\n","/**\n * The shipped **clearly-fake name pool** — `@cosyte/synth`'s own license-clean synthetic data.\n *\n * Deliberately **not** a `faker`-style realistic-name corpus (which could match a real person at a real\n * address — the exact hazard the synthetic-safety invariant forbids). Every token is\n * an obviously-invented, fixture-flavoured word: a reader can tell at a glance it names no one. The pool\n * is small on purpose — structural coverage, not demographic realism, is the goal.\n *\n * `# synthetic: true`\n *\n * @module\n */\n\n/** Obviously-synthetic given names. None is a plausible real person's name. */\nexport const SYNTHETIC_GIVEN_NAMES: readonly string[] = Object.freeze([\n \"Testina\",\n \"Fixtura\",\n \"Synthos\",\n \"Placeholda\",\n \"Sampleton\",\n \"Prototius\",\n \"Stubbina\",\n \"Exampla\",\n \"Quilliam\",\n \"Fabrica\",\n \"Simula\",\n \"Testry\",\n \"Seedwin\",\n \"Corpora\",\n \"Reprodo\",\n \"Mocktavia\",\n \"Dummett\",\n \"Voidwin\",\n \"Deteria\",\n \"Randomir\",\n]);\n\n/** Obviously-synthetic family names. None is a plausible real surname at a real address. */\nexport const SYNTHETIC_FAMILY_NAMES: readonly string[] = Object.freeze([\n \"Testerson\",\n \"Fauxman\",\n \"Placeholt\",\n \"Mockridge\",\n \"Fixtingham\",\n \"Synthwell\",\n \"Dummerton\",\n \"Examplewood\",\n \"Fabricant\",\n \"Simulacre\",\n \"Nonesuch\",\n \"Seedman\",\n \"Corpusworth\",\n \"Reprodus\",\n \"Voidmark\",\n \"Deterwood\",\n \"Randomson\",\n \"Quillfeather\",\n \"Notreal\",\n \"Genfield\",\n]);\n\n/** Obviously-synthetic street names for structured address fields. */\nexport const SYNTHETIC_STREET_NAMES: readonly string[] = Object.freeze([\n \"Fixture Lane\",\n \"Sample Street\",\n \"Placeholder Avenue\",\n \"Synthetic Way\",\n \"Example Boulevard\",\n \"Testing Terrace\",\n \"Mock Road\",\n \"Prototype Court\",\n]);\n\n/**\n * Obviously-synthetic city names. Combined only ever with a synthetic street + a fake name (the\n * *combination* is what identifies, and the combination is always synthetic).\n */\nexport const SYNTHETIC_CITY_NAMES: readonly string[] = Object.freeze([\n \"Faketon\",\n \"Synthville\",\n \"Exampleburg\",\n \"Testford\",\n \"Mockhaven\",\n \"Fixtureton\",\n]);\n","/**\n * The synthetic-safety provider layer — every identifier, contact point, name, and date\n * `@cosyte/synth` emits is minted here, and **only** from a guaranteed-non-colliding source. There is no code\n * path that returns a value not drawn from a reserved range or the\n * shipped fake-name pool. This is the inverse of a parser's liberality: the generator is *closed-world*\n * on its data sources, so no output *can* be real or plausibly-real PHI.\n *\n * All providers are pure functions of an explicit {@link ../rng/rng.Rng} — same seed, same values.\n *\n * @module\n */\n\nimport type { Rng } from \"../rng/rng.js\";\n\nimport {\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n npiCheckDigit,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n} from \"./reserved.js\";\nimport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./names-pool.js\";\n\n/** A synthetic person name drawn from the shipped fake-name pool. */\nexport interface SyntheticName {\n /** A clearly-fake given name. */\n readonly given: string;\n /** A clearly-fake family name. */\n readonly family: string;\n}\n\n/** A synthetic postal address — synthetic street + city, a fixed non-real ZIP. */\nexport interface SyntheticAddress {\n /** A clearly-fake street line. */\n readonly street: string;\n /** A clearly-fake city. */\n readonly city: string;\n /** A US state abbreviation (structural only; never combined with a real street + name + DOB). */\n readonly state: string;\n /** A reserved non-real ZIP (`00000`). */\n readonly zip: string;\n}\n\n/** A synthetic identifier scoped to the synthetic assigning authority. */\nexport interface SyntheticIdentifier {\n /** The identifier value (digits) — unique only within the synthetic namespace. */\n readonly value: string;\n /** HL7 identifier type code (`MR` = medical record, `AN` = account, `MB` = member). */\n readonly typeCode: \"MR\" | \"AN\" | \"MB\";\n /** The synthetic assigning-authority namespace id. */\n readonly assigningAuthority: string;\n /** The synthetic assigning-authority OID (HL7 example arc). */\n readonly assigningAuthorityOid: string;\n}\n\n/** Which SSN reserved space to draw from. */\nexport type SsnBlock = \"never-issued\" | \"advertising\";\n\n/**\n * A **synthetic SSN** — dashed `AAA-GG-SSSS`. Default draws the SSA never-issued area space\n * (`900–999`); `block: \"advertising\"` draws SSA's reserved advertising block (`987-65-4320…4329`).\n * A value from this function can never be a real SSN.\n *\n * @param rng - The seeded generator.\n * @param block - Which reserved space to draw from. Defaults to `\"never-issued\"`.\n * @returns A dashed synthetic SSN string.\n * @example\n * ```ts\n * import { createRng, ssn } from \"@cosyte/synth\";\n * ssn(createRng(1)); // e.g. a 900-area, never-issued SSN\n * ```\n */\nexport function ssn(rng: Rng, block: SsnBlock = \"never-issued\"): string {\n if (block === \"advertising\") {\n // SSA's explicitly-reserved advertising block: last digit 0..9 within -4320..-4329.\n return `987-65-432${String(rng.int(0, 9))}`;\n }\n const area = rng.int(900, 999); // SSA never issues 900-999.\n const group = rng.digits(2);\n const serial = rng.digits(4);\n return `${String(area)}-${group}-${serial}`;\n}\n\n/**\n * A **synthetic phone** in the NANP reserved fictional block — `(AAA) 555-01NN`. The reserved\n * guarantee is the `555-01NN` tail (exchange 555, line 0100–0199); the area code is any NANP-valid\n * `NXX`. Can never be a working number.\n *\n * @param rng - The seeded generator.\n * @returns A formatted synthetic phone string.\n * @example\n * ```ts\n * import { createRng, phone } from \"@cosyte/synth\";\n * phone(createRng(1)); // e.g. \"(2XX) 555-01NN\"\n * ```\n */\nexport function phone(rng: Rng): string {\n const area = `${String(rng.int(2, 9))}${rng.digits(2)}`; // NXX area code.\n const line = `01${rng.digits(2)}`; // reserved 0100-0199.\n return `(${area}) 555-${line}`;\n}\n\n/**\n * A **synthetic name** drawn from the shipped clearly-fake pool.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticName}.\n * @example\n * ```ts\n * import { createRng, name } from \"@cosyte/synth\";\n * const { given, family } = name(createRng(1));\n * ```\n */\nexport function name(rng: Rng): SyntheticName {\n return { given: rng.pick(SYNTHETIC_GIVEN_NAMES), family: rng.pick(SYNTHETIC_FAMILY_NAMES) };\n}\n\n/**\n * A **synthetic email** at an RFC 2606 / 6761 reserved domain — `<slug>@example.com`.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name to derive the local-part slug from; otherwise a random slug is used.\n * @returns A synthetic email address.\n * @example\n * ```ts\n * import { createRng, email, name } from \"@cosyte/synth\";\n * email(createRng(1), name(createRng(1))); // \"<given>.<family>@example.com\"\n * ```\n */\nexport function email(rng: Rng, person?: SyntheticName): string {\n const domain = rng.pick(RESERVED_EMAIL_DOMAINS);\n const slug = person ? `${person.given}.${person.family}`.toLowerCase() : `synth${rng.digits(6)}`;\n return `${slug}@${domain}`;\n}\n\n/**\n * A **synthetic IPv4** in an RFC 5737 TEST-NET block — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A TEST-NET IPv4 address string.\n * @example\n * ```ts\n * import { createRng, ipv4 } from \"@cosyte/synth\";\n * ipv4(createRng(1)); // e.g. \"192.0.2.NN\"\n * ```\n */\nexport function ipv4(rng: Rng): string {\n return `${rng.pick(TEST_NET_V4_PREFIXES)}.${String(rng.int(1, 254))}`;\n}\n\n/**\n * A **synthetic IPv6** in the RFC 3849 documentation prefix `2001:db8::/32` — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A documentation-prefix IPv6 address string.\n * @example\n * ```ts\n * import { createRng, ipv6 } from \"@cosyte/synth\";\n * ipv6(createRng(1)); // e.g. \"2001:db8::NNNN\"\n * ```\n */\nexport function ipv6(rng: Rng): string {\n const tail = rng.nextUint32().toString(16).padStart(4, \"0\").slice(-4);\n return `${DOC_V6_PREFIX}::${tail}`;\n}\n\n/**\n * A **deterministic UUIDv4-shaped** surrogate key from the seeded generator. Because it is seeded (not\n * from `node:crypto`, which is not reproducible), the cryptographic non-collision argument is weaker —\n * acceptable because the identifier namespace is synthetic anyway, and noted honestly.\n *\n * @param rng - The seeded generator.\n * @returns A canonical `8-4-4-4-12` lowercase-hex UUID string with version `4` and RFC 4122 variant.\n * @example\n * ```ts\n * import { createRng, uuid } from \"@cosyte/synth\";\n * uuid(createRng(1)); // \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n * ```\n */\nexport function uuid(rng: Rng): string {\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i += 1) bytes[i] = rng.int(0, 255);\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40; // version 4\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n\n/**\n * A **synthetic NPI** — a 10-digit National Provider Identifier with a **deliberately-invalid Luhn\n * check digit**, so it can never be a NPPES-issued NPI (a real NPI must satisfy the `80840`-prefixed\n * Luhn check). The 9-digit base is drawn from the seeded generator; the check digit is\n * set to `(correct + 1) mod 10`, guaranteeing the full value fails validation.\n *\n * @param rng - The seeded generator.\n * @returns A 10-digit NPI-shaped string that is provably not a real NPI.\n * @example\n * ```ts\n * import { createRng, npi, isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(npi(createRng(1))); // true — invalid check digit by construction\n * ```\n */\nexport function npi(rng: Rng): string {\n const base9 = rng.digits(9);\n const wrongCheck = (npiCheckDigit(base9) + 1) % 10;\n return `${base9}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic DEA number** — `<registrant-type><initial>` + 7 digits with a **deliberately-invalid\n * checksum**, so it can never be a validly-issued DEA registration (a real DEA number's 7th digit\n * satisfies the published DEA checksum). The first letter is a registrant-type letter, the\n * second is derived from `person` (its family initial) when supplied so the number reads plausibly; the\n * 6-digit base is seeded and the check digit is set to `(correct + 1) mod 10`, guaranteeing the value\n * fails validation. NCPDP carries prescriber DEA, and this is the identity locus a refuter attacks\n * hardest, so — like {@link npi} — non-collision is a construction-level guarantee, not a heuristic.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name whose family initial becomes the DEA's second letter.\n * @returns A DEA-shaped string that is provably not a real DEA registration.\n * @example\n * ```ts\n * import { createRng, dea, isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(dea(createRng(1))); // true — invalid checksum by construction\n * ```\n */\nexport function dea(rng: Rng, person?: SyntheticName): string {\n const type = rng.pick(DEA_REGISTRANT_TYPES);\n const initialSource = person?.family ?? rng.pick(SYNTHETIC_FAMILY_NAMES);\n const initial = initialSource.slice(0, 1).toUpperCase();\n const base6 = rng.digits(6);\n const wrongCheck = (deaCheckDigit(base6) + 1) % 10;\n return `${type}${initial}${base6}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic identifier** (MRN / account / member id) scoped to the synthetic assigning authority.\n * There is no reserved MRN range, so non-collision is guaranteed by the *namespace*, not the value: the\n * identifier lives under a `SYNTH` authority no real facility uses.\n *\n * @param rng - The seeded generator.\n * @param typeCode - The HL7 identifier type: `MR` (default), `AN`, or `MB`.\n * @returns A {@link SyntheticIdentifier}.\n * @example\n * ```ts\n * import { createRng, identifier } from \"@cosyte/synth\";\n * identifier(createRng(1), \"MR\"); // { value, typeCode: \"MR\", assigningAuthority: \"COSYTE-SYNTH\", ... }\n * ```\n */\nexport function identifier(\n rng: Rng,\n typeCode: SyntheticIdentifier[\"typeCode\"] = \"MR\",\n): SyntheticIdentifier {\n return {\n value: rng.digits(8),\n typeCode,\n assigningAuthority: SYNTHETIC_ASSIGNING_AUTHORITY.namespaceId,\n assigningAuthorityOid: SYNTHETIC_ASSIGNING_AUTHORITY.universalId,\n };\n}\n\n/**\n * A **synthetic address** — a fake street + city, a reserved non-real ZIP (`00000`). A real state\n * abbreviation may appear (structural only) but is never combined with a real street + name + DOB.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticAddress}.\n * @example\n * ```ts\n * import { createRng, address } from \"@cosyte/synth\";\n * address(createRng(1)); // { street, city, state, zip: \"00000\" }\n * ```\n */\nexport function address(rng: Rng): SyntheticAddress {\n const number = rng.int(1, 9999);\n return {\n street: `${String(number)} ${rng.pick(SYNTHETIC_STREET_NAMES)}`,\n city: rng.pick(SYNTHETIC_CITY_NAMES),\n state: rng.pick(US_STATES),\n zip: \"00000\",\n };\n}\n\n/**\n * A **synthetic date** in HL7 `YYYYMMDD` form, drawn uniformly within an inclusive year range. Comes\n * from the seeded generator (never wall-clock), so it is reproducible and implies no real event.\n *\n * @param rng - The seeded generator.\n * @param minYear - Inclusive lower year bound (default `1930`).\n * @param maxYear - Inclusive upper year bound (default `2010`).\n * @returns An `YYYYMMDD` date string (always a valid calendar day).\n * @example\n * ```ts\n * import { createRng, dateYmd } from \"@cosyte/synth\";\n * dateYmd(createRng(1), 1970, 2000); // \"YYYYMMDD\"\n * ```\n */\nexport function dateYmd(rng: Rng, minYear = 1930, maxYear = 2010): string {\n const year = rng.int(minYear, maxYear);\n const month = rng.int(1, 12);\n const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();\n const day = rng.int(1, daysInMonth);\n return `${String(year).padStart(4, \"0\")}${String(month).padStart(2, \"0\")}${String(day).padStart(2, \"0\")}`;\n}\n\n/** US state abbreviations — structural only (see {@link address}). */\nconst US_STATES: readonly string[] = Object.freeze([\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\",\n]);\n","/**\n * The `safe` namespace — the single entry point for every synthetic-by-construction value provider.\n *\n * Grouped under one object so a consumer reads `safe.ssn(rng)` / `safe.phone(rng)` and it is\n * self-evident that the value is drawn from a guaranteed-non-colliding synthetic source.\n * The individual functions and the reserved-range predicates are also exported by name from the\n * package root for direct import.\n *\n * @module\n */\n\nimport {\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n} from \"./providers.js\";\n\nexport * from \"./providers.js\";\nexport * from \"./reserved.js\";\nexport * from \"./names-pool.js\";\n\n/**\n * The synthetic-safety provider namespace. Every function draws only from a reserved range or the\n * shipped fake-name pool — no value it returns can be real or plausibly-real PHI.\n *\n * @example\n * ```ts\n * import { createRng, safe } from \"@cosyte/synth\";\n * const rng = createRng(42);\n * safe.ssn(rng); // never-issued SSN\n * safe.phone(rng); // reserved 555-01NN number\n * ```\n */\nexport const safe = Object.freeze({\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n});\n","/**\n * Synthetic identity for NCPDP transactions — every patient, prescriber, pharmacy, and cardholder\n * identifier `synth` puts into a SCRIPT ePrescription or a Telecom claim is minted here, and **only**\n * from the synthetic-safety providers. NCPDP is identity-dense in a way the refuter\n * attacks hardest: a NewRx carries the **patient** (name, DOB, gender) *and* the **prescriber** (name,\n * NPI, **DEA**); a Telecom claim adds the **cardholder / member** (name, member id). Every locus below\n * has a construction-level guarantee, not a heuristic:\n *\n * - **NPI** — a deliberately **invalid Luhn** check digit, so it can never be a NPPES-issued NPI\n * ({@link ../safe/reserved.isSyntheticNpi}).\n * - **DEA** — a deliberately **invalid checksum**, so it can never be a validly-issued DEA registration\n * ({@link ../safe/reserved.isSyntheticDea}). This is the NCPDP-specific identity locus X12 did not have.\n * - **member / cardholder / patient id** — minted under the synthetic assigning authority with an\n * `MBR` prefix (no reserved range exists; the *namespace* is the guarantee).\n * - **name** — the shipped clearly-fake pool; **DOB** — the seeded generator (no real event implied);\n * **phone** — the reserved `555-01xx` block; **address** — synthetic street + reserved ZIP.\n *\n * @module\n */\n\nimport type { Rng } from \"../rng/rng.js\";\nimport { safe, type SyntheticName, type SyntheticAddress } from \"../safe/index.js\";\n\n/** Synthetic pharmacy business names — clearly fictional. */\nconst SYNTHETIC_PHARMACY_NAMES: readonly string[] = Object.freeze([\n \"SYNTH COMMUNITY PHARMACY\",\n \"FIXTURE DRUG MART\",\n \"PLACEHOLDER RX SERVICES\",\n \"SAMPLE APOTHECARY LLC\",\n \"MOCK PHARMACY GROUP\",\n]);\n\n/** A synthetic patient — every field from `../safe`. */\nexport interface NcpdpPatient {\n /** Name from the shipped fake-name pool. */\n readonly person: SyntheticName;\n /** Date of birth `CCYYMMDD` from the seeded generator. */\n readonly dob: string;\n /** Administrative gender code (`1` = male, `2` = female — NCPDP gender codes). */\n readonly gender: \"1\" | \"2\";\n /** Patient id, synthetic-AA scoped (`MBR`-prefixed — never a bare SSN). */\n readonly patientId: string;\n /** Reserved `555-01xx` phone. */\n readonly phone: string;\n /** Synthetic postal address (reserved non-real ZIP). */\n readonly address: SyntheticAddress;\n}\n\n/** A synthetic prescriber — name + invalid-Luhn NPI + invalid-checksum DEA. */\nexport interface NcpdpPrescriber {\n /** A clearly-fake prescriber name. */\n readonly person: SyntheticName;\n /** A 10-digit NPI with a deliberately-invalid Luhn check digit (never a real NPI). */\n readonly npi: string;\n /** A DEA number with a deliberately-invalid checksum (never a real DEA registration). */\n readonly dea: string;\n}\n\n/** A synthetic dispensing pharmacy — business name + invalid-Luhn NPI + synthetic NCPDP id. */\nexport interface NcpdpPharmacy {\n /** A clearly-fictional pharmacy business name. */\n readonly businessName: string;\n /** A 10-digit NPI with a deliberately-invalid Luhn check digit. */\n readonly npi: string;\n /** A 7-digit NCPDP provider id (synthetic — an all-digit id under no real chain). */\n readonly ncpdpId: string;\n}\n\n/** A synthetic cardholder / insurance identity — the covered person on a Telecom claim. */\nexport interface NcpdpCardholder {\n /** The cardholder name (may differ from the patient). */\n readonly person: SyntheticName;\n /** Cardholder / member id, synthetic-AA scoped (`MBR`-prefixed). */\n readonly cardholderId: string;\n /** Group id, synthetic. */\n readonly groupId: string;\n /** Person code (`01` = cardholder, `02` = spouse, `03` = child — structural). */\n readonly personCode: string;\n}\n\n/**\n * Mint a synthetic patient. Fixed draw order (name → DOB → gender → id → phone → address) so the same\n * seed yields the same patient.\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link NcpdpPatient}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ncpdpPatient } from \"@cosyte/synth/ncpdp\";\n * const { person, patientId } = ncpdpPatient(createRng(1));\n * ```\n */\nexport function ncpdpPatient(rng: Rng): NcpdpPatient {\n const person = safe.name(rng);\n const dob = safe.dateYmd(rng, 1935, 2010);\n const gender = rng.pick([\"1\", \"2\"] as const);\n const patientId = `MBR${safe.identifier(rng, \"MR\").value}`;\n const phone = safe.phone(rng);\n const address = safe.address(rng);\n return { person, dob, gender, patientId, phone, address };\n}\n\n/**\n * Mint a synthetic prescriber — a person name, an invalid-Luhn NPI, and an invalid-checksum DEA (the\n * DEA's second letter is derived from the prescriber's family name so it reads plausibly).\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link NcpdpPrescriber}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ncpdpPrescriber } from \"@cosyte/synth/ncpdp\";\n * const p = ncpdpPrescriber(createRng(1)); // p.npi invalid-Luhn; p.dea invalid-checksum\n * ```\n */\nexport function ncpdpPrescriber(rng: Rng): NcpdpPrescriber {\n const person = safe.name(rng);\n const npi = safe.npi(rng);\n const dea = safe.dea(rng, person);\n return { person, npi, dea };\n}\n\n/**\n * Mint a synthetic dispensing pharmacy — a fictional business name, an invalid-Luhn NPI, and a 7-digit\n * synthetic NCPDP provider id.\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link NcpdpPharmacy}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ncpdpPharmacy } from \"@cosyte/synth/ncpdp\";\n * const rx = ncpdpPharmacy(createRng(1));\n * ```\n */\nexport function ncpdpPharmacy(rng: Rng): NcpdpPharmacy {\n const businessName = rng.pick(SYNTHETIC_PHARMACY_NAMES);\n const npi = safe.npi(rng);\n const ncpdpId = rng.digits(7);\n return { businessName, npi, ncpdpId };\n}\n\n/**\n * Mint a synthetic cardholder / insurance identity for a Telecom claim.\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link NcpdpCardholder}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ncpdpCardholder } from \"@cosyte/synth/ncpdp\";\n * const c = ncpdpCardholder(createRng(1));\n * ```\n */\nexport function ncpdpCardholder(rng: Rng): NcpdpCardholder {\n const person = safe.name(rng);\n const cardholderId = `MBR${safe.identifier(rng, \"MB\").value}`;\n const groupId = `GRP${rng.digits(5)}`;\n const personCode = rng.pick([\"01\", \"02\", \"03\"] as const);\n return { person, cardholderId, groupId, personCode };\n}\n\n/** A seeded SCRIPT routing/correlation bundle — message ids + timestamps, all reproducible. */\nexport interface NcpdpScriptRouting {\n /** `<MessageID>` — a synthetic message id. */\n readonly messageId: string;\n /** `<SentTime>` — a seeded ISO-8601 timestamp (never wall-clock). */\n readonly sentTime: string;\n /** `<PrescriberOrderNumber>` — a synthetic order number. */\n readonly prescriberOrderNumber: string;\n /** A `CCYYMMDD` written / service date (seeded, recent window). */\n readonly date: string;\n}\n\n/**\n * Mint a seeded SCRIPT routing bundle. The timestamp is drawn from the seeded generator in a recent\n * window (2024–2026) so a message reads current while staying byte-reproducible.\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link NcpdpScriptRouting}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ncpdpScriptRouting } from \"@cosyte/synth/ncpdp\";\n * const r = ncpdpScriptRouting(createRng(1));\n * ```\n */\nexport function ncpdpScriptRouting(rng: Rng): NcpdpScriptRouting {\n const date = safe.dateYmd(rng, 2024, 2026); // CCYYMMDD\n const yyyy = date.slice(0, 4);\n const mm = date.slice(4, 6);\n const dd = date.slice(6, 8);\n const hh = String(rng.int(0, 23)).padStart(2, \"0\");\n const mi = String(rng.int(0, 59)).padStart(2, \"0\");\n return {\n messageId: `SYNTH-${rng.digits(10)}`,\n sentTime: `${yyyy}-${mm}-${dd}T${hh}:${mi}:00Z`,\n prescriberOrderNumber: `PON${rng.digits(8)}`,\n date,\n };\n}\n","/**\n * License-clean example drug + code pools for synthetic NCPDP generation. NCPDP charges for its\n * standards and is protective of their prose, so — like every other `synth` format — **no NCPDP\n * copyrighted text is bundled**: these are widely-known generic drug descriptions and invented,\n * clearly-example product codes, not lifted from any NCPDP data dictionary.\n *\n * A drug code is **not** PHI — it names a product, never a patient — so realism here carries no\n * synthetic-safety hazard; the pool exists only to give a generated NewRx / claim a plausible,\n * license-clean drug. Patient / prescriber identity comes from the synthetic-safety providers\n * (`../safe`), never from here.\n *\n * `# synthetic: true`\n *\n * @module\n */\n\n/** One example drug: a widely-known generic description + an invented, clearly-example NDC. */\nexport interface NcpdpExampleDrug {\n /** A widely-known generic drug description (RxNorm-style; public knowledge, not NCPDP prose). */\n readonly description: string;\n /** An invented 11-digit NDC (`5-4-2`, digits only) — an example product code, never a real NDC. */\n readonly ndc: string;\n /** The dispense quantity unit-of-measure qualifier hint (structural only). */\n readonly form: string;\n}\n\n/**\n * A small pool of license-clean example drugs. The NDCs use the invented labeler prefix `00000`\n * (never an FDA-assigned labeler), so they are transparently examples; the descriptions are common\n * generics anyone can name without a licensed database.\n */\nexport const EXAMPLE_DRUGS: readonly NcpdpExampleDrug[] = Object.freeze([\n { description: \"Amoxicillin 500 MG Oral Capsule\", ndc: \"00000010101\", form: \"EA\" },\n { description: \"Lisinopril 10 MG Oral Tablet\", ndc: \"00000020202\", form: \"EA\" },\n { description: \"Atorvastatin 20 MG Oral Tablet\", ndc: \"00000030303\", form: \"EA\" },\n { description: \"Metformin 500 MG Oral Tablet\", ndc: \"00000040404\", form: \"EA\" },\n { description: \"Amlodipine 5 MG Oral Tablet\", ndc: \"00000050505\", form: \"EA\" },\n { description: \"Omeprazole 20 MG Delayed Release Capsule\", ndc: \"00000060606\", form: \"EA\" },\n { description: \"Levothyroxine 50 MCG Oral Tablet\", ndc: \"00000070707\", form: \"EA\" },\n { description: \"Azithromycin 250 MG Oral Tablet\", ndc: \"00000080808\", form: \"EA\" },\n { description: \"Sertraline 50 MG Oral Tablet\", ndc: \"00000090909\", form: \"EA\" },\n { description: \"Albuterol 90 MCG Metered Dose Inhaler\", ndc: \"00000101010\", form: \"EA\" },\n]);\n\n/** Example free-text SIG directions (public, common-sense dosing text — not NCPDP prose). */\nexport const EXAMPLE_SIG_TEXT: readonly string[] = Object.freeze([\n \"Take 1 tablet by mouth once daily\",\n \"Take 1 capsule by mouth twice daily with food\",\n \"Take 2 tablets by mouth every 12 hours as needed\",\n \"Take 1 tablet by mouth at bedtime\",\n \"Inhale 2 puffs by mouth every 4 to 6 hours as needed\",\n]);\n\n/** Dispense-as-written / product-selection codes (single-digit, structural). */\nexport const DAW_CODES: readonly string[] = Object.freeze([\"0\", \"1\", \"2\"]);\n","/**\n * Spec-clean NCPDP **SCRIPT** (XML ePrescribing) generation — `NewRx`, `RxRenewalRequest`, and\n * `RxChangeRequest` — built through `@cosyte/ncpdp`'s own emit surface so the XML is spec-clean by the\n * same mechanism that makes the parser's serializer spec-clean:\n *\n * - **NewRx** is built through the validated `buildNewRx` builder (it refuses a NewRx with no\n * medication description) and serialized by `serializeScript`.\n * - **RxRenewalRequest / RxChangeRequest** have no dedicated builder in `@cosyte/ncpdp` (its builders\n * cover NewRx + the Status/Error/Verify responses), so — exactly as the X12 generator constructs a\n * typed model and lets `serializeX12` emit it — these are built as the parser's **public, typed\n * `ScriptMessage` model** (the same immutable model `buildNewRx` returns) and serialized by\n * `serializeScript`. No byte is hand-written; the round-trip harness ({@link ./round-trip.scriptRoundTrip})\n * re-parses every message through `parseScript` and asserts **zero warnings**, so spec-cleanliness is\n * the parser's judgment, not `synth`'s.\n *\n * Every patient / prescriber / pharmacy identifier is drawn from the synthetic-safety providers via\n * {@link ./identity}; the prescriber NPI is invalid-Luhn and the **DEA is invalid-checksum**, so\n * neither can denote a real provider.\n *\n * @module\n */\n\nimport {\n buildNewRx,\n serializeScript,\n ScriptMessage,\n type MedicationPrescribed,\n type Patient,\n type Pharmacy,\n type Prescriber,\n type ScriptHeader,\n type RxRenewalRequest,\n type RxChangeRequest,\n} from \"@cosyte/ncpdp/script\";\nimport { decimalValue, codedValue } from \"@cosyte/ncpdp/common\";\n\nimport { createRng, type Rng } from \"../rng/rng.js\";\nimport {\n ncpdpPatient,\n ncpdpPrescriber,\n ncpdpPharmacy,\n ncpdpScriptRouting,\n type NcpdpScriptRouting,\n} from \"./identity.js\";\nimport { EXAMPLE_DRUGS, EXAMPLE_SIG_TEXT } from \"./example-codes.js\";\n\n/** The SCRIPT version `synth` stamps generated messages with (a version `@cosyte/ncpdp` reads clean). */\nconst SCRIPT_VERSION = \"2017071\";\n\n/** Options for the SCRIPT generators. */\nexport interface GenerateScriptOptions {\n /** The seed (deterministic — same seed yields a byte-identical message). */\n readonly seed: number;\n}\n\n/** Build the typed `Patient` model from a synthetic patient. */\nfunction patientModel(rng: Rng): Patient {\n const p = ncpdpPatient(rng);\n return {\n name: { lastName: p.person.family, firstName: p.person.given },\n gender: p.gender,\n dateOfBirth: p.dob,\n };\n}\n\n/** Build the typed `Pharmacy` model from a synthetic pharmacy. */\nfunction pharmacyModel(rng: Rng): Pharmacy {\n const rx = ncpdpPharmacy(rng);\n return {\n businessName: rx.businessName,\n identification: { npi: rx.npi, ncpdpId: rx.ncpdpId },\n };\n}\n\n/** Build the typed `Prescriber` model — NPI invalid-Luhn, DEA invalid-checksum. */\nfunction prescriberModel(rng: Rng): Prescriber {\n const dr = ncpdpPrescriber(rng);\n return {\n name: { lastName: dr.person.family, firstName: dr.person.given },\n identification: { npi: dr.npi, deaNumber: dr.dea },\n };\n}\n\n/** Build the typed `MedicationPrescribed` model from the license-clean example pool. */\nfunction medicationModel(rng: Rng, routing: NcpdpScriptRouting): MedicationPrescribed {\n const drug = rng.pick(EXAMPLE_DRUGS);\n const written = `${routing.date.slice(0, 4)}-${routing.date.slice(4, 6)}-${routing.date.slice(6, 8)}`;\n return {\n description: drug.description,\n coded: { productCode: codedValue(drug.ndc, \"ND\") },\n quantity: {\n value: decimalValue(String(rng.int(30, 90))),\n unitOfMeasure: drug.form,\n codeListQualifier: \"38\",\n },\n daysSupply: decimalValue(String(rng.pick([30, 60, 90] as const))),\n numberOfRefills: String(rng.int(0, 5)),\n substitutions: rng.pick([\"0\", \"1\"] as const),\n writtenDate: written,\n sigText: rng.pick(EXAMPLE_SIG_TEXT),\n };\n}\n\n/** The routing header (with SCRIPT version) shared by every generated SCRIPT message. */\nfunction headerModel(routing: NcpdpScriptRouting): ScriptHeader {\n return {\n version: SCRIPT_VERSION,\n from: \"SYNTHPRESCRIBER\",\n to: \"SYNTHPHARMACY\",\n messageId: routing.messageId,\n sentTime: routing.sentTime,\n prescriberOrderNumber: routing.prescriberOrderNumber,\n };\n}\n\n/**\n * Generate a spec-clean SCRIPT **NewRx** ePrescription, built through `@cosyte/ncpdp`'s validated\n * `buildNewRx` and serialized by `serializeScript`. Every identity value is synthetic-by-construction; the\n * message round-trips through `parseScript` with zero warnings.\n *\n * @param options - The seed. See {@link GenerateScriptOptions}.\n * @returns The serialized SCRIPT XML.\n * @example\n * ```ts\n * import { generateNewRx } from \"@cosyte/synth/ncpdp\";\n * const xml = generateNewRx({ seed: 42 });\n * ```\n */\nexport function generateNewRx(options: GenerateScriptOptions): string {\n const rng = createRng(options.seed);\n const routing = ncpdpScriptRouting(rng);\n const patient = patientModel(rng);\n const pharmacy = pharmacyModel(rng);\n const prescriber = prescriberModel(rng);\n const medication = medicationModel(rng, routing);\n const message = buildNewRx({\n header: headerModel(routing),\n patient,\n pharmacy,\n prescriber,\n medication,\n });\n return serializeScript(message);\n}\n\n/** Assemble the shared lifecycle-request fields (request ref, parties, medication) from a seed. */\nfunction lifecycleFields(rng: Rng): {\n requestReferenceNumber: string;\n patient: Patient;\n pharmacy: Pharmacy;\n prescriber: Prescriber;\n medicationPrescribed: MedicationPrescribed;\n header: ScriptHeader;\n} {\n const routing = ncpdpScriptRouting(rng);\n return {\n requestReferenceNumber: `REQ${rng.digits(9)}`,\n patient: patientModel(rng),\n pharmacy: pharmacyModel(rng),\n prescriber: prescriberModel(rng),\n medicationPrescribed: medicationModel(rng, routing),\n header: headerModel(routing),\n };\n}\n\n/**\n * Generate a spec-clean SCRIPT **RxRenewalRequest** (a pharmacy-initiated renewal), built as\n * `@cosyte/ncpdp`'s public typed `ScriptMessage` model and serialized by `serializeScript`. Every\n * identity value is synthetic-by-construction; the message round-trips through `parseScript` with zero\n * warnings (verified by {@link ./round-trip.scriptRoundTrip}).\n *\n * @param options - The seed. See {@link GenerateScriptOptions}.\n * @returns The serialized SCRIPT XML.\n * @example\n * ```ts\n * import { generateRxRenewalRequest } from \"@cosyte/synth/ncpdp\";\n * const xml = generateRxRenewalRequest({ seed: 7 });\n * ```\n */\nexport function generateRxRenewalRequest(options: GenerateScriptOptions): string {\n const rng = createRng(options.seed);\n const { header, ...fields } = lifecycleFields(rng);\n const body: RxRenewalRequest = { kind: \"RxRenewalRequest\", ...fields };\n return serializeScript(new ScriptMessage({ header, body, warnings: [] }));\n}\n\n/**\n * Generate a spec-clean SCRIPT **RxChangeRequest** (a pharmacy-initiated change request), built as\n * `@cosyte/ncpdp`'s public typed `ScriptMessage` model and serialized by `serializeScript`. Every\n * identity value is synthetic-by-construction; the message round-trips through `parseScript` with zero\n * warnings.\n *\n * @param options - The seed. See {@link GenerateScriptOptions}.\n * @returns The serialized SCRIPT XML.\n * @example\n * ```ts\n * import { generateRxChangeRequest } from \"@cosyte/synth/ncpdp\";\n * const xml = generateRxChangeRequest({ seed: 7 });\n * ```\n */\nexport function generateRxChangeRequest(options: GenerateScriptOptions): string {\n const rng = createRng(options.seed);\n const { header, ...fields } = lifecycleFields(rng);\n const body: RxChangeRequest = { kind: \"RxChangeRequest\", ...fields };\n return serializeScript(new ScriptMessage({ header, body, warnings: [] }));\n}\n","/**\n * Spec-clean NCPDP **Telecommunication vD.0** claim generation — `B1` (billing), `B2` (reversal), and\n * `B3` (rebill) — built through `@cosyte/ncpdp`'s `buildTelecomRequest` + `serializeTelecom` so the\n * fixed Transaction Header, the FS/GS/RS framing, and every field are the parser's own conservative\n * emit. Every field id below is a real 2-character NCPDP field identifier, and every\n * value at a PHI-bearing locus is drawn from the synthetic-safety providers via {@link ./identity}: the\n * patient / cardholder names come from the fake-name pool, the DOB / dates from the seeded generator,\n * the phone from the reserved `555-01xx` block, the member / cardholder ids under the synthetic\n * assigning authority, and the prescriber NPI with an invalid Luhn check digit. Each transaction\n * round-trips through `parseTelecom` with zero warnings.\n *\n * @module\n */\n\nimport {\n buildTelecomRequest,\n serializeTelecom,\n type TelecomHeaderInput,\n type TelecomSegmentInput,\n type TelecomFieldInput,\n} from \"@cosyte/ncpdp/telecom\";\n\nimport { createRng, type Rng } from \"../rng/rng.js\";\nimport { ncpdpPatient, ncpdpCardholder, ncpdpPharmacy, ncpdpPrescriber } from \"./identity.js\";\nimport { EXAMPLE_DRUGS, DAW_CODES } from \"./example-codes.js\";\n\n/** The Telecom transaction codes `synth` generates. */\nexport type TelecomTransactionCode = \"B1\" | \"B2\" | \"B3\";\n\n/** A synthetic routing BIN (an ISO/IIN routing number — not patient identity, kept clearly synthetic). */\nconst SYNTHETIC_BIN = \"999999\";\n\n/** Options for the Telecom generators. */\nexport interface GenerateTelecomOptions {\n /** The seed (deterministic — same seed yields a byte-identical transaction). */\n readonly seed: number;\n}\n\n/** Drop any incidental separators; keep the compact wire value (never carries FS/GS/RS). */\nfunction digitsOnly(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\n/** Build the fixed Transaction Header for the given transaction code, from seeded identity. */\nfunction header(\n rng: Rng,\n transactionCode: TelecomTransactionCode,\n pharmacyNpi: string,\n): TelecomHeaderInput {\n const date = serviceDate(rng);\n return {\n binNumber: SYNTHETIC_BIN,\n versionRelease: \"D0\",\n transactionCode,\n processorControlNumber: `SYN${rng.digits(4)}`,\n transactionCount: \"1\",\n serviceProviderIdQualifier: \"01\", // 01 = NPI\n serviceProviderId: pharmacyNpi,\n dateOfService: date,\n softwareCertificationId: `SW${rng.digits(6)}`,\n };\n}\n\n/** A seeded `CCYYMMDD` service date in a recent window. */\nfunction serviceDate(rng: Rng): string {\n const year = rng.int(2024, 2026);\n const month = rng.int(1, 12);\n const day = rng.int(1, 28);\n return `${String(year)}${String(month).padStart(2, \"0\")}${String(day).padStart(2, \"0\")}`;\n}\n\n/** A field pair; dropped when the value is empty so no empty field is emitted. */\nfunction field(id: string, value: string): TelecomFieldInput {\n return { id, value };\n}\n\n/** The Patient segment (01) — CA/CB name, C4 DOB, C5 gender, CM address, CQ phone, CY patient id. */\nfunction patientSegment(rng: Rng): TelecomSegmentInput {\n const p = ncpdpPatient(rng);\n return {\n segmentId: \"01\",\n fields: [\n field(\"C4\", p.dob),\n field(\"C5\", p.gender),\n field(\"CA\", p.person.given),\n field(\"CB\", p.person.family),\n field(\"CM\", p.address.street),\n field(\"CQ\", digitsOnly(p.phone)),\n field(\"CY\", p.patientId),\n ],\n };\n}\n\n/** The Insurance segment (04) — C2 cardholder id, C1 group, C3 person code, CC/CD cardholder name. */\nfunction insuranceSegment(rng: Rng): TelecomSegmentInput {\n const c = ncpdpCardholder(rng);\n return {\n segmentId: \"04\",\n fields: [\n field(\"C2\", c.cardholderId),\n field(\"C1\", c.groupId),\n field(\"C3\", c.personCode),\n field(\"CC\", c.person.given),\n field(\"CD\", c.person.family),\n ],\n };\n}\n\n/** The Prescriber segment (03) — DB prescriber id (NPI), EZ qualifier (`01` = NPI). */\nfunction prescriberSegment(rng: Rng): TelecomSegmentInput {\n const dr = ncpdpPrescriber(rng);\n return {\n segmentId: \"03\",\n fields: [field(\"EZ\", \"01\"), field(\"DB\", dr.npi)],\n };\n}\n\n/** The Claim segment (07) — Rx ref, product (NDC), quantity, days supply, DAW. `minimal` for a reversal. */\nfunction claimSegment(rng: Rng, minimal: boolean): TelecomSegmentInput {\n const drug = rng.pick(EXAMPLE_DRUGS);\n const rxRef = `RX${rng.digits(7)}`;\n const fill = String(rng.int(0, 5));\n if (minimal) {\n return {\n segmentId: \"07\",\n fields: [field(\"EM\", \"1\"), field(\"D2\", rxRef), field(\"D3\", fill)],\n };\n }\n return {\n segmentId: \"07\",\n fields: [\n field(\"EM\", \"1\"), // 1 = Rx Billing\n field(\"D2\", rxRef),\n field(\"D3\", fill),\n field(\"E1\", \"03\"), // 03 = NDC\n field(\"D7\", drug.ndc),\n field(\"E7\", String(rng.int(30, 90))),\n field(\"D5\", String(rng.pick([30, 60, 90] as const))),\n field(\"D8\", rng.pick(DAW_CODES)),\n ],\n };\n}\n\n/**\n * Generate a spec-clean Telecom transaction of the given code, built through\n * `@cosyte/ncpdp`'s `buildTelecomRequest` + `serializeTelecom`. `B1`/`B3` carry the full\n * patient / insurance / prescriber / claim segment set; `B2` (reversal) is the minimal\n * insurance + claim-reference set a reversal actually carries. Every identity value is\n * synthetic-by-construction; the transaction round-trips through `parseTelecom` with zero\n * warnings.\n *\n * @param code - `\"B1\"` billing, `\"B2\"` reversal, or `\"B3\"` rebill.\n * @param options - The seed. See {@link GenerateTelecomOptions}.\n * @returns The serialized Telecom wire string.\n * @example\n * ```ts\n * import { generateTelecom } from \"@cosyte/synth/ncpdp\";\n * const wire = generateTelecom(\"B1\", { seed: 42 });\n * ```\n */\nexport function generateTelecom(\n code: TelecomTransactionCode,\n options: GenerateTelecomOptions,\n): string {\n const rng = createRng(options.seed);\n const pharmacy = ncpdpPharmacy(rng);\n const head = header(rng, code, pharmacy.npi);\n const segments: TelecomSegmentInput[] =\n code === \"B2\"\n ? [insuranceSegment(rng), claimSegment(rng, true)]\n : [\n patientSegment(rng),\n insuranceSegment(rng),\n prescriberSegment(rng),\n claimSegment(rng, false),\n ];\n return serializeTelecom(buildTelecomRequest({ header: head, segments }));\n}\n\n/**\n * Generate a spec-clean Telecom **B1** billing claim.\n *\n * @param options - The seed.\n * @returns The serialized Telecom wire string.\n * @example\n * ```ts\n * import { generateB1 } from \"@cosyte/synth/ncpdp\";\n * const wire = generateB1({ seed: 1 });\n * ```\n */\nexport function generateB1(options: GenerateTelecomOptions): string {\n return generateTelecom(\"B1\", options);\n}\n\n/**\n * Generate a spec-clean Telecom **B2** reversal.\n *\n * @param options - The seed.\n * @returns The serialized Telecom wire string.\n * @example\n * ```ts\n * import { generateB2 } from \"@cosyte/synth/ncpdp\";\n * const wire = generateB2({ seed: 1 });\n * ```\n */\nexport function generateB2(options: GenerateTelecomOptions): string {\n return generateTelecom(\"B2\", options);\n}\n\n/**\n * Generate a spec-clean Telecom **B3** rebill.\n *\n * @param options - The seed.\n * @returns The serialized Telecom wire string.\n * @example\n * ```ts\n * import { generateB3 } from \"@cosyte/synth/ncpdp\";\n * const wire = generateB3({ seed: 1 });\n * ```\n */\nexport function generateB3(options: GenerateTelecomOptions): string {\n return generateTelecom(\"B3\", options);\n}\n","/**\n * The **round-trip-through-the-parser harness** for NCPDP — the headline gate for the synthetic-fixture\n * generator. A generated SCRIPT XML or Telecom claim is \"spec-clean\" only if\n * `@cosyte/ncpdp` — not `@cosyte/synth`'s own opinion — reads it back cleanly. Each harness parses the\n * generated wire text straight back through the parser and reports what it found, so a false\n * \"spec-clean\" claim cannot hide.\n *\n * SCRIPT and Telecom are two structurally unrelated standards, so each gets its own harness; both\n * report the same {@link RoundTripResult} shape.\n *\n * @module\n */\n\nimport { parseScript, serializeScript } from \"@cosyte/ncpdp/script\";\nimport { parseTelecom, serializeTelecom } from \"@cosyte/ncpdp/telecom\";\n\n/** The verdict of one round-trip through `@cosyte/ncpdp`. */\nexport interface RoundTripResult {\n /** The serialized NCPDP wire text (the serializer's own conservative emit). */\n readonly content: string;\n /** The warning codes the parser emitted on re-parse. Empty ⇒ spec-clean. */\n readonly warnings: readonly string[];\n /** Whether re-serializing the re-parsed message is byte-identical to `content`. */\n readonly byteStable: boolean;\n /** `true` iff the artifact is spec-clean: zero warnings **and** byte-stable. */\n readonly specClean: boolean;\n}\n\n/**\n * Round-trip a generated **SCRIPT** XML string through parse → serialize and report the verdict. A\n * spec-clean message re-parses with **zero warnings** and re-serializes byte-identically.\n *\n * @param xml - The SCRIPT XML (typically from `generateNewRx` / `generateRxRenewalRequest` / …).\n * @returns The {@link RoundTripResult}.\n * @example\n * ```ts\n * import { generateNewRx, scriptRoundTrip } from \"@cosyte/synth/ncpdp\";\n * const { specClean } = scriptRoundTrip(generateNewRx({ seed: 1 })); // specClean === true\n * ```\n */\nexport function scriptRoundTrip(xml: string): RoundTripResult {\n const message = parseScript(xml);\n const warnings = message.warnings.map((w) => String(w.code));\n const byteStable = serializeScript(message) === xml;\n return { content: xml, warnings, byteStable, specClean: warnings.length === 0 && byteStable };\n}\n\n/**\n * Round-trip a generated **Telecom** wire string through parse → serialize and report the verdict. A\n * spec-clean transaction re-parses with **zero warnings** and re-serializes byte-identically.\n *\n * @param wire - The Telecom wire string (typically from `generateB1` / `generateB2` / `generateB3`).\n * @returns The {@link RoundTripResult}.\n * @example\n * ```ts\n * import { generateB1, telecomRoundTrip } from \"@cosyte/synth/ncpdp\";\n * const { specClean } = telecomRoundTrip(generateB1({ seed: 1 })); // specClean === true\n * ```\n */\nexport function telecomRoundTrip(wire: string): RoundTripResult {\n const transaction = parseTelecom(wire);\n const warnings = transaction.warnings.map((w) => String(w.code));\n const byteStable = serializeTelecom(transaction) === wire;\n return { content: wire, warnings, byteStable, specClean: warnings.length === 0 && byteStable };\n}\n","/**\n * `@cosyte/synth/ncpdp` — the NCPDP generation surface, exposed as its own subpath so importing the\n * package root does **not** pull `@cosyte/ncpdp`. This is the **lazy, per-format** boundary: a consumer\n * who only needs NCPDP fixtures imports `@cosyte/synth/ncpdp`; one who needs only the core primitives\n * never loads a parser.\n * `@cosyte/ncpdp` is an **optional peer dependency** — present only for this subpath.\n *\n * This subpath ships spec-clean generation across both NCPDP standards, each built through\n * `@cosyte/ncpdp`'s own emit surface:\n *\n * - **SCRIPT** ePrescribing (`@cosyte/ncpdp/script`): `generateNewRx` (via the validated `buildNewRx`\n * builder), `generateRxRenewalRequest`, and `generateRxChangeRequest` (via the parser's public typed\n * `ScriptMessage` model + `serializeScript`) — each round-tripping through `parseScript` with zero\n * warnings, and carrying a prescriber whose NPI is invalid-Luhn and whose **DEA is invalid-checksum**.\n * - **Telecom** claims (`@cosyte/ncpdp/telecom`): `generateB1` (billing), `generateB2` (reversal), and\n * `generateB3` (rebill) via `buildTelecomRequest` + `serializeTelecom` — each round-tripping through\n * `parseTelecom` with zero warnings, with patient / cardholder identity from the synthetic providers.\n *\n * **Deferred:** **quirk mode**. SCRIPT is limited to the transactions `@cosyte/ncpdp` can *build* — NewRx\n * plus the\n * renewal/change **requests**; the renewal/change *responses* and the reversal cases beyond B2's\n * reference set track the parser's builder surface, never hand-written bytes.\n *\n * @module\n */\n\nimport { createRng } from \"../rng/rng.js\";\nimport { makeCorpus, type Corpus } from \"../corpus.js\";\n\nimport { generateNewRx, generateRxRenewalRequest, generateRxChangeRequest } from \"./script.js\";\nimport { generateTelecom } from \"./telecom.js\";\nimport { scriptRoundTrip, telecomRoundTrip } from \"./round-trip.js\";\n\nexport {\n generateNewRx,\n generateRxRenewalRequest,\n generateRxChangeRequest,\n type GenerateScriptOptions,\n} from \"./script.js\";\nexport {\n generateTelecom,\n generateB1,\n generateB2,\n generateB3,\n type TelecomTransactionCode,\n type GenerateTelecomOptions,\n} from \"./telecom.js\";\nexport { scriptRoundTrip, telecomRoundTrip, type RoundTripResult } from \"./round-trip.js\";\nexport {\n ncpdpPatient,\n ncpdpPrescriber,\n ncpdpPharmacy,\n ncpdpCardholder,\n ncpdpScriptRouting,\n type NcpdpPatient,\n type NcpdpPrescriber,\n type NcpdpPharmacy,\n type NcpdpCardholder,\n type NcpdpScriptRouting,\n} from \"./identity.js\";\nexport {\n EXAMPLE_DRUGS,\n EXAMPLE_SIG_TEXT,\n DAW_CODES,\n type NcpdpExampleDrug,\n} from \"./example-codes.js\";\n\n/** Every NCPDP transaction kind {@link ncpdpCorpus} generates — the label used as the corpus `kind`. */\nexport type NcpdpCorpusKind = \"NewRx\" | \"RxRenewalRequest\" | \"RxChangeRequest\" | \"B1\" | \"B2\" | \"B3\";\n\n/** The default transaction mix for {@link ncpdpCorpus} — one of each shipped transaction. */\nconst DEFAULT_MIX: readonly NcpdpCorpusKind[] = Object.freeze([\n \"NewRx\",\n \"RxRenewalRequest\",\n \"RxChangeRequest\",\n \"B1\",\n \"B2\",\n \"B3\",\n]);\n\n/** Generate one transaction of the given kind from a sub-seed, returning the round-trip verdict. */\nfunction generateKind(kind: NcpdpCorpusKind, seed: number): ReturnType<typeof scriptRoundTrip> {\n switch (kind) {\n case \"NewRx\":\n return scriptRoundTrip(generateNewRx({ seed }));\n case \"RxRenewalRequest\":\n return scriptRoundTrip(generateRxRenewalRequest({ seed }));\n case \"RxChangeRequest\":\n return scriptRoundTrip(generateRxChangeRequest({ seed }));\n case \"B1\":\n case \"B2\":\n case \"B3\":\n return telecomRoundTrip(generateTelecom(kind, { seed }));\n }\n}\n\n/** Options for {@link ncpdpCorpus}. */\nexport interface NcpdpCorpusOptions {\n /** The seed for the whole corpus (deterministic). */\n readonly seed: number;\n /** How many transactions to generate. Defaults to the length of the mix. */\n readonly count?: number;\n /** The transaction kinds to cycle through. Defaults to one of each. */\n readonly mix?: readonly NcpdpCorpusKind[];\n}\n\n/**\n * Build a reproducible {@link Corpus} of spec-clean NCPDP transactions. Each transaction is generated\n * from a distinct sub-seed derived from the corpus seed (so the set is deterministic) and round-tripped\n * through `@cosyte/ncpdp`; the per-artifact `warnings` record the parser's verdict (empty ⇒ spec-clean).\n *\n * @param options - Seed, count, and the transaction mix. See {@link NcpdpCorpusOptions}.\n * @returns A deep-frozen {@link Corpus}.\n * @example\n * ```ts\n * import { ncpdpCorpus } from \"@cosyte/synth/ncpdp\";\n * const corpus = ncpdpCorpus({ seed: 42 });\n * corpus.artifacts.every((a) => a.warnings.length === 0); // true — spec-clean\n * ```\n */\nexport function ncpdpCorpus(options: NcpdpCorpusOptions): Corpus {\n const { seed, mix = DEFAULT_MIX } = options;\n const count = options.count ?? mix.length;\n const seedStream = createRng(seed);\n const artifacts = Array.from({ length: count }, (_unused, i) => {\n const kind = mix[i % mix.length] ?? \"NewRx\";\n const txSeed = seedStream.nextUint32();\n const rt = generateKind(kind, txSeed);\n return {\n format: \"ncpdp\" as const,\n kind,\n content: rt.content,\n warnings: rt.warnings,\n };\n });\n return makeCorpus(seed, artifacts);\n}\n"]}
1
+ {"version":3,"sources":["../../src/rng/splitmix32.ts","../../src/rng/sfc32.ts","../../src/codes.ts","../../src/rng/rng.ts","../../src/corpus.ts","../../src/safe/reserved.ts","../../src/safe/names-pool.ts","../../src/safe/providers.ts","../../src/safe/index.ts","../../src/ncpdp/identity.ts","../../src/ncpdp/example-codes.ts","../../src/ncpdp/script.ts","../../src/ncpdp/telecom.ts","../../src/ncpdp/round-trip.ts","../../src/select.ts","../../src/ncpdp/index.ts"],"names":["phone","address","npi","dea","codedValue","decimalValue","buildNewRx","serializeScript","header","ScriptMessage","serializeTelecom","buildTelecomRequest","parseScript","parseTelecom"],"mappings":";;;;;;;AA0BO,SAAS,WAAW,IAAA,EAA4B;AACrD,EAAA,IAAI,IAAI,IAAA,GAAO,CAAA;AACf,EAAA,OAAO,SAAS,IAAA,GAAe;AAC7B,IAAA,CAAA,GAAK,IAAI,UAAA,GAAc,CAAA;AACvB,IAAA,IAAI,CAAA,GAAI,IAAK,CAAA,KAAM,EAAA;AACnB,IAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,SAAU,CAAA;AAC3B,IAAA,CAAA,GAAI,IAAK,CAAA,KAAM,EAAA;AACf,IAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,UAAU,CAAA;AAC3B,IAAA,CAAA,GAAI,IAAK,CAAA,KAAM,EAAA;AACf,IAAA,OAAO,CAAA,KAAM,CAAA;AAAA,EACf,CAAA;AACF;;;ACOO,SAAS,UAAU,CAAA,EAAuB;AAC/C,EAAA,CAAA,CAAE,CAAA,IAAK,CAAA;AACP,EAAA,CAAA,CAAE,CAAA,IAAK,CAAA;AACP,EAAA,CAAA,CAAE,CAAA,IAAK,CAAA;AACP,EAAA,CAAA,CAAE,CAAA,IAAK,CAAA;AACP,EAAA,MAAM,KAAO,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAK,CAAA,IAAK,EAAE,CAAA,GAAK,CAAA;AACtC,EAAA,CAAA,CAAE,CAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,GAAK,CAAA;AAClB,EAAA,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAK,CAAA,CAAE,CAAA,KAAM,CAAA;AACrB,EAAA,CAAA,CAAE,CAAA,GAAK,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,KAAK,CAAA,CAAA,GAAM,CAAA;AAC3B,EAAA,CAAA,CAAE,CAAA,GAAK,CAAA,CAAE,CAAA,IAAK,EAAA,GAAO,EAAE,CAAA,KAAM,EAAA;AAC7B,EAAA,CAAA,CAAE,CAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,GAAK,CAAA;AAClB,EAAA,OAAO,CAAA,KAAM,CAAA;AACf;;;AC5BO,IAAM,iBAAA,GAAoB;AAAA,EA6BR;AAAA,EAEvB,mBAAA,EAAqB,qBAAA;AAAA;AAAA,EAErB,gBAAA,EAAkB,kBAAA;AAAA,EAEK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,sBAAA,EAAwB;AAC1B,CAAA;AA0BO,IAAM,oBAAA,GAAiE,OAAO,MAAA,CAAO;AAAA,EAC1F,wBAAA,EACE,mJAAA;AAAA,EAEF,uBAAA,EACE,8KAAA;AAAA,EAEF,yBAAA,EACE,oKAAA;AAAA,EAEF,+BAAA,EACE,oJAAA;AAAA,EAEF,0BAAA,EACE,mFAAA;AAAA,EACF,qBAAA,EAAuB,gDAAA;AAAA,EACvB,mBAAA,EAAqB,oEAAA;AAAA,EACrB,gBAAA,EAAkB,uCAAA;AAAA,EAClB,qBAAA,EAAuB,sDAAA;AAAA,EACvB,sBAAA,EACE;AAEJ,CAAC,CAAA;AAgBM,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA;AAAA,EAEpB,IAAA;AAAA;AAAA;AAAA;AAAA,EAKT,YAAY,IAAA,EAAsB;AACvC,IAAA,KAAA,CAAM,oBAAA,CAAqB,IAAI,CAAC,CAAA;AAChC,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF,CAAA;;;ACrFA,IAAM,WAAN,MAA8B;AAAA,EACZ,IAAA;AAAA,EACP,MAAA;AAAA,EAEF,YAAY,IAAA,EAAc;AAC/B,IAAA,IAAA,CAAK,OAAO,IAAA,GAAO,CAAA;AAGnB,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,CAAA,EAAG,GAAA,EAAI,EAAG,CAAA,EAAG,GAAA,EAAI,EAAG,CAAA,EAAG,GAAA,EAAI,EAAG,CAAA,EAAG,KAAI,EAAE;AAEvD,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,EACtD;AAAA,EAEO,UAAA,GAAqB;AAC1B,IAAA,OAAO,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,EAC9B;AAAA,EAEO,KAAA,GAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,YAAW,GAAI,UAAA;AAAA,EAC7B;AAAA,EAEO,GAAA,CAAI,KAAa,GAAA,EAAqB;AAC3C,IAAA,IAAI,MAAM,GAAA,EAAK,MAAM,IAAI,UAAA,CAAW,kBAAkB,mBAAmB,CAAA;AACzE,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,GAAM,CAAA;AACzB,IAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,KAAU,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEO,IAAA,CAAK,IAAI,GAAA,EAAc;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAM,GAAI,CAAA;AAAA,EACxB;AAAA,EAEO,KAAQ,KAAA,EAAwB;AACrC,IAAA,IAAI,MAAM,MAAA,KAAW,CAAA,QAAS,IAAI,UAAA,CAAW,kBAAkB,gBAAgB,CAAA;AAG/E,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EAC5C;AAAA,EAEO,OAAO,CAAA,EAAmB;AAC/B,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC3D,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAA;AAcO,SAAS,UAAU,IAAA,EAAmB;AAC3C,EAAA,OAAO,IAAI,SAAS,IAAI,CAAA;AAC1B;;;ACzDO,SAAS,UAAA,CACd,IAAA,EACA,SAAA,EACA,MAAA,GAA4B,EAAC,EACrB;AACR,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAiB;AACrC,EAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM;AAC3C,IAAA,MAAA,CAAO,EAAE,IAAI,CAAA,GAAA,CAAK,OAAO,CAAA,CAAE,IAAI,KAAK,CAAA,IAAK,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAE,MAAM,CAAA;AACpB,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,GAAG,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,CAAA,CAAE,QAAQ,CAAC,GAAG,CAAA;AAAA,EACzE,CAAC,CAAA;AACD,EAAA,MAAM,QAAA,GAA2B,OAAO,MAAA,CAAO;AAAA,IAC7C,SAAS,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,OAAO,CAAC,CAAA;AAAA,IACnC,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,IAC5B,QAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,MAAM,CAAC;AAAA,GAClC,CAAA;AACD,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,IAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW,MAAA,CAAO,MAAA,CAAO,eAAe;AAAA,GACzC,CAAA;AACH;;;ACrDO,IAAM,6BAAA,GAAgC,OAAO,MAAA,CAAO;AAAA;AAAA,EAEzD,WAAA,EAAa,cAAA;AAAA;AAAA,EAEb,WAAA,EAAa,0BAAA;AAAA;AAAA,EAEb,eAAA,EAAiB;AACnB,CAAC,CAAA;AAGM,IAAM,sBAAA,GAA4C,OAAO,MAAA,CAAO;AAAA,EACrE,aAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGM,IAAM,oBAAA,GAA0C,OAAO,MAAA,CAAO;AAAA,EACnE,SAAA;AAAA;AAAA,EACA,YAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAC,CAAA;AAGM,IAAM,aAAA,GAAgB,UAAA;AAOtB,IAAM,eAAA,GAAkB,OAAA;AAUxB,SAAS,UAAU,MAAA,EAAwB;AAChD,EAAA,IAAI,GAAA,GAAM,CAAA;AAKV,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,KAAA,IAAS,IAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EAAG;AAC9C,IAAA,IAAI,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,GAAI,EAAA;AAC/B,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AACpB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,CAAA,IAAK,CAAA;AACL,MAAA,IAAI,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAAA,IAClB;AACA,IAAA,GAAA,IAAO,CAAA;AACP,IAAA,MAAA,GAAS,CAAC,MAAA;AAAA,EACZ;AACA,EAAA,OAAO,GAAA,GAAM,EAAA;AACf;AAcO,SAAS,cAAc,KAAA,EAAuB;AAEnD,EAAA,MAAM,UAAU,SAAA,CAAU,CAAA,EAAG,eAAe,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,CAAA;AACvD,EAAA,OAAA,CAAQ,KAAK,OAAA,IAAW,EAAA;AAC1B;AAUO,IAAM,oBAAA,GAA0C,OAAO,MAAA,CAAO;AAAA,EACnE,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAC,CAAA;AAeM,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA,GAAI,EAAA;AACpC,IAAA,IAAI,CAAA,GAAI,CAAA,KAAM,CAAA,EAAG,GAAA,IAAO,KAAA;AAAA,SACnB,IAAA,IAAQ,KAAA;AAAA,EACf;AACA,EAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,IAAQ,EAAA;AAC5B;;;AC5IO,IAAM,qBAAA,GAA2C,OAAO,MAAA,CAAO;AAAA,EACpE,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGM,IAAM,sBAAA,GAA4C,OAAO,MAAA,CAAO;AAAA,EACrE,WAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGM,IAAM,sBAAA,GAA4C,OAAO,MAAA,CAAO;AAAA,EACrE,cAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAMM,IAAM,oBAAA,GAA0C,OAAO,MAAA,CAAO;AAAA,EACnE,SAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;;;ACLM,SAAS,GAAA,CAAI,GAAA,EAAU,KAAA,GAAkB,cAAA,EAAwB;AACtE,EAAA,IAAI,UAAU,aAAA,EAAe;AAE3B,IAAA,OAAO,aAAa,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA,CAAA;AAAA,EAC3C;AACA,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA;AAC3B,EAAA,OAAO,GAAG,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA,EAAI,KAAK,IAAI,MAAM,CAAA,CAAA;AAC3C;AAeO,SAAS,MAAM,GAAA,EAAkB;AACtC,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAC/B,EAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA;AAC9B;AAaO,SAAS,KAAK,GAAA,EAAyB;AAC5C,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,qBAAqB,GAAG,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,sBAAsB,CAAA,EAAE;AAC5F;AAcO,SAAS,KAAA,CAAM,KAAU,MAAA,EAAgC;AAC9D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,sBAAsB,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,CAAA,CAAA,CAAG,aAAY,GAAI,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAC9F,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC1B;AAaO,SAAS,KAAK,GAAA,EAAkB;AACrC,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,oBAAoB,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA,CAAA;AACrE;AAaO,SAAS,KAAK,GAAA,EAAkB;AACrC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,EAAW,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA;AACpE,EAAA,OAAO,CAAA,EAAG,aAAa,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AAClC;AAeO,SAAS,KAAK,GAAA,EAAkB;AACrC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,IAAK,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA;AACzD,EAAA,KAAA,CAAM,CAAC,CAAA,GAAA,CAAM,KAAA,CAAM,CAAC,CAAA,IAAK,KAAK,EAAA,GAAQ,EAAA;AACtC,EAAA,KAAA,CAAM,CAAC,CAAA,GAAA,CAAM,KAAA,CAAM,CAAC,CAAA,IAAK,KAAK,EAAA,GAAQ,GAAA;AACtC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AACpE,EAAA,OAAO,CAAA,EAAG,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AACvJ;AAgBO,SAAS,IAAI,GAAA,EAAkB;AACpC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA;AAC1B,EAAA,MAAM,UAAA,GAAA,CAAc,aAAA,CAAc,KAAK,CAAA,GAAI,CAAA,IAAK,EAAA;AAChD,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA;AACtC;AAoBO,SAAS,GAAA,CAAI,KAAU,MAAA,EAAgC;AAC5D,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,oBAAoB,CAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,MAAA,IAAU,GAAA,CAAI,KAAK,sBAAsB,CAAA;AACvE,EAAA,MAAM,UAAU,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY;AACtD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA;AAC1B,EAAA,MAAM,UAAA,GAAA,CAAc,aAAA,CAAc,KAAK,CAAA,GAAI,CAAA,IAAK,EAAA;AAChD,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,OAAO,GAAG,KAAK,CAAA,EAAG,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA;AACvD;AAgBO,SAAS,UAAA,CACd,GAAA,EACA,QAAA,GAA4C,IAAA,EACvB;AACrB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA;AAAA,IACnB,QAAA;AAAA,IACA,oBAAoB,6BAAA,CAA8B,WAAA;AAAA,IAClD,uBAAuB,6BAAA,CAA8B;AAAA,GACvD;AACF;AAcO,SAAS,QAAQ,GAAA,EAA4B;AAClD,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,GAAG,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,IAAA,CAAK,sBAAsB,CAAC,CAAA,CAAA;AAAA,IAC7D,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,oBAAoB,CAAA;AAAA,IACnC,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AAAA,IACzB,GAAA,EAAK;AAAA,GACP;AACF;AAgBO,SAAS,OAAA,CAAQ,GAAA,EAAU,OAAA,GAAU,IAAA,EAAM,UAAU,IAAA,EAAc;AACxE,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAC3B,EAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAM,KAAA,EAAO,CAAC,CAAC,CAAA,CAAE,UAAA,EAAW;AAClE,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,WAAW,CAAA;AAClC,EAAA,OAAO,CAAA,EAAG,OAAO,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,MAAA,CAAO,KAAK,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,MAAA,CAAO,GAAG,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACzG;AAGA,IAAM,SAAA,GAA+B,OAAO,MAAA,CAAO;AAAA,EACjD,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC,CAAA;;;AClUM,IAAM,IAAA,GAAO,OAAO,MAAA,CAAO;AAAA,EAChC,GAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAC,CAAA;;;AC/BD,IAAM,wBAAA,GAA8C,OAAO,MAAA,CAAO;AAAA,EAChE,0BAAA;AAAA,EACA,mBAAA;AAAA,EACA,yBAAA;AAAA,EACA,uBAAA;AAAA,EACA;AACF,CAAC,CAAA;AA+DM,SAAS,aAAa,GAAA,EAAwB;AACnD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,MAAM,IAAI,CAAA;AACxC,EAAA,MAAM,SAAS,GAAA,CAAI,IAAA,CAAK,CAAC,GAAA,EAAK,GAAG,CAAU,CAAA;AAC3C,EAAA,MAAM,YAAY,CAAA,GAAA,EAAM,IAAA,CAAK,WAAW,GAAA,EAAK,IAAI,EAAE,KAAK,CAAA,CAAA;AACxD,EAAA,MAAMA,MAAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,MAAMC,QAAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAChC,EAAA,OAAO,EAAE,QAAQ,GAAA,EAAK,MAAA,EAAQ,WAAW,KAAA,EAAAD,MAAAA,EAAO,SAAAC,QAAAA,EAAQ;AAC1D;AAeO,SAAS,gBAAgB,GAAA,EAA2B;AACzD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,MAAMC,IAAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,MAAMC,IAAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAChC,EAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAAD,IAAAA,EAAK,KAAAC,IAAAA,EAAI;AAC5B;AAeO,SAAS,cAAc,GAAA,EAAyB;AACrD,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,IAAA,CAAK,wBAAwB,CAAA;AACtD,EAAA,MAAMD,IAAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA;AAC5B,EAAA,OAAO,EAAE,YAAA,EAAc,GAAA,EAAAA,IAAAA,EAAK,OAAA,EAAQ;AACtC;AAcO,SAAS,gBAAgB,GAAA,EAA2B;AACzD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,MAAM,eAAe,CAAA,GAAA,EAAM,IAAA,CAAK,WAAW,GAAA,EAAK,IAAI,EAAE,KAAK,CAAA,CAAA;AAC3D,EAAA,MAAM,OAAA,GAAU,CAAA,GAAA,EAAM,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AACnC,EAAA,MAAM,aAAa,GAAA,CAAI,IAAA,CAAK,CAAC,IAAA,EAAM,IAAA,EAAM,IAAI,CAAU,CAAA;AACvD,EAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,OAAA,EAAS,UAAA,EAAW;AACrD;AA2BO,SAAS,mBAAmB,GAAA,EAA8B;AAC/D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,MAAM,IAAI,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC5B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACjD,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACjD,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAA,MAAA,EAAS,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA;AAAA,IAClC,QAAA,EAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,IAAA,CAAA;AAAA,IACzC,qBAAA,EAAuB,CAAA,GAAA,EAAM,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,IAC1C;AAAA,GACF;AACF;;;AC1KO,IAAM,aAAA,GAA6C,OAAO,MAAA,CAAO;AAAA,EACtE,EAAE,WAAA,EAAa,iCAAA,EAAmC,GAAA,EAAK,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EACjF,EAAE,WAAA,EAAa,8BAAA,EAAgC,GAAA,EAAK,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EAC9E,EAAE,WAAA,EAAa,gCAAA,EAAkC,GAAA,EAAK,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EAChF,EAAE,WAAA,EAAa,8BAAA,EAAgC,GAAA,EAAK,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EAC9E,EAAE,WAAA,EAAa,6BAAA,EAA+B,GAAA,EAAK,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EAC7E,EAAE,WAAA,EAAa,0CAAA,EAA4C,GAAA,EAAK,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EAC1F,EAAE,WAAA,EAAa,kCAAA,EAAoC,GAAA,EAAK,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EAClF,EAAE,WAAA,EAAa,iCAAA,EAAmC,GAAA,EAAK,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EACjF,EAAE,WAAA,EAAa,8BAAA,EAAgC,GAAA,EAAK,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EAC9E,EAAE,WAAA,EAAa,uCAAA,EAAyC,GAAA,EAAK,aAAA,EAAe,MAAM,IAAA;AACpF,CAAC;AAGM,IAAM,gBAAA,GAAsC,OAAO,MAAA,CAAO;AAAA,EAC/D,mCAAA;AAAA,EACA,+CAAA;AAAA,EACA,kDAAA;AAAA,EACA,mCAAA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,YAA+B,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC;;;ACPzE,IAAM,cAAA,GAAiB,SAAA;AASvB,SAAS,aAAa,GAAA,EAAmB;AACvC,EAAA,MAAM,CAAA,GAAI,aAAa,GAAG,CAAA;AAC1B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,QAAA,EAAU,CAAA,CAAE,OAAO,MAAA,EAAQ,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM;AAAA,IAC7D,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,aAAa,CAAA,CAAE;AAAA,GACjB;AACF;AAGA,SAAS,cAAc,GAAA,EAAoB;AACzC,EAAA,MAAM,EAAA,GAAK,cAAc,GAAG,CAAA;AAC5B,EAAA,OAAO;AAAA,IACL,cAAc,EAAA,CAAG,YAAA;AAAA,IACjB,gBAAgB,EAAE,GAAA,EAAK,GAAG,GAAA,EAAK,OAAA,EAAS,GAAG,OAAA;AAAQ,GACrD;AACF;AAGA,SAAS,gBAAgB,GAAA,EAAsB;AAC7C,EAAA,MAAM,EAAA,GAAK,gBAAgB,GAAG,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,QAAA,EAAU,EAAA,CAAG,OAAO,MAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,MAAA,CAAO,KAAA,EAAM;AAAA,IAC/D,gBAAgB,EAAE,GAAA,EAAK,GAAG,GAAA,EAAK,SAAA,EAAW,GAAG,GAAA;AAAI,GACnD;AACF;AAGA,SAAS,eAAA,CAAgB,KAAU,OAAA,EAAmD;AACpF,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,GAAG,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,QAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACnG,EAAA,OAAO;AAAA,IACL,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,OAAO,EAAE,WAAA,EAAaE,kBAAW,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA,EAAE;AAAA,IACjD,QAAA,EAAU;AAAA,MACR,KAAA,EAAOC,oBAAa,MAAA,CAAO,GAAA,CAAI,IAAI,EAAA,EAAI,EAAE,CAAC,CAAC,CAAA;AAAA,MAC3C,eAAe,IAAA,CAAK,IAAA;AAAA,MACpB,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA,UAAA,EAAYA,mBAAA,CAAa,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAU,CAAC,CAAC,CAAA;AAAA,IAChE,iBAAiB,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACrC,eAAe,GAAA,CAAI,IAAA,CAAK,CAAC,GAAA,EAAK,GAAG,CAAU,CAAA;AAAA,IAC3C,WAAA,EAAa,OAAA;AAAA,IACb,OAAA,EAAS,GAAA,CAAI,IAAA,CAAK,gBAAgB;AAAA,GACpC;AACF;AAGA,SAAS,YAAY,OAAA,EAA2C;AAC9D,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,cAAA;AAAA,IACT,IAAA,EAAM,iBAAA;AAAA,IACN,EAAA,EAAI,eAAA;AAAA,IACJ,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,uBAAuB,OAAA,CAAQ;AAAA,GACjC;AACF;AAeO,SAAS,cAAc,OAAA,EAAwC;AACpE,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,mBAAmB,GAAG,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,cAAc,GAAG,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,gBAAgB,GAAG,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,GAAA,EAAK,OAAO,CAAA;AAC/C,EAAA,MAAM,UAAUC,iBAAA,CAAW;AAAA,IACzB,MAAA,EAAQ,YAAY,OAAO,CAAA;AAAA,IAC3B,OAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAOC,uBAAgB,OAAO,CAAA;AAChC;AAGA,SAAS,gBAAgB,GAAA,EAOvB;AACA,EAAA,MAAM,OAAA,GAAU,mBAAmB,GAAG,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,sBAAA,EAAwB,CAAA,GAAA,EAAM,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,IAC3C,OAAA,EAAS,aAAa,GAAG,CAAA;AAAA,IACzB,QAAA,EAAU,cAAc,GAAG,CAAA;AAAA,IAC3B,UAAA,EAAY,gBAAgB,GAAG,CAAA;AAAA,IAC/B,oBAAA,EAAsB,eAAA,CAAgB,GAAA,EAAK,OAAO,CAAA;AAAA,IAClD,MAAA,EAAQ,YAAY,OAAO;AAAA,GAC7B;AACF;AAgBO,SAAS,yBAAyB,OAAA,EAAwC;AAC/E,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAClC,EAAA,MAAM,EAAE,MAAA,EAAAC,OAAAA,EAAQ,GAAG,MAAA,EAAO,GAAI,gBAAgB,GAAG,CAAA;AACjD,EAAA,MAAM,IAAA,GAAyB,EAAE,IAAA,EAAM,kBAAA,EAAoB,GAAG,MAAA,EAAO;AACrE,EAAA,OAAOD,sBAAA,CAAgB,IAAIE,oBAAA,CAAc,EAAE,MAAA,EAAAD,OAAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,EAAC,EAAG,CAAC,CAAA;AAC1E;AAgBO,SAAS,wBAAwB,OAAA,EAAwC;AAC9E,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAClC,EAAA,MAAM,EAAE,MAAA,EAAAA,OAAAA,EAAQ,GAAG,MAAA,EAAO,GAAI,gBAAgB,GAAG,CAAA;AACjD,EAAA,MAAM,IAAA,GAAwB,EAAE,IAAA,EAAM,iBAAA,EAAmB,GAAG,MAAA,EAAO;AACnE,EAAA,OAAOD,sBAAA,CAAgB,IAAIE,oBAAA,CAAc,EAAE,MAAA,EAAAD,OAAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,EAAC,EAAG,CAAC,CAAA;AAC1E;AC/KA,IAAM,aAAA,GAAgB,QAAA;AAStB,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;AAGA,SAAS,MAAA,CACP,GAAA,EACA,eAAA,EACA,WAAA,EACoB;AACpB,EAAA,MAAM,IAAA,GAAO,YAAY,GAAG,CAAA;AAC5B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,aAAA;AAAA,IACX,cAAA,EAAgB,IAAA;AAAA,IAChB,eAAA;AAAA,IACA,sBAAA,EAAwB,CAAA,GAAA,EAAM,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,IAC3C,gBAAA,EAAkB,GAAA;AAAA,IAClB,0BAAA,EAA4B,IAAA;AAAA;AAAA,IAC5B,iBAAA,EAAmB,WAAA;AAAA,IACnB,aAAA,EAAe,IAAA;AAAA,IACf,uBAAA,EAAyB,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,GAC7C;AACF;AAGA,SAAS,YAAY,GAAA,EAAkB;AACrC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AACzB,EAAA,OAAO,GAAG,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,GAAG,MAAA,CAAO,GAAG,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACxF;AAGA,SAAS,KAAA,CAAM,IAAY,KAAA,EAAkC;AAC3D,EAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AACrB;AAGA,SAAS,eAAe,GAAA,EAA+B;AACrD,EAAA,MAAM,CAAA,GAAI,aAAa,GAAG,CAAA;AAC1B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,GAAG,CAAA;AAAA,MACjB,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA;AAAA,MACpB,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,MAC1B,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAAA,MAC3B,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,MAC5B,KAAA,CAAM,IAAA,EAAM,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MAC/B,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,SAAS;AAAA;AACzB,GACF;AACF;AAGA,SAAS,iBAAiB,GAAA,EAA+B;AACvD,EAAA,MAAM,CAAA,GAAI,gBAAgB,GAAG,CAAA;AAC7B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,YAAY,CAAA;AAAA,MAC1B,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,OAAO,CAAA;AAAA,MACrB,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,UAAU,CAAA;AAAA,MACxB,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,MAC1B,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,MAAM;AAAA;AAC7B,GACF;AACF;AAGA,SAAS,kBAAkB,GAAA,EAA+B;AACxD,EAAA,MAAM,EAAA,GAAK,gBAAgB,GAAG,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ,CAAC,KAAA,CAAM,IAAA,EAAM,IAAI,GAAG,KAAA,CAAM,IAAA,EAAM,EAAA,CAAG,GAAG,CAAC;AAAA,GACjD;AACF;AAGA,SAAS,YAAA,CAAa,KAAU,OAAA,EAAuC;AACrE,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAChC,EAAA,MAAM,OAAO,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AACjC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,MAAA,EAAQ,CAAC,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA,EAAG,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA,EAAG,KAAA,CAAM,IAAA,EAAM,IAAI,CAAC;AAAA,KAClE;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,KAAA,CAAM,MAAM,GAAG,CAAA;AAAA;AAAA,MACf,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,MACjB,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,MAChB,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA;AAAA,MAChB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACpB,KAAA,CAAM,MAAM,MAAA,CAAO,GAAA,CAAI,IAAI,EAAA,EAAI,EAAE,CAAC,CAAC,CAAA;AAAA,MACnC,KAAA,CAAM,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAU,CAAC,CAAC,CAAA;AAAA,MACnD,KAAA,CAAM,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,SAAS,CAAC;AAAA;AACjC,GACF;AACF;AAmBO,SAAS,eAAA,CACd,MACA,OAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,cAAc,GAAG,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,EAAK,IAAA,EAAM,SAAS,GAAG,CAAA;AAC3C,EAAA,MAAM,QAAA,GACJ,IAAA,KAAS,IAAA,GACL,CAAC,gBAAA,CAAiB,GAAG,CAAA,EAAG,YAAA,CAAa,GAAA,EAAK,IAAI,CAAC,CAAA,GAC/C;AAAA,IACE,eAAe,GAAG,CAAA;AAAA,IAClB,iBAAiB,GAAG,CAAA;AAAA,IACpB,kBAAkB,GAAG,CAAA;AAAA,IACrB,YAAA,CAAa,KAAK,KAAK;AAAA,GACzB;AACN,EAAA,OAAOE,yBAAiBC,2BAAA,CAAoB,EAAE,QAAQ,IAAA,EAAM,QAAA,EAAU,CAAC,CAAA;AACzE;AAaO,SAAS,WAAW,OAAA,EAAyC;AAClE,EAAA,OAAO,eAAA,CAAgB,MAAM,OAAO,CAAA;AACtC;AAaO,SAAS,WAAW,OAAA,EAAyC;AAClE,EAAA,OAAO,eAAA,CAAgB,MAAM,OAAO,CAAA;AACtC;AAaO,SAAS,WAAW,OAAA,EAAyC;AAClE,EAAA,OAAO,eAAA,CAAgB,MAAM,OAAO,CAAA;AACtC;ACtLO,SAAS,gBAAgB,GAAA,EAA8B;AAC5D,EAAA,MAAM,OAAA,GAAUC,mBAAY,GAAG,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAaL,sBAAAA,CAAgB,OAAO,CAAA,KAAM,GAAA;AAChD,EAAA,OAAO,EAAE,SAAS,GAAA,EAAK,QAAA,EAAU,YAAY,SAAA,EAAW,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,UAAA,EAAW;AAC9F;AAcO,SAAS,iBAAiB,IAAA,EAA+B;AAC9D,EAAA,MAAM,WAAA,GAAcM,qBAAa,IAAI,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,YAAY,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAaH,wBAAAA,CAAiB,WAAW,CAAA,KAAM,IAAA;AACrD,EAAA,OAAO,EAAE,SAAS,IAAA,EAAM,QAAA,EAAU,YAAY,SAAA,EAAW,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,UAAA,EAAW;AAC/F;;;ACvBO,SAAS,WAAA,CAA8B,SAAuB,SAAA,EAAsB;AACzF,EAAA,MAAM,QAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,UAAU,SAAS,CAAA;AACzD,EAAA,IAAI,UAAU,MAAA,EAAW,MAAM,IAAI,UAAA,CAAW,kBAAkB,sBAAsB,CAAA;AACtF,EAAA,OAAO,KAAA;AACT;AAwBO,SAAS,UAAA,CACd,OAAA,EACA,SAAA,EACA,QAAA,EACc;AACd,EAAA,IAAI,SAAA,KAAc,QAAW,OAAO,QAAA;AACpC,EAAA,OAAO,UAAU,GAAA,CAAI,CAAC,UAAU,WAAA,CAAY,OAAA,EAAS,KAAK,CAAC,CAAA;AAC7D;;;ACJA,IAAM,SAAA,GAAwC,OAAO,MAAA,CAAO;AAAA,EAC1D,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,WAAA,GAAc,SAAA;AAGpB,SAAS,YAAA,CAAa,MAAuB,IAAA,EAAkD;AAC7F,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO,eAAA,CAAgB,aAAA,CAAc,EAAE,IAAA,EAAM,CAAC,CAAA;AAAA,IAChD,KAAK,kBAAA;AACH,MAAA,OAAO,eAAA,CAAgB,wBAAA,CAAyB,EAAE,IAAA,EAAM,CAAC,CAAA;AAAA,IAC3D,KAAK,iBAAA;AACH,MAAA,OAAO,eAAA,CAAgB,uBAAA,CAAwB,EAAE,IAAA,EAAM,CAAC,CAAA;AAAA,IAC1D,KAAK,IAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,OAAO,iBAAiB,eAAA,CAAgB,IAAA,EAAM,EAAE,IAAA,EAAM,CAAC,CAAA;AAAA;AAE7D;AA0BO,SAAS,YAAY,OAAA,EAAqC;AAC/D,EAAA,MAAM,EAAE,MAAK,GAAI,OAAA;AACjB,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,SAAA,EAAW,OAAA,CAAQ,KAAK,WAAW,CAAA;AAC1D,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,GAAA,CAAI,MAAA;AACnC,EAAA,MAAM,UAAA,GAAa,UAAU,IAAI,CAAA;AACjC,EAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,EAAE,QAAQ,KAAA,EAAM,EAAG,CAAC,OAAA,EAAS,CAAA,KAAM;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,IAAK,OAAA;AACpC,IAAA,MAAM,MAAA,GAAS,WAAW,UAAA,EAAW;AACrC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AACpC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA;AAAA,MACA,SAAS,EAAA,CAAG,OAAA;AAAA,MACZ,UAAU,EAAA,CAAG;AAAA,KACf;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,UAAA,CAAW,MAAM,SAAS,CAAA;AACnC","file":"index.cjs","sourcesContent":["/**\n * `splitmix32` — a tiny, well-studied 32-bit mixing PRNG used **only** to expand a single integer\n * seed into the four 32-bit state words that seed {@link ../rng/sfc32.sfc32}. It is not the corpus\n * generator itself (that is `sfc32`); it exists so that a one-number seed deterministically produces a\n * well-distributed 128-bit `sfc32` state, avoiding the poor low-bit behavior of naive\n * `state = seed`-style initialization.\n *\n * Zero-dependency, `Math.random`-free (lint-enforced): the whole point of the library is that a seed —\n * and only the seed — determines the output, on any machine, any run.\n *\n * @module\n */\n\n/**\n * A stateful `splitmix32` step function. Each call advances the internal 32-bit state and returns the\n * next unsigned 32-bit integer. Deterministic for a given seed.\n *\n * @param seed - The 32-bit seed. Coerced to a 32-bit integer via `| 0`.\n * @returns A nullary function returning the next `uint32` in the stream.\n * @example\n * ```ts\n * import { splitmix32 } from \"@cosyte/synth\";\n * const next = splitmix32(12345);\n * const a = next(); // deterministic uint32\n * ```\n */\nexport function splitmix32(seed: number): () => number {\n let a = seed | 0;\n return function next(): number {\n a = (a + 0x9e3779b9) | 0;\n let t = a ^ (a >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t = t ^ (t >>> 15);\n t = Math.imul(t, 0x735a2d97);\n t = t ^ (t >>> 15);\n return t >>> 0;\n };\n}\n","/**\n * `sfc32` (Small Fast Counter, 32-bit, 128-bit state) — the deterministic, non-cryptographic PRNG that\n * drives every value `@cosyte/synth` generates. Chosen over `mulberry32` (whose author flags that it\n * skips ~1/3 of 32-bit outputs) and over a CSPRNG (`node:crypto`, which is **not seedable** and would\n * defeat reproducibility). A synthetic-fixture generator has **no secrets** — statistical quality plus\n * byte-for-byte reproducibility is exactly the right trade.\n *\n * The state is four 32-bit words. This module exposes the raw step function; {@link ../rng/rng.Rng}\n * wraps it with a seed-expansion ({@link ./splitmix32.splitmix32}) and the ergonomic draw helpers.\n *\n * @module\n */\n\n/**\n * The mutable four-word `sfc32` state. Threaded explicitly (never global) by {@link ../rng/rng.Rng}.\n */\nexport interface Sfc32State {\n /** State word `a`. */\n a: number;\n /** State word `b`. */\n b: number;\n /** State word `c`. */\n c: number;\n /** Counter word `d`. */\n d: number;\n}\n\n/**\n * Advance an {@link Sfc32State} in place by one step and return the next unsigned 32-bit integer.\n *\n * This is the canonical `sfc32` step. The state object is mutated (the counter `d` increments and the\n * mixing words rotate); callers that need reproducible independence hold their own state and never\n * share it — {@link ../rng/rng.Rng} creates a fresh state per seed so two runs from the same seed are\n * identical.\n *\n * @param s - The state to advance. Mutated in place.\n * @returns The next `uint32` in the stream.\n * @example\n * ```ts\n * import { sfc32Next, type Sfc32State } from \"@cosyte/synth\";\n * const s: Sfc32State = { a: 1, b: 2, c: 3, d: 4 };\n * const x = sfc32Next(s); // uint32\n * ```\n */\nexport function sfc32Next(s: Sfc32State): number {\n s.a |= 0;\n s.b |= 0;\n s.c |= 0;\n s.d |= 0;\n const t = (((s.a + s.b) | 0) + s.d) | 0;\n s.d = (s.d + 1) | 0;\n s.a = s.b ^ (s.b >>> 9);\n s.b = (s.c + (s.c << 3)) | 0;\n s.c = (s.c << 21) | (s.c >>> 11);\n s.c = (s.c + t) | 0;\n return t >>> 0;\n}\n","/**\n * Stable diagnostic codes for `@cosyte/synth` and the {@link SynthError} they travel on.\n *\n * Unlike a parser (which recovers from bad *input* into Tier-2 warnings), a **generator** has no input\n * to tolerate — its reflex is *synthetic-by-construction* and *fail-closed on impossibility*. So the\n * codes here are **fatal**: a caller asked for something the library cannot honor spec-clean, and the\n * only safe answer is to throw, never to silently fabricate a value or a byte workaround. Codes are `key ===\n * value` and part of the public contract —\n * renaming one is a breaking change.\n *\n * @module\n */\n\n/**\n * The stable **fatal** code registry. Additions-only thereafter.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SynthError } from \"@cosyte/synth\";\n * try {\n * // ...generate...\n * } catch (err) {\n * if (err instanceof SynthError && err.code === SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT) {\n * // handle an unsupported format request\n * }\n * }\n * ```\n */\nexport const SYNTH_FATAL_CODES = {\n /**\n * A format was requested that this build cannot generate through a real parser builder/serializer.\n * Fatal — never a hand-written byte fallback.\n *\n * **No code path in this build raises it.** All six formats generate, so it is reserved for a\n * future format that does not, and is kept because removing a published code is a breaking change.\n * An unsupported *kind* within a format that does generate is `SYNTH_UNSUPPORTED_KIND`.\n */\n SYNTH_UNSUPPORTED_FORMAT: \"SYNTH_UNSUPPORTED_FORMAT\",\n /**\n * A vendor quirk was requested that the target format's profile system does not support. Fatal —\n * never a silent no-op and never a fabricated quirk.\n */\n SYNTH_UNSUPPORTED_QUIRK: \"SYNTH_UNSUPPORTED_QUIRK\",\n /**\n * A quirk transform found no structural anchor to mutate, so the fixture would not carry the\n * deviation it is labelled with. Fatal — a golden file that lies about its parser verdict is worse\n * than no golden file.\n */\n SYNTH_QUIRK_ANCHOR_ABSENT: \"SYNTH_QUIRK_ANCHOR_ABSENT\",\n /**\n * A bare parse of a freshly-generated quirk artifact did not produce exactly the declared intended\n * warning code(s). Fatal — never emit a mislabeled fixture.\n */\n SYNTH_INTENDED_WARNING_MISMATCH: \"SYNTH_INTENDED_WARNING_MISMATCH\",\n /** A concept's code-system URI has no OID mapping in the C-CDA example-code table. Fatal. */\n SYNTH_UNMAPPED_CODE_SYSTEM: \"SYNTH_UNMAPPED_CODE_SYSTEM\",\n /** A money value could not be read as an X12 decimal. Fatal — a generator never rounds to a float. */\n SYNTH_INVALID_DECIMAL: \"SYNTH_INVALID_DECIMAL\",\n /** An integer range was requested with its maximum below its minimum. Fatal. */\n SYNTH_INVALID_RANGE: \"SYNTH_INVALID_RANGE\",\n /** A value was drawn from an empty pool. Fatal — never a fabricated substitute. */\n SYNTH_EMPTY_POOL: \"SYNTH_EMPTY_POOL\",\n /** A `defineSynthProfile` spec was not usable (a missing or blank `name`). Fatal. */\n SYNTH_INVALID_PROFILE: \"SYNTH_INVALID_PROFILE\",\n /**\n * A caller-supplied selector (a message kind, a document type, a corpus mix entry, a claim\n * variant, a Bundle type, a resource profile) is not in the closed set that governs it. Fatal —\n * see `resolveKind`: a selector union is erased at run time, and a selector that falls through\n * either mislabels the fixture or hands the value to a peer builder that quotes it back.\n */\n SYNTH_UNSUPPORTED_KIND: \"SYNTH_UNSUPPORTED_KIND\",\n} as const;\n\n/**\n * A value from {@link SYNTH_FATAL_CODES} — the type carried by a thrown {@link SynthError}.\n */\nexport type SynthFatalCode = (typeof SYNTH_FATAL_CODES)[keyof typeof SYNTH_FATAL_CODES];\n\n/**\n * The **frozen message registry** — the only place a {@link SynthError} message can come from.\n *\n * A message here is a fixed string. It never quotes the request that produced it, and there is no\n * parameter through which it could: {@link SynthError} takes a code and nothing else. That is the\n * whole mechanism, and it is deliberately a mechanism rather than a habit. Every one of these\n * messages used to be assembled by interpolating the caller's value into a template, and the reason\n * that was safe was not the design — it was that the caller happened to be passing a quirk name.\n *\n * The trade is real and is accepted: a fatal no longer tells you *which* value it rejected. It tells\n * you which rule refused, on `err.code`, and the stack frame tells you where. The caller already\n * holds the value it passed.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SYNTH_FATAL_MESSAGES } from \"@cosyte/synth\";\n * SYNTH_FATAL_MESSAGES[SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL]; // => \"A value was drawn from an empty pool.\"\n * ```\n */\nexport const SYNTH_FATAL_MESSAGES: Readonly<Record<SynthFatalCode, string>> = Object.freeze({\n SYNTH_UNSUPPORTED_FORMAT:\n \"The requested format is not generable by this build. A generator has no byte fallback: it \" +\n \"builds through a parser's own serializer or it refuses.\",\n SYNTH_UNSUPPORTED_QUIRK:\n \"The requested vendor quirk is not in the target format's quirk registry. Compare the request \" +\n \"against that format's exported registry (HL7_QUIRKS, CCDA_QUIRKS, ASTM_QUIRKS).\",\n SYNTH_QUIRK_ANCHOR_ABSENT:\n \"The quirk transform found no structural anchor to mutate, so the fixture would not carry the \" +\n \"deviation it is labelled with. Refusing to emit a mislabeled fixture.\",\n SYNTH_INTENDED_WARNING_MISMATCH:\n \"A bare parse of the generated quirk artifact did not produce exactly the declared intended \" +\n \"warning code(s). Refusing to emit a mislabeled fixture.\",\n SYNTH_UNMAPPED_CODE_SYSTEM:\n \"The concept's code-system URI has no OID mapping in the C-CDA example-code table.\",\n SYNTH_INVALID_DECIMAL: \"The value could not be read as an X12 decimal.\",\n SYNTH_INVALID_RANGE: \"An integer range was requested with its maximum below its minimum.\",\n SYNTH_EMPTY_POOL: \"A value was drawn from an empty pool.\",\n SYNTH_INVALID_PROFILE: \"defineSynthProfile requires a non-empty string name.\",\n SYNTH_UNSUPPORTED_KIND:\n \"The requested kind, document type, corpus mix entry, variant or profile is not one this \" +\n \"generator supports. The supported set is the exported union for that option.\",\n});\n\n/**\n * The typed error every fatal `@cosyte/synth` condition throws. Carries a stable\n * {@link SynthFatalCode} so callers branch on `err.code` without matching message text.\n *\n * It takes **no value parameter**. The message is whatever {@link SYNTH_FATAL_MESSAGES} holds for the\n * code, so no caller-supplied string can reach a diagnostic surface by any route — not `message`, not\n * `stack`, not a field on the thrown object.\n *\n * @example\n * ```ts\n * import { SynthError, SYNTH_FATAL_CODES } from \"@cosyte/synth\";\n * throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT);\n * ```\n */\nexport class SynthError extends Error {\n /** The stable fatal code. */\n public readonly code: SynthFatalCode;\n\n /**\n * @param code - The stable {@link SynthFatalCode}. The message comes from the frozen registry.\n */\n public constructor(code: SynthFatalCode) {\n super(SYNTH_FATAL_MESSAGES[code]);\n this.name = \"SynthError\";\n this.code = code;\n }\n}\n","/**\n * `Rng` — the seeded, deterministic random source every `@cosyte/synth` provider draws from.\n *\n * **The reproducibility contract.** A seed — and only the seed — determines the output.\n * `createRng(seed)` expands the integer seed through {@link ./splitmix32.splitmix32} into the four\n * `sfc32` state words, then every draw advances that state via {@link ./sfc32.sfc32Next}. Two `Rng`s\n * created from the same seed emit the **identical** sequence on any machine, any run — the property\n * the parsers', `transform`'s, and `deid`'s regression suites depend on.\n *\n * **Explicit, never global.** An `Rng` is a value you thread through a build; there is no ambient\n * shared generator and **`Math.random` is lint-banned** in `src/` (it is not seedable — its seed is\n * engine-chosen and cannot be reset, so a corpus built on it is not reproducible). Because each\n * generation creates a fresh `Rng` from its seed, generations are independent and parallel-safe.\n *\n * The `Rng` object is stateful by nature (a PRNG advances). Immutability in this library lives where it\n * is testable and matters: the generated **artifacts and the `Corpus` are deep-frozen** (see\n * `../corpus.ts`). Determinism, not object-immutability, is the `Rng`'s guarantee.\n *\n * @module\n */\n\nimport { splitmix32 } from \"./splitmix32.js\";\nimport { sfc32Next, type Sfc32State } from \"./sfc32.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\n\n/**\n * A seeded, deterministic random source. Created via {@link createRng}; passed explicitly to every\n * provider. All draw methods advance the internal state deterministically.\n */\nexport interface Rng {\n /** The integer seed this generator was created from (part of the `Corpus` manifest). */\n readonly seed: number;\n /** The next unsigned 32-bit integer. */\n nextUint32(): number;\n /** The next float in `[0, 1)`. */\n float(): number;\n /**\n * A uniformly-distributed integer in the inclusive range `[min, max]`.\n *\n * @param min - Inclusive lower bound (integer).\n * @param max - Inclusive upper bound (integer, `>= min`).\n */\n int(min: number, max: number): number;\n /** `true` with probability `p` (default `0.5`). */\n bool(p?: number): boolean;\n /**\n * Pick one element from a non-empty array.\n *\n * @param items - A non-empty readonly array.\n */\n pick<T>(items: readonly T[]): T;\n /**\n * A string of `n` decimal digits (`0`–`9`), each drawn uniformly.\n *\n * @param n - The number of digits (`>= 0`).\n */\n digits(n: number): string;\n}\n\n/**\n * The concrete {@link Rng}. Holds the mutable `sfc32` state; every method advances it deterministically.\n */\nclass Sfc32Rng implements Rng {\n public readonly seed: number;\n readonly #state: Sfc32State;\n\n public constructor(seed: number) {\n this.seed = seed | 0;\n // Expand the single seed into four well-distributed state words. Seeding sfc32 directly from the\n // raw seed gives poor low-bit behavior; splitmix32 is the standard fix (bryc / roadmap §5).\n const mix = splitmix32(this.seed);\n this.#state = { a: mix(), b: mix(), c: mix(), d: mix() };\n // A short warm-up so nearby seeds diverge immediately.\n for (let i = 0; i < 8; i += 1) sfc32Next(this.#state);\n }\n\n public nextUint32(): number {\n return sfc32Next(this.#state);\n }\n\n public float(): number {\n return this.nextUint32() / 0x1_0000_0000;\n }\n\n public int(min: number, max: number): number {\n if (max < min) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_RANGE);\n const span = max - min + 1;\n return min + Math.floor(this.float() * span);\n }\n\n public bool(p = 0.5): boolean {\n return this.float() < p;\n }\n\n public pick<T>(items: readonly T[]): T {\n if (items.length === 0) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL);\n // `int(0, length-1)` is always in-bounds on a non-empty array, so this access cannot be a hole;\n // the cast discharges `noUncheckedIndexedAccess`'s `T | undefined` without a runtime re-check.\n return items[this.int(0, items.length - 1)] as T;\n }\n\n public digits(n: number): string {\n let out = \"\";\n for (let i = 0; i < n; i += 1) out += String(this.int(0, 9));\n return out;\n }\n}\n\n/**\n * Create a seeded, deterministic {@link Rng}. The same `seed` yields the same sequence everywhere.\n *\n * @param seed - The integer seed. Coerced to a 32-bit integer.\n * @returns A fresh, independent {@link Rng}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * const rng = createRng(12345);\n * rng.int(1, 6); // deterministic for seed 12345\n * ```\n */\nexport function createRng(seed: number): Rng {\n return new Sfc32Rng(seed);\n}\n","/**\n * The `Corpus` abstraction — a seed plus a self-describing manifest of what was generated, so a\n * fixture set is itself reproducible and regenerable. A downstream repo pins a seed\n * and gets a stable fixture set that regenerates identically.\n *\n * Generated artifacts and the `Corpus` are **deep-frozen** — this is where the archetype's immutability\n * invariant lives in a generator: a consumer cannot mutate a shared fixture out from under\n * another test.\n *\n * @module\n */\n\n/** The format an artifact was generated for. */\nexport type SynthFormat = \"hl7v2\" | \"fhir\" | \"ccda\" | \"x12\" | \"ncpdp\" | \"astm\";\n\n/**\n * One generated artifact — the serialized wire text plus the metadata needed to reproduce and check\n * it. `warnings` records what the artifact's own parser reported on the round-trip (zero for a\n * spec-clean artifact).\n */\nexport interface Artifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** A format-specific kind label (e.g. `\"ADT^A01\"`). */\n readonly kind: string;\n /** The serialized wire text, produced by the parser's own conservative serializer. */\n readonly content: string;\n /** The warning codes the parser emitted when the artifact was round-tripped (empty = spec-clean). */\n readonly warnings: readonly string[];\n}\n\n/** A self-describing manifest of a {@link Corpus}. */\nexport interface CorpusManifest {\n /** The formats present in the corpus. */\n readonly formats: readonly SynthFormat[];\n /** Per-kind artifact counts (e.g. `{ \"ADT^A01\": 3 }`). */\n readonly counts: Readonly<Record<string, number>>;\n /** The quirk names applied. */\n readonly quirks: readonly string[];\n}\n\n/** A reproducible, self-describing set of generated artifacts. */\nexport interface Corpus {\n /** The seed the corpus was generated from — regenerating from it yields byte-identical artifacts. */\n readonly seed: number;\n /** The manifest describing what was generated. */\n readonly manifest: CorpusManifest;\n /** The generated artifacts, in generation order. */\n readonly artifacts: readonly Artifact[];\n}\n\n/**\n * Assemble a deep-frozen {@link Corpus} from a seed and its artifacts, deriving the manifest.\n *\n * @param seed - The seed the artifacts were generated from.\n * @param artifacts - The generated artifacts, in order.\n * @param quirks - The quirk names applied (default none).\n * @returns A deep-frozen, self-describing {@link Corpus}.\n * @example\n * ```ts\n * import { makeCorpus } from \"@cosyte/synth\";\n * const corpus = makeCorpus(1, [{ format: \"hl7v2\", kind: \"ADT^A01\", content, warnings: [] }]);\n * corpus.manifest.counts[\"ADT^A01\"]; // 1\n * ```\n */\nexport function makeCorpus(\n seed: number,\n artifacts: readonly Artifact[],\n quirks: readonly string[] = [],\n): Corpus {\n const counts: Record<string, number> = {};\n const formats = new Set<SynthFormat>();\n const frozenArtifacts = artifacts.map((a) => {\n counts[a.kind] = (counts[a.kind] ?? 0) + 1;\n formats.add(a.format);\n return Object.freeze({ ...a, warnings: Object.freeze([...a.warnings]) });\n });\n const manifest: CorpusManifest = Object.freeze({\n formats: Object.freeze([...formats]),\n counts: Object.freeze(counts),\n quirks: Object.freeze([...quirks]),\n });\n return Object.freeze({\n seed,\n manifest,\n artifacts: Object.freeze(frozenArtifacts),\n });\n}\n","/**\n * The reserved / never-collide identifier facts that make a `@cosyte/synth` value **provably\n * synthetic** — the ground truth behind the synthetic-safety invariant.\n *\n * These are **facts**, not copyrighted prose: authoritative ranges published by SSA, NANPA, and the\n * IETF that are guaranteed never to denote a real person or a real routable resource. Every provider\n * draws only from these; the predicates here are the executable half of the CI synthetic-safety gate —\n * they let a test assert that no emitted value falls **outside** a reserved source.\n *\n * Sources:\n * - **SSN** — SSA never issues area numbers `000`, `666`, or `900–999`; the `987-65-4320…4329` block\n * is SSA's explicitly-reserved advertising range. (ssa.gov)\n * - **Phone** — NANP reserves `555-0100…555-0199` as the fictional/non-working line range. (nanpa.com)\n * - **Email/domain** — RFC 2606 / RFC 6761 reserved: `example.com`/`.net`/`.org` and the `.example`,\n * `.test`, `.invalid`, `.localhost` TLDs.\n * - **IP** — RFC 5737 IPv4 TEST-NET-1/2/3 (`192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`) and\n * RFC 3849 IPv6 documentation prefix `2001:db8::/32`.\n * - **NPI** — a real National Provider Identifier is a 10-digit number whose last digit is a Luhn\n * check digit computed over the `80840` prefix + the 9-digit base (CMS NPI check-digit rule, ISO\n * 7812). A number whose check digit is **wrong** therefore cannot be a NPPES-issued NPI. `synth`\n * emits NPIs with a deliberately-invalid check digit, so no generated NPI can collide with a real\n * provider.\n *\n * @module\n */\n\n/**\n * The synthetic **assigning authority** `@cosyte/synth` mints MRNs / account / member identifiers\n * under. There is **no** reserved MRN range (an MRN is unique only within its assigning-authority /\n * OID namespace), so — a documented design decision — every synthetic identifier\n * is scoped to a namespace that clearly cannot be a real facility's: a `SYNTH`-labelled authority whose\n * OID lives under HL7's designated **example** root `2.16.840.1.113883.19`. A value under this AA can\n * never collide with a real record because the *namespace itself* is synthetic.\n */\nexport const SYNTHETIC_ASSIGNING_AUTHORITY = Object.freeze({\n /** The human-readable assigning-authority namespace id (HL7 HD.1). */\n namespaceId: \"COSYTE-SYNTH\",\n /** The universal id — an OID under HL7's example arc `2.16.840.1.113883.19` (HD.2). */\n universalId: \"2.16.840.1.113883.19.999\",\n /** The universal id type (HD.3). */\n universalIdType: \"ISO\",\n});\n\n/** RFC 2606 / 6761 reserved email domains `@cosyte/synth` draws from. */\nexport const RESERVED_EMAIL_DOMAINS: readonly string[] = Object.freeze([\n \"example.com\",\n \"example.org\",\n \"example.net\",\n]);\n\n/** RFC 5737 IPv4 documentation (TEST-NET) `/24` network prefixes. */\nexport const TEST_NET_V4_PREFIXES: readonly string[] = Object.freeze([\n \"192.0.2\", // TEST-NET-1\n \"198.51.100\", // TEST-NET-2\n \"203.0.113\", // TEST-NET-3\n]);\n\n/** RFC 3849 IPv6 documentation prefix. */\nexport const DOC_V6_PREFIX = \"2001:db8\";\n\n/**\n * The `80840` prefix prepended to a 10-digit NPI before the Luhn check (the CMS NPI check-digit\n * rule — `80840` is the ISO 7812 issuer identifier for the US health-application namespace). A real\n * NPI satisfies `luhn(\"80840\" + npi) ≡ 0 (mod 10)`.\n */\nexport const NPI_LUHN_PREFIX = \"80840\";\n\n/**\n * The Luhn sum (mod 10) of a numeric string, doubling every second digit from the right. Used to\n * verify (or deliberately break) an NPI check digit.\n *\n * @param digits - A string of decimal digits.\n * @returns The Luhn sum modulo 10 (0 ⇒ the string passes the Luhn check).\n * @internal\n */\nexport function luhnMod10(digits: string): number {\n let sum = 0;\n // Standard Luhn: the RIGHTMOST digit is never doubled; doubling starts one position in and\n // alternates. For a full payload+check string this makes a Luhn-valid string sum to 0 (mod 10);\n // for a payload with a `0` placeholder in the check position it yields the complement of the\n // correct check digit.\n let double = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let d = digits.charCodeAt(i) - 48;\n if (d < 0 || d > 9) continue;\n if (double) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n double = !double;\n }\n return sum % 10;\n}\n\n/**\n * The correct NPI check digit for a 9-digit base — the value that makes `80840` + base + check pass\n * the Luhn check.\n *\n * @param base9 - The 9-digit NPI base (positions 1–9).\n * @returns The check digit (`0`–`9`) a real NPI would carry for this base.\n * @example\n * ```ts\n * import { npiCheckDigit } from \"@cosyte/synth\";\n * npiCheckDigit(\"123456789\"); // 3 — so 1234567893 is a Luhn-valid NPI shape\n * ```\n */\nexport function npiCheckDigit(base9: string): number {\n // Luhn over \"80840\" + base9 with a trailing 0 check placeholder; the check digit closes the sum.\n const partial = luhnMod10(`${NPI_LUHN_PREFIX}${base9}0`);\n return (10 - partial) % 10;\n}\n\n/**\n * The DEA-registration prefix letters `@cosyte/synth` draws a synthetic DEA number's first character\n * from. A real DEA number is `<registrant-type><last-name-initial>` + 7 digits; the first letter is the\n * registrant type (A/B/F/G/M/P/R/X are the widely-published values; the second letter is the\n * registrant's last-name initial). These letters are a **fact** about the number's shape, not\n * copyrighted prose — they only shape the value; the synthetic guarantee is the deliberately-**invalid\n * checksum** (see {@link dea} / {@link isSyntheticDea}).\n */\nexport const DEA_REGISTRANT_TYPES: readonly string[] = Object.freeze([\n \"A\",\n \"B\",\n \"F\",\n \"G\",\n \"M\",\n \"P\",\n \"R\",\n \"X\",\n]);\n\n/**\n * The correct DEA check digit for a 7-digit numeric base. The published DEA checksum is\n * `(d1 + d3 + d5) + 2·(d2 + d4 + d6)`, whose **units digit** is the 7th (check) digit. A real DEA\n * number satisfies this; a number whose 7th digit differs cannot be a validly-issued DEA registration.\n *\n * @param base6 - The first 6 digits of the DEA number (positions 1–6).\n * @returns The check digit (`0`–`9`) a real DEA number would carry for this base.\n * @example\n * ```ts\n * import { deaCheckDigit } from \"@cosyte/synth\";\n * deaCheckDigit(\"123456\"); // the units digit of (1+3+5) + 2·(2+4+6)\n * ```\n */\nexport function deaCheckDigit(base6: string): number {\n let odd = 0;\n let even = 0;\n for (let i = 0; i < 6; i += 1) {\n const digit = base6.charCodeAt(i) - 48;\n if (i % 2 === 0) odd += digit;\n else even += digit;\n }\n return (odd + 2 * even) % 10;\n}\n\n/**\n * Whether a DEA number (`XX` + 7 digits, case-insensitive) is **provably synthetic** — its check digit\n * (the 7th digit) does **not** match the published DEA checksum, so it cannot be a validly-issued DEA\n * registration. A checksum-valid DEA number (which *could* denote a real prescriber) returns `false`; a\n * value that is not the DEA shape returns `false`.\n *\n * @param value - The candidate DEA number (with or without incidental separators).\n * @returns `true` when the DEA number's checksum is wrong (never a real DEA registration).\n * @example\n * ```ts\n * import { isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(\"AF1234561\"); // depends on the base — true when the 7th digit is wrong\n * ```\n */\nexport function isSyntheticDea(value: string): boolean {\n const compact = value.replace(/[\\s-]/g, \"\").toUpperCase();\n if (!/^[A-Z]{2}\\d{7}$/.test(compact)) return false;\n const digits = compact.slice(2);\n const check = digits.charCodeAt(6) - 48;\n return deaCheckDigit(digits.slice(0, 6)) !== check;\n}\n\n/**\n * Whether a 10-digit NPI is **provably synthetic** — i.e. its check digit is invalid, so it cannot be\n * a NPPES-issued NPI. A Luhn-valid 10-digit NPI (which *could* denote a real registered provider)\n * returns `false`; a non-10-digit value returns `false` (not an NPI shape).\n *\n * @param value - The candidate NPI (digits only, or with incidental separators).\n * @returns `true` when the NPI's check digit is wrong (never a real NPI).\n * @example\n * ```ts\n * import { isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(\"1234567894\"); // true — invalid check digit (valid would be 1234567893)\n * isSyntheticNpi(\"1234567893\"); // false — Luhn-valid, could be a real NPI\n * ```\n */\nexport function isSyntheticNpi(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 10) return false;\n return luhnMod10(`${NPI_LUHN_PREFIX}${digits}`) !== 0;\n}\n\n/**\n * Whether a `ddd-dd-dddd` (or `ddddddddd`) SSN string is drawn from an SSA never-issued / reserved\n * space — area `000`, `666`, or `900–999`. A real, issuable SSN returns `false`.\n *\n * @param value - The candidate SSN (dashes optional).\n * @returns `true` when the SSN is provably synthetic.\n * @example\n * ```ts\n * import { isSyntheticSsn } from \"@cosyte/synth\";\n * isSyntheticSsn(\"900-12-3456\"); // true (never issued)\n * isSyntheticSsn(\"123456789\"); // false (issuable area 123)\n * ```\n */\nexport function isSyntheticSsn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n const area = Number(digits.slice(0, 3));\n return area === 0 || area === 666 || area >= 900;\n}\n\n/**\n * Whether a phone string contains the NANP `555-0100…555-0199` reserved fictional line range.\n *\n * @param value - The candidate phone (any formatting).\n * @returns `true` when the number is in the reserved fictional block.\n * @example\n * ```ts\n * import { isSyntheticPhone } from \"@cosyte/synth\";\n * isSyntheticPhone(\"(202) 555-0142\"); // true\n * ```\n */\nexport function isSyntheticPhone(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n // The reserved guarantee is the 7-digit tail: exchange 555 + line 01NN.\n const tail = digits.slice(-7);\n return /^555 ?01\\d\\d$/.test(tail) || /^55501\\d\\d$/.test(tail);\n}\n\n/**\n * Whether an email's domain is an RFC 2606 / 6761 reserved / test domain.\n *\n * @param value - The candidate email address.\n * @returns `true` when the domain is reserved (never real).\n * @example\n * ```ts\n * import { isSyntheticEmail } from \"@cosyte/synth\";\n * isSyntheticEmail(\"faux.testerson@example.com\"); // true\n * ```\n */\nexport function isSyntheticEmail(value: string): boolean {\n const at = value.lastIndexOf(\"@\");\n if (at < 0) return false;\n const domain = value.slice(at + 1).toLowerCase();\n if (RESERVED_EMAIL_DOMAINS.includes(domain)) return true;\n return /\\.(example|test|invalid|localhost)$/.test(domain);\n}\n\n/**\n * Whether an IP string is in an RFC 5737 (IPv4 TEST-NET) or RFC 3849 (IPv6 documentation) reserved\n * block. A real routable address returns `false`.\n *\n * @param value - The candidate IPv4 or IPv6 address.\n * @returns `true` when the address is a reserved documentation address.\n * @example\n * ```ts\n * import { isSyntheticIp } from \"@cosyte/synth\";\n * isSyntheticIp(\"192.0.2.44\"); // true (TEST-NET-1)\n * isSyntheticIp(\"8.8.8.8\"); // false (real)\n * ```\n */\nexport function isSyntheticIp(value: string): boolean {\n if (value.toLowerCase().startsWith(`${DOC_V6_PREFIX}:`)) return true;\n return TEST_NET_V4_PREFIXES.some((prefix) => value.startsWith(`${prefix}.`));\n}\n","/**\n * The shipped **clearly-fake name pool** — `@cosyte/synth`'s own license-clean synthetic data.\n *\n * Deliberately **not** a `faker`-style realistic-name corpus (which could match a real person at a real\n * address — the exact hazard the synthetic-safety invariant forbids). Every token is\n * an obviously-invented, fixture-flavoured word: a reader can tell at a glance it names no one. The pool\n * is small on purpose — structural coverage, not demographic realism, is the goal.\n *\n * `# synthetic: true`\n *\n * @module\n */\n\n/** Obviously-synthetic given names. None is a plausible real person's name. */\nexport const SYNTHETIC_GIVEN_NAMES: readonly string[] = Object.freeze([\n \"Testina\",\n \"Fixtura\",\n \"Synthos\",\n \"Placeholda\",\n \"Sampleton\",\n \"Prototius\",\n \"Stubbina\",\n \"Exampla\",\n \"Quilliam\",\n \"Fabrica\",\n \"Simula\",\n \"Testry\",\n \"Seedwin\",\n \"Corpora\",\n \"Reprodo\",\n \"Mocktavia\",\n \"Dummett\",\n \"Voidwin\",\n \"Deteria\",\n \"Randomir\",\n]);\n\n/** Obviously-synthetic family names. None is a plausible real surname at a real address. */\nexport const SYNTHETIC_FAMILY_NAMES: readonly string[] = Object.freeze([\n \"Testerson\",\n \"Fauxman\",\n \"Placeholt\",\n \"Mockridge\",\n \"Fixtingham\",\n \"Synthwell\",\n \"Dummerton\",\n \"Examplewood\",\n \"Fabricant\",\n \"Simulacre\",\n \"Nonesuch\",\n \"Seedman\",\n \"Corpusworth\",\n \"Reprodus\",\n \"Voidmark\",\n \"Deterwood\",\n \"Randomson\",\n \"Quillfeather\",\n \"Notreal\",\n \"Genfield\",\n]);\n\n/** Obviously-synthetic street names for structured address fields. */\nexport const SYNTHETIC_STREET_NAMES: readonly string[] = Object.freeze([\n \"Fixture Lane\",\n \"Sample Street\",\n \"Placeholder Avenue\",\n \"Synthetic Way\",\n \"Example Boulevard\",\n \"Testing Terrace\",\n \"Mock Road\",\n \"Prototype Court\",\n]);\n\n/**\n * Obviously-synthetic city names. Combined only ever with a synthetic street + a fake name (the\n * *combination* is what identifies, and the combination is always synthetic).\n */\nexport const SYNTHETIC_CITY_NAMES: readonly string[] = Object.freeze([\n \"Faketon\",\n \"Synthville\",\n \"Exampleburg\",\n \"Testford\",\n \"Mockhaven\",\n \"Fixtureton\",\n]);\n","/**\n * The synthetic-safety provider layer — every identifier, contact point, name, and date\n * `@cosyte/synth` emits is minted here, and **only** from a guaranteed-non-colliding source. There is no code\n * path that returns a value not drawn from a reserved range or the\n * shipped fake-name pool. This is the inverse of a parser's liberality: the generator is *closed-world*\n * on its data sources, so no output *can* be real or plausibly-real PHI.\n *\n * All providers are pure functions of an explicit {@link ../rng/rng.Rng} — same seed, same values.\n *\n * @module\n */\n\nimport type { Rng } from \"../rng/rng.js\";\n\nimport {\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n npiCheckDigit,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n} from \"./reserved.js\";\nimport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./names-pool.js\";\n\n/** A synthetic person name drawn from the shipped fake-name pool. */\nexport interface SyntheticName {\n /** A clearly-fake given name. */\n readonly given: string;\n /** A clearly-fake family name. */\n readonly family: string;\n}\n\n/** A synthetic postal address — synthetic street + city, a fixed non-real ZIP. */\nexport interface SyntheticAddress {\n /** A clearly-fake street line. */\n readonly street: string;\n /** A clearly-fake city. */\n readonly city: string;\n /** A US state abbreviation (structural only; never combined with a real street + name + DOB). */\n readonly state: string;\n /** A reserved non-real ZIP (`00000`). */\n readonly zip: string;\n}\n\n/** A synthetic identifier scoped to the synthetic assigning authority. */\nexport interface SyntheticIdentifier {\n /** The identifier value (digits) — unique only within the synthetic namespace. */\n readonly value: string;\n /** HL7 identifier type code (`MR` = medical record, `AN` = account, `MB` = member). */\n readonly typeCode: \"MR\" | \"AN\" | \"MB\";\n /** The synthetic assigning-authority namespace id. */\n readonly assigningAuthority: string;\n /** The synthetic assigning-authority OID (HL7 example arc). */\n readonly assigningAuthorityOid: string;\n}\n\n/** Which SSN reserved space to draw from. */\nexport type SsnBlock = \"never-issued\" | \"advertising\";\n\n/**\n * A **synthetic SSN** — dashed `AAA-GG-SSSS`. Default draws the SSA never-issued area space\n * (`900–999`); `block: \"advertising\"` draws SSA's reserved advertising block (`987-65-4320…4329`).\n * A value from this function can never be a real SSN.\n *\n * @param rng - The seeded generator.\n * @param block - Which reserved space to draw from. Defaults to `\"never-issued\"`.\n * @returns A dashed synthetic SSN string.\n * @example\n * ```ts\n * import { createRng, ssn } from \"@cosyte/synth\";\n * ssn(createRng(1)); // e.g. a 900-area, never-issued SSN\n * ```\n */\nexport function ssn(rng: Rng, block: SsnBlock = \"never-issued\"): string {\n if (block === \"advertising\") {\n // SSA's explicitly-reserved advertising block: last digit 0..9 within -4320..-4329.\n return `987-65-432${String(rng.int(0, 9))}`;\n }\n const area = rng.int(900, 999); // SSA never issues 900-999.\n const group = rng.digits(2);\n const serial = rng.digits(4);\n return `${String(area)}-${group}-${serial}`;\n}\n\n/**\n * A **synthetic phone** in the NANP reserved fictional block — `(AAA) 555-01NN`. The reserved\n * guarantee is the `555-01NN` tail (exchange 555, line 0100–0199); the area code is any NANP-valid\n * `NXX`. Can never be a working number.\n *\n * @param rng - The seeded generator.\n * @returns A formatted synthetic phone string.\n * @example\n * ```ts\n * import { createRng, phone } from \"@cosyte/synth\";\n * phone(createRng(1)); // e.g. \"(2XX) 555-01NN\"\n * ```\n */\nexport function phone(rng: Rng): string {\n const area = `${String(rng.int(2, 9))}${rng.digits(2)}`; // NXX area code.\n const line = `01${rng.digits(2)}`; // reserved 0100-0199.\n return `(${area}) 555-${line}`;\n}\n\n/**\n * A **synthetic name** drawn from the shipped clearly-fake pool.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticName}.\n * @example\n * ```ts\n * import { createRng, name } from \"@cosyte/synth\";\n * const { given, family } = name(createRng(1));\n * ```\n */\nexport function name(rng: Rng): SyntheticName {\n return { given: rng.pick(SYNTHETIC_GIVEN_NAMES), family: rng.pick(SYNTHETIC_FAMILY_NAMES) };\n}\n\n/**\n * A **synthetic email** at an RFC 2606 / 6761 reserved domain — `<slug>@example.com`.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name to derive the local-part slug from; otherwise a random slug is used.\n * @returns A synthetic email address.\n * @example\n * ```ts\n * import { createRng, email, name } from \"@cosyte/synth\";\n * email(createRng(1), name(createRng(1))); // \"<given>.<family>@example.com\"\n * ```\n */\nexport function email(rng: Rng, person?: SyntheticName): string {\n const domain = rng.pick(RESERVED_EMAIL_DOMAINS);\n const slug = person ? `${person.given}.${person.family}`.toLowerCase() : `synth${rng.digits(6)}`;\n return `${slug}@${domain}`;\n}\n\n/**\n * A **synthetic IPv4** in an RFC 5737 TEST-NET block — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A TEST-NET IPv4 address string.\n * @example\n * ```ts\n * import { createRng, ipv4 } from \"@cosyte/synth\";\n * ipv4(createRng(1)); // e.g. \"192.0.2.NN\"\n * ```\n */\nexport function ipv4(rng: Rng): string {\n return `${rng.pick(TEST_NET_V4_PREFIXES)}.${String(rng.int(1, 254))}`;\n}\n\n/**\n * A **synthetic IPv6** in the RFC 3849 documentation prefix `2001:db8::/32` — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A documentation-prefix IPv6 address string.\n * @example\n * ```ts\n * import { createRng, ipv6 } from \"@cosyte/synth\";\n * ipv6(createRng(1)); // e.g. \"2001:db8::NNNN\"\n * ```\n */\nexport function ipv6(rng: Rng): string {\n const tail = rng.nextUint32().toString(16).padStart(4, \"0\").slice(-4);\n return `${DOC_V6_PREFIX}::${tail}`;\n}\n\n/**\n * A **deterministic UUIDv4-shaped** surrogate key from the seeded generator. Because it is seeded (not\n * from `node:crypto`, which is not reproducible), the cryptographic non-collision argument is weaker —\n * acceptable because the identifier namespace is synthetic anyway, and noted honestly.\n *\n * @param rng - The seeded generator.\n * @returns A canonical `8-4-4-4-12` lowercase-hex UUID string with version `4` and RFC 4122 variant.\n * @example\n * ```ts\n * import { createRng, uuid } from \"@cosyte/synth\";\n * uuid(createRng(1)); // \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n * ```\n */\nexport function uuid(rng: Rng): string {\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i += 1) bytes[i] = rng.int(0, 255);\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40; // version 4\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n\n/**\n * A **synthetic NPI** — a 10-digit National Provider Identifier with a **deliberately-invalid Luhn\n * check digit**, so it can never be a NPPES-issued NPI (a real NPI must satisfy the `80840`-prefixed\n * Luhn check). The 9-digit base is drawn from the seeded generator; the check digit is\n * set to `(correct + 1) mod 10`, guaranteeing the full value fails validation.\n *\n * @param rng - The seeded generator.\n * @returns A 10-digit NPI-shaped string that is provably not a real NPI.\n * @example\n * ```ts\n * import { createRng, npi, isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(npi(createRng(1))); // true — invalid check digit by construction\n * ```\n */\nexport function npi(rng: Rng): string {\n const base9 = rng.digits(9);\n const wrongCheck = (npiCheckDigit(base9) + 1) % 10;\n return `${base9}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic DEA number** — `<registrant-type><initial>` + 7 digits with a **deliberately-invalid\n * checksum**, so it can never be a validly-issued DEA registration (a real DEA number's 7th digit\n * satisfies the published DEA checksum). The first letter is a registrant-type letter, the\n * second is derived from `person` (its family initial) when supplied so the number reads plausibly; the\n * 6-digit base is seeded and the check digit is set to `(correct + 1) mod 10`, guaranteeing the value\n * fails validation. NCPDP carries prescriber DEA, and this is the identity locus a refuter attacks\n * hardest, so — like {@link npi} — non-collision is a construction-level guarantee, not a heuristic.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name whose family initial becomes the DEA's second letter.\n * @returns A DEA-shaped string that is provably not a real DEA registration.\n * @example\n * ```ts\n * import { createRng, dea, isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(dea(createRng(1))); // true — invalid checksum by construction\n * ```\n */\nexport function dea(rng: Rng, person?: SyntheticName): string {\n const type = rng.pick(DEA_REGISTRANT_TYPES);\n const initialSource = person?.family ?? rng.pick(SYNTHETIC_FAMILY_NAMES);\n const initial = initialSource.slice(0, 1).toUpperCase();\n const base6 = rng.digits(6);\n const wrongCheck = (deaCheckDigit(base6) + 1) % 10;\n return `${type}${initial}${base6}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic identifier** (MRN / account / member id) scoped to the synthetic assigning authority.\n * There is no reserved MRN range, so non-collision is guaranteed by the *namespace*, not the value: the\n * identifier lives under a `SYNTH` authority no real facility uses.\n *\n * @param rng - The seeded generator.\n * @param typeCode - The HL7 identifier type: `MR` (default), `AN`, or `MB`.\n * @returns A {@link SyntheticIdentifier}.\n * @example\n * ```ts\n * import { createRng, identifier } from \"@cosyte/synth\";\n * identifier(createRng(1), \"MR\"); // { value, typeCode: \"MR\", assigningAuthority: \"COSYTE-SYNTH\", ... }\n * ```\n */\nexport function identifier(\n rng: Rng,\n typeCode: SyntheticIdentifier[\"typeCode\"] = \"MR\",\n): SyntheticIdentifier {\n return {\n value: rng.digits(8),\n typeCode,\n assigningAuthority: SYNTHETIC_ASSIGNING_AUTHORITY.namespaceId,\n assigningAuthorityOid: SYNTHETIC_ASSIGNING_AUTHORITY.universalId,\n };\n}\n\n/**\n * A **synthetic address** — a fake street + city, a reserved non-real ZIP (`00000`). A real state\n * abbreviation may appear (structural only) but is never combined with a real street + name + DOB.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticAddress}.\n * @example\n * ```ts\n * import { createRng, address } from \"@cosyte/synth\";\n * address(createRng(1)); // { street, city, state, zip: \"00000\" }\n * ```\n */\nexport function address(rng: Rng): SyntheticAddress {\n const number = rng.int(1, 9999);\n return {\n street: `${String(number)} ${rng.pick(SYNTHETIC_STREET_NAMES)}`,\n city: rng.pick(SYNTHETIC_CITY_NAMES),\n state: rng.pick(US_STATES),\n zip: \"00000\",\n };\n}\n\n/**\n * A **synthetic date** in HL7 `YYYYMMDD` form, drawn uniformly within an inclusive year range. Comes\n * from the seeded generator (never wall-clock), so it is reproducible and implies no real event.\n *\n * @param rng - The seeded generator.\n * @param minYear - Inclusive lower year bound (default `1930`).\n * @param maxYear - Inclusive upper year bound (default `2010`).\n * @returns An `YYYYMMDD` date string (always a valid calendar day).\n * @example\n * ```ts\n * import { createRng, dateYmd } from \"@cosyte/synth\";\n * dateYmd(createRng(1), 1970, 2000); // \"YYYYMMDD\"\n * ```\n */\nexport function dateYmd(rng: Rng, minYear = 1930, maxYear = 2010): string {\n const year = rng.int(minYear, maxYear);\n const month = rng.int(1, 12);\n const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();\n const day = rng.int(1, daysInMonth);\n return `${String(year).padStart(4, \"0\")}${String(month).padStart(2, \"0\")}${String(day).padStart(2, \"0\")}`;\n}\n\n/** US state abbreviations — structural only (see {@link address}). */\nconst US_STATES: readonly string[] = Object.freeze([\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\",\n]);\n","/**\n * The `safe` namespace — the single entry point for every synthetic-by-construction value provider.\n *\n * Grouped under one object so a consumer reads `safe.ssn(rng)` / `safe.phone(rng)` and it is\n * self-evident that the value is drawn from a guaranteed-non-colliding synthetic source.\n * The individual functions and the reserved-range predicates are also exported by name from the\n * package root for direct import.\n *\n * @module\n */\n\nimport {\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n} from \"./providers.js\";\n\nexport * from \"./providers.js\";\nexport * from \"./reserved.js\";\nexport * from \"./names-pool.js\";\n\n/**\n * The synthetic-safety provider namespace. Every function draws only from a reserved range or the\n * shipped fake-name pool — no value it returns can be real or plausibly-real PHI.\n *\n * @example\n * ```ts\n * import { createRng, safe } from \"@cosyte/synth\";\n * const rng = createRng(42);\n * safe.ssn(rng); // never-issued SSN\n * safe.phone(rng); // reserved 555-01NN number\n * ```\n */\nexport const safe = Object.freeze({\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n});\n","/**\n * Synthetic identity for NCPDP transactions — every patient, prescriber, pharmacy, and cardholder\n * identifier `synth` puts into a SCRIPT ePrescription or a Telecom claim is minted here, and **only**\n * from the synthetic-safety providers. NCPDP is identity-dense in a way the refuter\n * attacks hardest: a NewRx carries the **patient** (name, DOB, gender) *and* the **prescriber** (name,\n * NPI, **DEA**); a Telecom claim adds the **cardholder / member** (name, member id). Every locus below\n * has a construction-level guarantee, not a heuristic:\n *\n * - **NPI** — a deliberately **invalid Luhn** check digit, so it can never be a NPPES-issued NPI\n * ({@link ../safe/reserved.isSyntheticNpi}).\n * - **DEA** — a deliberately **invalid checksum**, so it can never be a validly-issued DEA registration\n * ({@link ../safe/reserved.isSyntheticDea}). This is the NCPDP-specific identity locus X12 did not have.\n * - **member / cardholder / patient id** — minted under the synthetic assigning authority with an\n * `MBR` prefix (no reserved range exists; the *namespace* is the guarantee).\n * - **name** — the shipped clearly-fake pool; **DOB** — the seeded generator (no real event implied);\n * **phone** — the reserved `555-01xx` block; **address** — synthetic street + reserved ZIP.\n *\n * @module\n */\n\nimport type { Rng } from \"../rng/rng.js\";\nimport { safe, type SyntheticName, type SyntheticAddress } from \"../safe/index.js\";\n\n/** Synthetic pharmacy business names — clearly fictional. */\nconst SYNTHETIC_PHARMACY_NAMES: readonly string[] = Object.freeze([\n \"SYNTH COMMUNITY PHARMACY\",\n \"FIXTURE DRUG MART\",\n \"PLACEHOLDER RX SERVICES\",\n \"SAMPLE APOTHECARY LLC\",\n \"MOCK PHARMACY GROUP\",\n]);\n\n/** A synthetic patient — every field from `../safe`. */\nexport interface NcpdpPatient {\n /** Name from the shipped fake-name pool. */\n readonly person: SyntheticName;\n /** Date of birth `CCYYMMDD` from the seeded generator. */\n readonly dob: string;\n /** Administrative gender code (`1` = male, `2` = female — NCPDP gender codes). */\n readonly gender: \"1\" | \"2\";\n /** Patient id, synthetic-AA scoped (`MBR`-prefixed — never a bare SSN). */\n readonly patientId: string;\n /** Reserved `555-01xx` phone. */\n readonly phone: string;\n /** Synthetic postal address (reserved non-real ZIP). */\n readonly address: SyntheticAddress;\n}\n\n/** A synthetic prescriber — name + invalid-Luhn NPI + invalid-checksum DEA. */\nexport interface NcpdpPrescriber {\n /** A clearly-fake prescriber name. */\n readonly person: SyntheticName;\n /** A 10-digit NPI with a deliberately-invalid Luhn check digit (never a real NPI). */\n readonly npi: string;\n /** A DEA number with a deliberately-invalid checksum (never a real DEA registration). */\n readonly dea: string;\n}\n\n/** A synthetic dispensing pharmacy — business name + invalid-Luhn NPI + synthetic NCPDP id. */\nexport interface NcpdpPharmacy {\n /** A clearly-fictional pharmacy business name. */\n readonly businessName: string;\n /** A 10-digit NPI with a deliberately-invalid Luhn check digit. */\n readonly npi: string;\n /** A 7-digit NCPDP provider id (synthetic — an all-digit id under no real chain). */\n readonly ncpdpId: string;\n}\n\n/** A synthetic cardholder / insurance identity — the covered person on a Telecom claim. */\nexport interface NcpdpCardholder {\n /** The cardholder name (may differ from the patient). */\n readonly person: SyntheticName;\n /** Cardholder / member id, synthetic-AA scoped (`MBR`-prefixed). */\n readonly cardholderId: string;\n /** Group id, synthetic. */\n readonly groupId: string;\n /** Person code (`01` = cardholder, `02` = spouse, `03` = child — structural). */\n readonly personCode: string;\n}\n\n/**\n * Mint a synthetic patient. Fixed draw order (name → DOB → gender → id → phone → address) so the same\n * seed yields the same patient.\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link NcpdpPatient}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ncpdpPatient } from \"@cosyte/synth/ncpdp\";\n * const { person, patientId } = ncpdpPatient(createRng(1));\n * ```\n */\nexport function ncpdpPatient(rng: Rng): NcpdpPatient {\n const person = safe.name(rng);\n const dob = safe.dateYmd(rng, 1935, 2010);\n const gender = rng.pick([\"1\", \"2\"] as const);\n const patientId = `MBR${safe.identifier(rng, \"MR\").value}`;\n const phone = safe.phone(rng);\n const address = safe.address(rng);\n return { person, dob, gender, patientId, phone, address };\n}\n\n/**\n * Mint a synthetic prescriber — a person name, an invalid-Luhn NPI, and an invalid-checksum DEA (the\n * DEA's second letter is derived from the prescriber's family name so it reads plausibly).\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link NcpdpPrescriber}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ncpdpPrescriber } from \"@cosyte/synth/ncpdp\";\n * const p = ncpdpPrescriber(createRng(1)); // p.npi invalid-Luhn; p.dea invalid-checksum\n * ```\n */\nexport function ncpdpPrescriber(rng: Rng): NcpdpPrescriber {\n const person = safe.name(rng);\n const npi = safe.npi(rng);\n const dea = safe.dea(rng, person);\n return { person, npi, dea };\n}\n\n/**\n * Mint a synthetic dispensing pharmacy — a fictional business name, an invalid-Luhn NPI, and a 7-digit\n * synthetic NCPDP provider id.\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link NcpdpPharmacy}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ncpdpPharmacy } from \"@cosyte/synth/ncpdp\";\n * const rx = ncpdpPharmacy(createRng(1));\n * ```\n */\nexport function ncpdpPharmacy(rng: Rng): NcpdpPharmacy {\n const businessName = rng.pick(SYNTHETIC_PHARMACY_NAMES);\n const npi = safe.npi(rng);\n const ncpdpId = rng.digits(7);\n return { businessName, npi, ncpdpId };\n}\n\n/**\n * Mint a synthetic cardholder / insurance identity for a Telecom claim.\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link NcpdpCardholder}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ncpdpCardholder } from \"@cosyte/synth/ncpdp\";\n * const c = ncpdpCardholder(createRng(1));\n * ```\n */\nexport function ncpdpCardholder(rng: Rng): NcpdpCardholder {\n const person = safe.name(rng);\n const cardholderId = `MBR${safe.identifier(rng, \"MB\").value}`;\n const groupId = `GRP${rng.digits(5)}`;\n const personCode = rng.pick([\"01\", \"02\", \"03\"] as const);\n return { person, cardholderId, groupId, personCode };\n}\n\n/** A seeded SCRIPT routing/correlation bundle — message ids + timestamps, all reproducible. */\nexport interface NcpdpScriptRouting {\n /** `<MessageID>` — a synthetic message id. */\n readonly messageId: string;\n /** `<SentTime>` — a seeded ISO-8601 timestamp (never wall-clock). */\n readonly sentTime: string;\n /** `<PrescriberOrderNumber>` — a synthetic order number. */\n readonly prescriberOrderNumber: string;\n /** A `CCYYMMDD` written / service date (seeded, recent window). */\n readonly date: string;\n}\n\n/**\n * Mint a seeded SCRIPT routing bundle. The timestamp is drawn from the seeded generator in a recent\n * window (2024–2026) so a message reads current while staying byte-reproducible.\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link NcpdpScriptRouting}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ncpdpScriptRouting } from \"@cosyte/synth/ncpdp\";\n * const r = ncpdpScriptRouting(createRng(1));\n * ```\n */\nexport function ncpdpScriptRouting(rng: Rng): NcpdpScriptRouting {\n const date = safe.dateYmd(rng, 2024, 2026); // CCYYMMDD\n const yyyy = date.slice(0, 4);\n const mm = date.slice(4, 6);\n const dd = date.slice(6, 8);\n const hh = String(rng.int(0, 23)).padStart(2, \"0\");\n const mi = String(rng.int(0, 59)).padStart(2, \"0\");\n return {\n messageId: `SYNTH-${rng.digits(10)}`,\n sentTime: `${yyyy}-${mm}-${dd}T${hh}:${mi}:00Z`,\n prescriberOrderNumber: `PON${rng.digits(8)}`,\n date,\n };\n}\n","/**\n * License-clean example drug + code pools for synthetic NCPDP generation. NCPDP charges for its\n * standards and is protective of their prose, so — like every other `synth` format — **no NCPDP\n * copyrighted text is bundled**: these are widely-known generic drug descriptions and invented,\n * clearly-example product codes, not lifted from any NCPDP data dictionary.\n *\n * A drug code is **not** PHI — it names a product, never a patient — so realism here carries no\n * synthetic-safety hazard; the pool exists only to give a generated NewRx / claim a plausible,\n * license-clean drug. Patient / prescriber identity comes from the synthetic-safety providers\n * (`../safe`), never from here.\n *\n * `# synthetic: true`\n *\n * @module\n */\n\n/** One example drug: a widely-known generic description + an invented, clearly-example NDC. */\nexport interface NcpdpExampleDrug {\n /** A widely-known generic drug description (RxNorm-style; public knowledge, not NCPDP prose). */\n readonly description: string;\n /** An invented 11-digit NDC (`5-4-2`, digits only) — an example product code, never a real NDC. */\n readonly ndc: string;\n /** The dispense quantity unit-of-measure qualifier hint (structural only). */\n readonly form: string;\n}\n\n/**\n * A small pool of license-clean example drugs. The NDCs use the invented labeler prefix `00000`\n * (never an FDA-assigned labeler), so they are transparently examples; the descriptions are common\n * generics anyone can name without a licensed database.\n */\nexport const EXAMPLE_DRUGS: readonly NcpdpExampleDrug[] = Object.freeze([\n { description: \"Amoxicillin 500 MG Oral Capsule\", ndc: \"00000010101\", form: \"EA\" },\n { description: \"Lisinopril 10 MG Oral Tablet\", ndc: \"00000020202\", form: \"EA\" },\n { description: \"Atorvastatin 20 MG Oral Tablet\", ndc: \"00000030303\", form: \"EA\" },\n { description: \"Metformin 500 MG Oral Tablet\", ndc: \"00000040404\", form: \"EA\" },\n { description: \"Amlodipine 5 MG Oral Tablet\", ndc: \"00000050505\", form: \"EA\" },\n { description: \"Omeprazole 20 MG Delayed Release Capsule\", ndc: \"00000060606\", form: \"EA\" },\n { description: \"Levothyroxine 50 MCG Oral Tablet\", ndc: \"00000070707\", form: \"EA\" },\n { description: \"Azithromycin 250 MG Oral Tablet\", ndc: \"00000080808\", form: \"EA\" },\n { description: \"Sertraline 50 MG Oral Tablet\", ndc: \"00000090909\", form: \"EA\" },\n { description: \"Albuterol 90 MCG Metered Dose Inhaler\", ndc: \"00000101010\", form: \"EA\" },\n]);\n\n/** Example free-text SIG directions (public, common-sense dosing text — not NCPDP prose). */\nexport const EXAMPLE_SIG_TEXT: readonly string[] = Object.freeze([\n \"Take 1 tablet by mouth once daily\",\n \"Take 1 capsule by mouth twice daily with food\",\n \"Take 2 tablets by mouth every 12 hours as needed\",\n \"Take 1 tablet by mouth at bedtime\",\n \"Inhale 2 puffs by mouth every 4 to 6 hours as needed\",\n]);\n\n/** Dispense-as-written / product-selection codes (single-digit, structural). */\nexport const DAW_CODES: readonly string[] = Object.freeze([\"0\", \"1\", \"2\"]);\n","/**\n * Spec-clean NCPDP **SCRIPT** (XML ePrescribing) generation — `NewRx`, `RxRenewalRequest`, and\n * `RxChangeRequest` — built through `@cosyte/ncpdp`'s own emit surface so the XML is spec-clean by the\n * same mechanism that makes the parser's serializer spec-clean:\n *\n * - **NewRx** is built through the validated `buildNewRx` builder (it refuses a NewRx with no\n * medication description) and serialized by `serializeScript`.\n * - **RxRenewalRequest / RxChangeRequest** have no dedicated builder in `@cosyte/ncpdp` (its builders\n * cover NewRx + the Status/Error/Verify responses), so — exactly as the X12 generator constructs a\n * typed model and lets `serializeX12` emit it — these are built as the parser's **public, typed\n * `ScriptMessage` model** (the same immutable model `buildNewRx` returns) and serialized by\n * `serializeScript`. No byte is hand-written; the round-trip harness ({@link ./round-trip.scriptRoundTrip})\n * re-parses every message through `parseScript` and asserts **zero warnings**, so spec-cleanliness is\n * the parser's judgment, not `synth`'s.\n *\n * Every patient / prescriber / pharmacy identifier is drawn from the synthetic-safety providers via\n * {@link ./identity}; the prescriber NPI is invalid-Luhn and the **DEA is invalid-checksum**, so\n * neither can denote a real provider.\n *\n * @module\n */\n\nimport {\n buildNewRx,\n serializeScript,\n ScriptMessage,\n type MedicationPrescribed,\n type Patient,\n type Pharmacy,\n type Prescriber,\n type ScriptHeader,\n type RxRenewalRequest,\n type RxChangeRequest,\n} from \"@cosyte/ncpdp/script\";\nimport { decimalValue, codedValue } from \"@cosyte/ncpdp/common\";\n\nimport { createRng, type Rng } from \"../rng/rng.js\";\nimport {\n ncpdpPatient,\n ncpdpPrescriber,\n ncpdpPharmacy,\n ncpdpScriptRouting,\n type NcpdpScriptRouting,\n} from \"./identity.js\";\nimport { EXAMPLE_DRUGS, EXAMPLE_SIG_TEXT } from \"./example-codes.js\";\n\n/** The SCRIPT version `synth` stamps generated messages with (a version `@cosyte/ncpdp` reads clean). */\nconst SCRIPT_VERSION = \"2017071\";\n\n/** Options for the SCRIPT generators. */\nexport interface GenerateScriptOptions {\n /** The seed (deterministic — same seed yields a byte-identical message). */\n readonly seed: number;\n}\n\n/** Build the typed `Patient` model from a synthetic patient. */\nfunction patientModel(rng: Rng): Patient {\n const p = ncpdpPatient(rng);\n return {\n name: { lastName: p.person.family, firstName: p.person.given },\n gender: p.gender,\n dateOfBirth: p.dob,\n };\n}\n\n/** Build the typed `Pharmacy` model from a synthetic pharmacy. */\nfunction pharmacyModel(rng: Rng): Pharmacy {\n const rx = ncpdpPharmacy(rng);\n return {\n businessName: rx.businessName,\n identification: { npi: rx.npi, ncpdpId: rx.ncpdpId },\n };\n}\n\n/** Build the typed `Prescriber` model — NPI invalid-Luhn, DEA invalid-checksum. */\nfunction prescriberModel(rng: Rng): Prescriber {\n const dr = ncpdpPrescriber(rng);\n return {\n name: { lastName: dr.person.family, firstName: dr.person.given },\n identification: { npi: dr.npi, deaNumber: dr.dea },\n };\n}\n\n/** Build the typed `MedicationPrescribed` model from the license-clean example pool. */\nfunction medicationModel(rng: Rng, routing: NcpdpScriptRouting): MedicationPrescribed {\n const drug = rng.pick(EXAMPLE_DRUGS);\n const written = `${routing.date.slice(0, 4)}-${routing.date.slice(4, 6)}-${routing.date.slice(6, 8)}`;\n return {\n description: drug.description,\n coded: { productCode: codedValue(drug.ndc, \"ND\") },\n quantity: {\n value: decimalValue(String(rng.int(30, 90))),\n unitOfMeasure: drug.form,\n codeListQualifier: \"38\",\n },\n daysSupply: decimalValue(String(rng.pick([30, 60, 90] as const))),\n numberOfRefills: String(rng.int(0, 5)),\n substitutions: rng.pick([\"0\", \"1\"] as const),\n writtenDate: written,\n sigText: rng.pick(EXAMPLE_SIG_TEXT),\n };\n}\n\n/** The routing header (with SCRIPT version) shared by every generated SCRIPT message. */\nfunction headerModel(routing: NcpdpScriptRouting): ScriptHeader {\n return {\n version: SCRIPT_VERSION,\n from: \"SYNTHPRESCRIBER\",\n to: \"SYNTHPHARMACY\",\n messageId: routing.messageId,\n sentTime: routing.sentTime,\n prescriberOrderNumber: routing.prescriberOrderNumber,\n };\n}\n\n/**\n * Generate a spec-clean SCRIPT **NewRx** ePrescription, built through `@cosyte/ncpdp`'s validated\n * `buildNewRx` and serialized by `serializeScript`. Every identity value is synthetic-by-construction; the\n * message round-trips through `parseScript` with zero warnings.\n *\n * @param options - The seed. See {@link GenerateScriptOptions}.\n * @returns The serialized SCRIPT XML.\n * @example\n * ```ts\n * import { generateNewRx } from \"@cosyte/synth/ncpdp\";\n * const xml = generateNewRx({ seed: 42 });\n * ```\n */\nexport function generateNewRx(options: GenerateScriptOptions): string {\n const rng = createRng(options.seed);\n const routing = ncpdpScriptRouting(rng);\n const patient = patientModel(rng);\n const pharmacy = pharmacyModel(rng);\n const prescriber = prescriberModel(rng);\n const medication = medicationModel(rng, routing);\n const message = buildNewRx({\n header: headerModel(routing),\n patient,\n pharmacy,\n prescriber,\n medication,\n });\n return serializeScript(message);\n}\n\n/** Assemble the shared lifecycle-request fields (request ref, parties, medication) from a seed. */\nfunction lifecycleFields(rng: Rng): {\n requestReferenceNumber: string;\n patient: Patient;\n pharmacy: Pharmacy;\n prescriber: Prescriber;\n medicationPrescribed: MedicationPrescribed;\n header: ScriptHeader;\n} {\n const routing = ncpdpScriptRouting(rng);\n return {\n requestReferenceNumber: `REQ${rng.digits(9)}`,\n patient: patientModel(rng),\n pharmacy: pharmacyModel(rng),\n prescriber: prescriberModel(rng),\n medicationPrescribed: medicationModel(rng, routing),\n header: headerModel(routing),\n };\n}\n\n/**\n * Generate a spec-clean SCRIPT **RxRenewalRequest** (a pharmacy-initiated renewal), built as\n * `@cosyte/ncpdp`'s public typed `ScriptMessage` model and serialized by `serializeScript`. Every\n * identity value is synthetic-by-construction; the message round-trips through `parseScript` with zero\n * warnings (verified by {@link ./round-trip.scriptRoundTrip}).\n *\n * @param options - The seed. See {@link GenerateScriptOptions}.\n * @returns The serialized SCRIPT XML.\n * @example\n * ```ts\n * import { generateRxRenewalRequest } from \"@cosyte/synth/ncpdp\";\n * const xml = generateRxRenewalRequest({ seed: 7 });\n * ```\n */\nexport function generateRxRenewalRequest(options: GenerateScriptOptions): string {\n const rng = createRng(options.seed);\n const { header, ...fields } = lifecycleFields(rng);\n const body: RxRenewalRequest = { kind: \"RxRenewalRequest\", ...fields };\n return serializeScript(new ScriptMessage({ header, body, warnings: [] }));\n}\n\n/**\n * Generate a spec-clean SCRIPT **RxChangeRequest** (a pharmacy-initiated change request), built as\n * `@cosyte/ncpdp`'s public typed `ScriptMessage` model and serialized by `serializeScript`. Every\n * identity value is synthetic-by-construction; the message round-trips through `parseScript` with zero\n * warnings.\n *\n * @param options - The seed. See {@link GenerateScriptOptions}.\n * @returns The serialized SCRIPT XML.\n * @example\n * ```ts\n * import { generateRxChangeRequest } from \"@cosyte/synth/ncpdp\";\n * const xml = generateRxChangeRequest({ seed: 7 });\n * ```\n */\nexport function generateRxChangeRequest(options: GenerateScriptOptions): string {\n const rng = createRng(options.seed);\n const { header, ...fields } = lifecycleFields(rng);\n const body: RxChangeRequest = { kind: \"RxChangeRequest\", ...fields };\n return serializeScript(new ScriptMessage({ header, body, warnings: [] }));\n}\n","/**\n * Spec-clean NCPDP **Telecommunication vD.0** claim generation — `B1` (billing), `B2` (reversal), and\n * `B3` (rebill) — built through `@cosyte/ncpdp`'s `buildTelecomRequest` + `serializeTelecom` so the\n * fixed Transaction Header, the FS/GS/RS framing, and every field are the parser's own conservative\n * emit. Every field id below is a real 2-character NCPDP field identifier, and every\n * value at a PHI-bearing locus is drawn from the synthetic-safety providers via {@link ./identity}: the\n * patient / cardholder names come from the fake-name pool, the DOB / dates from the seeded generator,\n * the phone from the reserved `555-01xx` block, the member / cardholder ids under the synthetic\n * assigning authority, and the prescriber NPI with an invalid Luhn check digit. Each transaction\n * round-trips through `parseTelecom` with zero warnings.\n *\n * @module\n */\n\nimport {\n buildTelecomRequest,\n serializeTelecom,\n type TelecomHeaderInput,\n type TelecomSegmentInput,\n type TelecomFieldInput,\n} from \"@cosyte/ncpdp/telecom\";\n\nimport { createRng, type Rng } from \"../rng/rng.js\";\nimport { ncpdpPatient, ncpdpCardholder, ncpdpPharmacy, ncpdpPrescriber } from \"./identity.js\";\nimport { EXAMPLE_DRUGS, DAW_CODES } from \"./example-codes.js\";\n\n/** The Telecom transaction codes `synth` generates. */\nexport type TelecomTransactionCode = \"B1\" | \"B2\" | \"B3\";\n\n/** A synthetic routing BIN (an ISO/IIN routing number — not patient identity, kept clearly synthetic). */\nconst SYNTHETIC_BIN = \"999999\";\n\n/** Options for the Telecom generators. */\nexport interface GenerateTelecomOptions {\n /** The seed (deterministic — same seed yields a byte-identical transaction). */\n readonly seed: number;\n}\n\n/** Drop any incidental separators; keep the compact wire value (never carries FS/GS/RS). */\nfunction digitsOnly(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\n/** Build the fixed Transaction Header for the given transaction code, from seeded identity. */\nfunction header(\n rng: Rng,\n transactionCode: TelecomTransactionCode,\n pharmacyNpi: string,\n): TelecomHeaderInput {\n const date = serviceDate(rng);\n return {\n binNumber: SYNTHETIC_BIN,\n versionRelease: \"D0\",\n transactionCode,\n processorControlNumber: `SYN${rng.digits(4)}`,\n transactionCount: \"1\",\n serviceProviderIdQualifier: \"01\", // 01 = NPI\n serviceProviderId: pharmacyNpi,\n dateOfService: date,\n softwareCertificationId: `SW${rng.digits(6)}`,\n };\n}\n\n/** A seeded `CCYYMMDD` service date in a recent window. */\nfunction serviceDate(rng: Rng): string {\n const year = rng.int(2024, 2026);\n const month = rng.int(1, 12);\n const day = rng.int(1, 28);\n return `${String(year)}${String(month).padStart(2, \"0\")}${String(day).padStart(2, \"0\")}`;\n}\n\n/** A field pair; dropped when the value is empty so no empty field is emitted. */\nfunction field(id: string, value: string): TelecomFieldInput {\n return { id, value };\n}\n\n/** The Patient segment (01) — CA/CB name, C4 DOB, C5 gender, CM address, CQ phone, CY patient id. */\nfunction patientSegment(rng: Rng): TelecomSegmentInput {\n const p = ncpdpPatient(rng);\n return {\n segmentId: \"01\",\n fields: [\n field(\"C4\", p.dob),\n field(\"C5\", p.gender),\n field(\"CA\", p.person.given),\n field(\"CB\", p.person.family),\n field(\"CM\", p.address.street),\n field(\"CQ\", digitsOnly(p.phone)),\n field(\"CY\", p.patientId),\n ],\n };\n}\n\n/** The Insurance segment (04) — C2 cardholder id, C1 group, C3 person code, CC/CD cardholder name. */\nfunction insuranceSegment(rng: Rng): TelecomSegmentInput {\n const c = ncpdpCardholder(rng);\n return {\n segmentId: \"04\",\n fields: [\n field(\"C2\", c.cardholderId),\n field(\"C1\", c.groupId),\n field(\"C3\", c.personCode),\n field(\"CC\", c.person.given),\n field(\"CD\", c.person.family),\n ],\n };\n}\n\n/** The Prescriber segment (03) — DB prescriber id (NPI), EZ qualifier (`01` = NPI). */\nfunction prescriberSegment(rng: Rng): TelecomSegmentInput {\n const dr = ncpdpPrescriber(rng);\n return {\n segmentId: \"03\",\n fields: [field(\"EZ\", \"01\"), field(\"DB\", dr.npi)],\n };\n}\n\n/** The Claim segment (07) — Rx ref, product (NDC), quantity, days supply, DAW. `minimal` for a reversal. */\nfunction claimSegment(rng: Rng, minimal: boolean): TelecomSegmentInput {\n const drug = rng.pick(EXAMPLE_DRUGS);\n const rxRef = `RX${rng.digits(7)}`;\n const fill = String(rng.int(0, 5));\n if (minimal) {\n return {\n segmentId: \"07\",\n fields: [field(\"EM\", \"1\"), field(\"D2\", rxRef), field(\"D3\", fill)],\n };\n }\n return {\n segmentId: \"07\",\n fields: [\n field(\"EM\", \"1\"), // 1 = Rx Billing\n field(\"D2\", rxRef),\n field(\"D3\", fill),\n field(\"E1\", \"03\"), // 03 = NDC\n field(\"D7\", drug.ndc),\n field(\"E7\", String(rng.int(30, 90))),\n field(\"D5\", String(rng.pick([30, 60, 90] as const))),\n field(\"D8\", rng.pick(DAW_CODES)),\n ],\n };\n}\n\n/**\n * Generate a spec-clean Telecom transaction of the given code, built through\n * `@cosyte/ncpdp`'s `buildTelecomRequest` + `serializeTelecom`. `B1`/`B3` carry the full\n * patient / insurance / prescriber / claim segment set; `B2` (reversal) is the minimal\n * insurance + claim-reference set a reversal actually carries. Every identity value is\n * synthetic-by-construction; the transaction round-trips through `parseTelecom` with zero\n * warnings.\n *\n * @param code - `\"B1\"` billing, `\"B2\"` reversal, or `\"B3\"` rebill.\n * @param options - The seed. See {@link GenerateTelecomOptions}.\n * @returns The serialized Telecom wire string.\n * @example\n * ```ts\n * import { generateTelecom } from \"@cosyte/synth/ncpdp\";\n * const wire = generateTelecom(\"B1\", { seed: 42 });\n * ```\n */\nexport function generateTelecom(\n code: TelecomTransactionCode,\n options: GenerateTelecomOptions,\n): string {\n const rng = createRng(options.seed);\n const pharmacy = ncpdpPharmacy(rng);\n const head = header(rng, code, pharmacy.npi);\n const segments: TelecomSegmentInput[] =\n code === \"B2\"\n ? [insuranceSegment(rng), claimSegment(rng, true)]\n : [\n patientSegment(rng),\n insuranceSegment(rng),\n prescriberSegment(rng),\n claimSegment(rng, false),\n ];\n return serializeTelecom(buildTelecomRequest({ header: head, segments }));\n}\n\n/**\n * Generate a spec-clean Telecom **B1** billing claim.\n *\n * @param options - The seed.\n * @returns The serialized Telecom wire string.\n * @example\n * ```ts\n * import { generateB1 } from \"@cosyte/synth/ncpdp\";\n * const wire = generateB1({ seed: 1 });\n * ```\n */\nexport function generateB1(options: GenerateTelecomOptions): string {\n return generateTelecom(\"B1\", options);\n}\n\n/**\n * Generate a spec-clean Telecom **B2** reversal.\n *\n * @param options - The seed.\n * @returns The serialized Telecom wire string.\n * @example\n * ```ts\n * import { generateB2 } from \"@cosyte/synth/ncpdp\";\n * const wire = generateB2({ seed: 1 });\n * ```\n */\nexport function generateB2(options: GenerateTelecomOptions): string {\n return generateTelecom(\"B2\", options);\n}\n\n/**\n * Generate a spec-clean Telecom **B3** rebill.\n *\n * @param options - The seed.\n * @returns The serialized Telecom wire string.\n * @example\n * ```ts\n * import { generateB3 } from \"@cosyte/synth/ncpdp\";\n * const wire = generateB3({ seed: 1 });\n * ```\n */\nexport function generateB3(options: GenerateTelecomOptions): string {\n return generateTelecom(\"B3\", options);\n}\n","/**\n * The **round-trip-through-the-parser harness** for NCPDP — the headline gate for the synthetic-fixture\n * generator. A generated SCRIPT XML or Telecom claim is \"spec-clean\" only if\n * `@cosyte/ncpdp` — not `@cosyte/synth`'s own opinion — reads it back cleanly. Each harness parses the\n * generated wire text straight back through the parser and reports what it found, so a false\n * \"spec-clean\" claim cannot hide.\n *\n * SCRIPT and Telecom are two structurally unrelated standards, so each gets its own harness; both\n * report the same {@link RoundTripResult} shape.\n *\n * @module\n */\n\nimport { parseScript, serializeScript } from \"@cosyte/ncpdp/script\";\nimport { parseTelecom, serializeTelecom } from \"@cosyte/ncpdp/telecom\";\n\n/** The verdict of one round-trip through `@cosyte/ncpdp`. */\nexport interface RoundTripResult {\n /** The serialized NCPDP wire text (the serializer's own conservative emit). */\n readonly content: string;\n /** The warning codes the parser emitted on re-parse. Empty ⇒ spec-clean. */\n readonly warnings: readonly string[];\n /** Whether re-serializing the re-parsed message is byte-identical to `content`. */\n readonly byteStable: boolean;\n /** `true` iff the artifact is spec-clean: zero warnings **and** byte-stable. */\n readonly specClean: boolean;\n}\n\n/**\n * Round-trip a generated **SCRIPT** XML string through parse → serialize and report the verdict. A\n * spec-clean message re-parses with **zero warnings** and re-serializes byte-identically.\n *\n * @param xml - The SCRIPT XML (typically from `generateNewRx` / `generateRxRenewalRequest` / …).\n * @returns The {@link RoundTripResult}.\n * @example\n * ```ts\n * import { generateNewRx, scriptRoundTrip } from \"@cosyte/synth/ncpdp\";\n * const { specClean } = scriptRoundTrip(generateNewRx({ seed: 1 })); // specClean === true\n * ```\n */\nexport function scriptRoundTrip(xml: string): RoundTripResult {\n const message = parseScript(xml);\n const warnings = message.warnings.map((w) => String(w.code));\n const byteStable = serializeScript(message) === xml;\n return { content: xml, warnings, byteStable, specClean: warnings.length === 0 && byteStable };\n}\n\n/**\n * Round-trip a generated **Telecom** wire string through parse → serialize and report the verdict. A\n * spec-clean transaction re-parses with **zero warnings** and re-serializes byte-identically.\n *\n * @param wire - The Telecom wire string (typically from `generateB1` / `generateB2` / `generateB3`).\n * @returns The {@link RoundTripResult}.\n * @example\n * ```ts\n * import { generateB1, telecomRoundTrip } from \"@cosyte/synth/ncpdp\";\n * const { specClean } = telecomRoundTrip(generateB1({ seed: 1 })); // specClean === true\n * ```\n */\nexport function telecomRoundTrip(wire: string): RoundTripResult {\n const transaction = parseTelecom(wire);\n const warnings = transaction.warnings.map((w) => String(w.code));\n const byteStable = serializeTelecom(transaction) === wire;\n return { content: wire, warnings, byteStable, specClean: warnings.length === 0 && byteStable };\n}\n","/**\n * The **selector chokepoint**. A generator's options are almost all *selectors*: a message kind, a\n * document type, a corpus mix, a claim variant, a Bundle type, a profile. Each is typed as a closed\n * union, and every one of those unions is **erased at run time**, so a JavaScript caller (or a\n * `as never` in someone's test) reaches the branch with any string at all.\n *\n * Three things went wrong when that was left unchecked, and they are all the same bug:\n *\n * 1. **The value reached a diagnostic.** An unrecognised `documentType` travelled into\n * `@cosyte/ccda`'s `buildCcda`, which is entitled to quote it back in its own `TypeError` and\n * does. This package then has a caller-supplied string on an `err.message` and an `err.stack`,\n * through its own public entry point, having taken no care of it.\n * 2. **The value reached the model.** A corpus mix entry becomes an `Artifact.kind` and a\n * `manifest.counts` key, which is precisely the structural-identifier position a downstream\n * package interpolates to describe a location.\n * 3. **The fixture was silently mislabeled.** An exhaustive `switch` over an erased union takes no\n * branch and returns `undefined`, or a trailing `else` quietly generates something else. A corpus\n * whose manifest says it holds one transaction and holds another is a golden file that lies.\n *\n * So a selector is resolved against its own set, once, before anything is generated, and an\n * unrecognised one is a fatal `SYNTH_UNSUPPORTED_KIND`. Like every fatal here it carries a code and a\n * fixed message, and quotes neither the request nor the set.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/**\n * Resolve one caller-supplied selector against the closed set that governs it, or **fail closed**.\n *\n * @param allowed - Every value the selector may take.\n * @param requested - The selector the caller supplied.\n * @returns `requested`, narrowed to the union.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` when `requested` is not in `allowed`.\n * @example\n * ```ts\n * import { resolveKind } from \"@cosyte/synth\";\n * resolveKind([\"ccd\", \"referralNote\"] as const, \"ccd\"); // \"ccd\"\n * ```\n */\nexport function resolveKind<T extends string>(allowed: readonly T[], requested: string): T {\n const match = allowed.find((value) => value === requested);\n if (match === undefined) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_KIND);\n return match;\n}\n\n/**\n * Resolve every entry of a caller-supplied corpus mix, in order, or **fail closed** on the first\n * unrecognised one.\n *\n * It substitutes the default **only** when the caller supplied nothing, which is exactly what the\n * `??` it replaced did. An empty array is a supplied mix and is returned as one. An earlier version\n * of this function also treated `[]` as \"nothing supplied\", on the stated grounds that it matched the\n * previous behaviour; it did not — `??` fires on `undefined` and never on `[]` — and it changed the\n * result of six published entry points, turning an explicit empty selection into \"generate one of\n * everything\". A convenience that fails open is not a convenience.\n *\n * @param allowed - Every kind the corpus may generate.\n * @param requested - The mix the caller supplied, or `undefined` for the default.\n * @param fallback - The default mix, used only when `requested` is `undefined`.\n * @returns The resolved mix.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` on the first unrecognised entry.\n * @example\n * ```ts\n * import { resolveMix } from \"@cosyte/synth\";\n * resolveMix([\"Result\", \"Order\"] as const, [\"Order\"], [\"Result\", \"Order\"]); // [\"Order\"]\n * ```\n */\nexport function resolveMix<T extends string>(\n allowed: readonly T[],\n requested: readonly string[] | undefined,\n fallback: readonly T[],\n): readonly T[] {\n if (requested === undefined) return fallback;\n return requested.map((entry) => resolveKind(allowed, entry));\n}\n","/**\n * `@cosyte/synth/ncpdp` — the NCPDP generation surface, exposed as its own subpath so importing the\n * package root does **not** pull `@cosyte/ncpdp`. This is the **lazy, per-format** boundary: a consumer\n * who only needs NCPDP fixtures imports `@cosyte/synth/ncpdp`; one who needs only the core primitives\n * never loads a parser.\n * `@cosyte/ncpdp` is an **optional peer dependency** — present only for this subpath.\n *\n * This subpath ships spec-clean generation across both NCPDP standards, each built through\n * `@cosyte/ncpdp`'s own emit surface:\n *\n * - **SCRIPT** ePrescribing (`@cosyte/ncpdp/script`): `generateNewRx` (via the validated `buildNewRx`\n * builder), `generateRxRenewalRequest`, and `generateRxChangeRequest` (via the parser's public typed\n * `ScriptMessage` model + `serializeScript`) — each round-tripping through `parseScript` with zero\n * warnings, and carrying a prescriber whose NPI is invalid-Luhn and whose **DEA is invalid-checksum**.\n * - **Telecom** claims (`@cosyte/ncpdp/telecom`): `generateB1` (billing), `generateB2` (reversal), and\n * `generateB3` (rebill) via `buildTelecomRequest` + `serializeTelecom` — each round-tripping through\n * `parseTelecom` with zero warnings, with patient / cardholder identity from the synthetic providers.\n *\n * **Deferred:** **quirk mode**. SCRIPT is limited to the transactions `@cosyte/ncpdp` can *build* — NewRx\n * plus the\n * renewal/change **requests**; the renewal/change *responses* and the reversal cases beyond B2's\n * reference set track the parser's builder surface, never hand-written bytes.\n *\n * @module\n */\n\nimport { createRng } from \"../rng/rng.js\";\nimport { makeCorpus, type Corpus } from \"../corpus.js\";\n\nimport { generateNewRx, generateRxRenewalRequest, generateRxChangeRequest } from \"./script.js\";\nimport { generateTelecom } from \"./telecom.js\";\nimport { scriptRoundTrip, telecomRoundTrip } from \"./round-trip.js\";\nimport { resolveMix } from \"../select.js\";\n\nexport {\n generateNewRx,\n generateRxRenewalRequest,\n generateRxChangeRequest,\n type GenerateScriptOptions,\n} from \"./script.js\";\nexport {\n generateTelecom,\n generateB1,\n generateB2,\n generateB3,\n type TelecomTransactionCode,\n type GenerateTelecomOptions,\n} from \"./telecom.js\";\nexport { scriptRoundTrip, telecomRoundTrip, type RoundTripResult } from \"./round-trip.js\";\nexport {\n ncpdpPatient,\n ncpdpPrescriber,\n ncpdpPharmacy,\n ncpdpCardholder,\n ncpdpScriptRouting,\n type NcpdpPatient,\n type NcpdpPrescriber,\n type NcpdpPharmacy,\n type NcpdpCardholder,\n type NcpdpScriptRouting,\n} from \"./identity.js\";\nexport {\n EXAMPLE_DRUGS,\n EXAMPLE_SIG_TEXT,\n DAW_CODES,\n type NcpdpExampleDrug,\n} from \"./example-codes.js\";\n\n/** Every NCPDP transaction kind {@link ncpdpCorpus} generates — the label used as the corpus `kind`. */\nexport type NcpdpCorpusKind = \"NewRx\" | \"RxRenewalRequest\" | \"RxChangeRequest\" | \"B1\" | \"B2\" | \"B3\";\n\n/** Every kind {@link ncpdpCorpus} accepts, and the default mix — one of each shipped transaction. */\nconst ALL_KINDS: readonly NcpdpCorpusKind[] = Object.freeze([\n \"NewRx\",\n \"RxRenewalRequest\",\n \"RxChangeRequest\",\n \"B1\",\n \"B2\",\n \"B3\",\n]);\nconst DEFAULT_MIX = ALL_KINDS;\n\n/** Generate one transaction of the given kind from a sub-seed, returning the round-trip verdict. */\nfunction generateKind(kind: NcpdpCorpusKind, seed: number): ReturnType<typeof scriptRoundTrip> {\n switch (kind) {\n case \"NewRx\":\n return scriptRoundTrip(generateNewRx({ seed }));\n case \"RxRenewalRequest\":\n return scriptRoundTrip(generateRxRenewalRequest({ seed }));\n case \"RxChangeRequest\":\n return scriptRoundTrip(generateRxChangeRequest({ seed }));\n case \"B1\":\n case \"B2\":\n case \"B3\":\n return telecomRoundTrip(generateTelecom(kind, { seed }));\n }\n}\n\n/** Options for {@link ncpdpCorpus}. */\nexport interface NcpdpCorpusOptions {\n /** The seed for the whole corpus (deterministic). */\n readonly seed: number;\n /** How many transactions to generate. Defaults to the length of the mix. */\n readonly count?: number;\n /** The transaction kinds to cycle through. Defaults to one of each. */\n readonly mix?: readonly NcpdpCorpusKind[];\n}\n\n/**\n * Build a reproducible {@link Corpus} of spec-clean NCPDP transactions. Each transaction is generated\n * from a distinct sub-seed derived from the corpus seed (so the set is deterministic) and round-tripped\n * through `@cosyte/ncpdp`; the per-artifact `warnings` record the parser's verdict (empty ⇒ spec-clean).\n *\n * @param options - Seed, count, and the transaction mix. See {@link NcpdpCorpusOptions}.\n * @returns A deep-frozen {@link Corpus}.\n * @example\n * ```ts\n * import { ncpdpCorpus } from \"@cosyte/synth/ncpdp\";\n * const corpus = ncpdpCorpus({ seed: 42 });\n * corpus.artifacts.every((a) => a.warnings.length === 0); // true — spec-clean\n * ```\n */\nexport function ncpdpCorpus(options: NcpdpCorpusOptions): Corpus {\n const { seed } = options;\n const mix = resolveMix(ALL_KINDS, options.mix, DEFAULT_MIX);\n const count = options.count ?? mix.length;\n const seedStream = createRng(seed);\n const artifacts = Array.from({ length: count }, (_unused, i) => {\n const kind = mix[i % mix.length] ?? \"NewRx\";\n const txSeed = seedStream.nextUint32();\n const rt = generateKind(kind, txSeed);\n return {\n format: \"ncpdp\" as const,\n kind,\n content: rt.content,\n warnings: rt.warnings,\n };\n });\n return makeCorpus(seed, artifacts);\n}\n"]}