Full Code of exercism/typescript for AI

main 3c3b7d4973aa cached
1803 files
4.0 MB
1.2M tokens
4744 symbols
1 requests
Download .txt
Showing preview only (4,618K chars total). Download the full file or copy to clipboard to get everything.
Repository: exercism/typescript
Branch: main
Commit: 3c3b7d4973aa
Files: 1803
Total size: 4.0 MB

Directory structure:
gitextract_nny146az/

├── .appends/
│   └── .github/
│       └── labels.yml
├── .dependabot/
│   └── config.yml
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── dependabot.yml
│   ├── labels.yml
│   └── workflows/
│       ├── action-format.yml
│       ├── action-sync.yml
│       ├── ci.js.yml
│       ├── codeql.yml
│       ├── configlet.yml
│       ├── no-important-files-changed.yml
│       ├── pause-community-contributions.yml
│       ├── ping-cross-track-maintainers-team.yml
│       ├── pr.ci.js.yml
│       ├── run-configlet-sync.yml
│       ├── sync-labels.yml
│       └── verify-code-formatting.yml
├── .gitignore
├── .prettierignore
├── .prettierrc
├── .vscode/
│   ├── extensions.json
│   └── settings.json
├── .yarn/
│   └── sdks/
│       ├── eslint/
│       │   ├── bin/
│       │   │   └── eslint.js
│       │   ├── lib/
│       │   │   ├── api.js
│       │   │   └── unsupported-api.js
│       │   └── package.json
│       ├── integrations.yml
│       ├── prettier/
│       │   ├── bin/
│       │   │   └── prettier.cjs
│       │   ├── index.cjs
│       │   └── package.json
│       └── typescript/
│           ├── bin/
│           │   ├── tsc
│           │   └── tsserver
│           ├── lib/
│           │   ├── tsc.js
│           │   ├── tsserver.js
│           │   ├── tsserverlibrary.js
│           │   └── typescript.js
│           └── package.json
├── .yarnrc.yml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── TAGS.md
├── babel.config.cjs
├── bin/
│   ├── check-formatting.sh
│   ├── fetch-configlet
│   ├── fetch-configlet.ps1
│   ├── format.sh
│   ├── generate-config-tree
│   ├── md5-hash
│   └── print-config-tree
├── common/
│   ├── .vscode/
│   │   ├── extensions.json
│   │   └── settings.json
│   ├── .yarnrc.yml
│   ├── babel.config.cjs
│   ├── eslint.config.mjs
│   ├── jest.config.cjs
│   ├── keep.ts
│   ├── package.json
│   ├── test-runner.mjs
│   └── tsconfig.json
├── concepts/
│   ├── .keep
│   └── basics/
│       ├── .meta/
│       │   └── config.json
│       ├── about.md
│       ├── introduction.md
│       └── links.json
├── config.json
├── docs/
│   ├── ABOUT.md
│   ├── INSTALLATION.md
│   ├── LEARNING.md
│   ├── RESOURCES.md
│   ├── SNIPPET.txt
│   ├── TESTS.md
│   └── config.json
├── eslint.config.mjs
├── exercises/
│   ├── concept/
│   │   ├── .keep
│   │   └── lasagna/
│   │       ├── .docs/
│   │       │   ├── hints.md
│   │       │   ├── instructions.md
│   │       │   └── introduction.md
│   │       ├── .meta/
│   │       │   ├── config.json
│   │       │   ├── design.md
│   │       │   └── exemplar.ts
│   │       ├── .vscode/
│   │       │   ├── extensions.json
│   │       │   └── settings.json
│   │       ├── .yarnrc.yml
│   │       ├── __typetests__/
│   │       │   └── lasagna.tst.ts
│   │       ├── babel.config.cjs
│   │       ├── eslint.config.mjs
│   │       ├── jest.config.cjs
│   │       ├── lasagna.test.ts
│   │       ├── lasagna.ts
│   │       ├── package.json
│   │       ├── test-runner.mjs
│   │       └── tsconfig.json
│   ├── practice/
│   │   ├── accumulate/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   └── proof.ci.ts
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── accumulate.test.ts
│   │   │   ├── accumulate.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── acronym/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── acronym.test.ts
│   │   │   ├── acronym.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── all-your-base/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── all-your-base.test.ts
│   │   │   ├── all-your-base.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── allergies/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── allergies.test.ts
│   │   │   ├── allergies.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── alphametics/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── alphametics.test.ts
│   │   │   ├── alphametics.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── anagram/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.append.md
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── anagram.test.ts
│   │   │   ├── anagram.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── armstrong-numbers/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── armstrong-numbers.test.ts
│   │   │   ├── armstrong-numbers.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── atbash-cipher/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── atbash-cipher.test.ts
│   │   │   ├── atbash-cipher.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── bank-account/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   ├── solutions/
│   │   │   │   │   └── bank-account.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── bank-account.test.ts
│   │   │   ├── bank-account.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── beer-song/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── beer-song.test.ts
│   │   │   ├── beer-song.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── binary-search/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── binary-search.test.ts
│   │   │   ├── binary-search.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── binary-search-tree/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── binary-search-tree.test.ts
│   │   │   ├── binary-search-tree.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── bob/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── description.md
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── bob.test.ts
│   │   │   ├── bob.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── bottle-song/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── bottle-song.test.ts
│   │   │   ├── bottle-song.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── bowling/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── bowling.test.ts
│   │   │   ├── bowling.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── camicia/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── camicia.test.ts
│   │   │   ├── camicia.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── circular-buffer/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── circular-buffer.test.ts
│   │   │   ├── circular-buffer.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── clock/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── clock.test.ts
│   │   │   ├── clock.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── collatz-conjecture/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── collatz-conjecture.test.ts
│   │   │   ├── collatz-conjecture.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── complex-numbers/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── complex-numbers.test.ts
│   │   │   ├── complex-numbers.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── connect/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── connect.test.ts
│   │   │   ├── connect.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── crypto-square/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── crypto-square.test.ts
│   │   │   ├── crypto-square.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── custom-set/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── custom-set.test.ts
│   │   │   ├── custom-set.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── darts/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── darts.test.ts
│   │   │   ├── darts.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── diamond/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── diamond.test.ts
│   │   │   ├── diamond.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── difference-of-squares/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── difference-of-squares.test.ts
│   │   │   ├── difference-of-squares.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── diffie-hellman/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── diffie-hellman.test.ts
│   │   │   ├── diffie-hellman.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── dnd-character/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── dnd-character.test.ts
│   │   │   ├── dnd-character.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── eliuds-eggs/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eliuds-eggs.test.ts
│   │   │   ├── eliuds-eggs.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── etl/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── etl.test.ts
│   │   │   ├── etl.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── flatten-array/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── flatten-array.test.ts
│   │   │   ├── flatten-array.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── flower-field/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── flower-field.test.ts
│   │   │   ├── flower-field.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── food-chain/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── food-chain.test.ts
│   │   │   ├── food-chain.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── game-of-life/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── game-of-life.test.ts
│   │   │   ├── game-of-life.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── gigasecond/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── gigasecond.test.ts
│   │   │   ├── gigasecond.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── grade-school/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── grade-school.test.ts
│   │   │   ├── grade-school.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── grains/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── grains.test.ts
│   │   │   ├── grains.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── hamming/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── hamming.test.ts
│   │   │   ├── hamming.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── hello-world/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.append.md
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── hello-world.test.ts
│   │   │   ├── hello-world.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── house/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── house.test.ts
│   │   │   ├── house.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── isbn-verifier/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── isbn-verifier.test.ts
│   │   │   ├── isbn-verifier.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── isogram/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── isogram.test.ts
│   │   │   ├── isogram.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── kindergarten-garden/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── kindergarten-garden.test.ts
│   │   │   ├── kindergarten-garden.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── knapsack/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── knapsack.test.ts
│   │   │   ├── knapsack.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── largest-series-product/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── largest-series-product.test.ts
│   │   │   ├── largest-series-product.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── leap/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── leap.test.ts
│   │   │   ├── leap.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── line-up/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── line-up.test.ts
│   │   │   ├── line-up.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── linked-list/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   └── proof.ci.ts
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── linked-list.test.ts
│   │   │   ├── linked-list.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── list-ops/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.append.md
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── list-ops.test.ts
│   │   │   ├── list-ops.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── luhn/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── luhn.test.ts
│   │   │   ├── luhn.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── matching-brackets/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── matching-brackets.test.ts
│   │   │   ├── matching-brackets.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── matrix/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── matrix.test.ts
│   │   │   ├── matrix.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── minesweeper/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── minesweeper.test.ts
│   │   │   ├── minesweeper.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── nth-prime/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── nth-prime.test.ts
│   │   │   ├── nth-prime.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── nucleotide-count/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── nucleotide-count.test.ts
│   │   │   ├── nucleotide-count.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── ocr-numbers/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── ocr-numbers.test.ts
│   │   │   ├── ocr-numbers.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── palindrome-products/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── palindrome-products.test.ts
│   │   │   ├── palindrome-products.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── pangram/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── pangram.test.ts
│   │   │   ├── pangram.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── pascals-triangle/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── pascals-triangle.test.ts
│   │   │   ├── pascals-triangle.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── perfect-numbers/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── perfect-numbers.test.ts
│   │   │   ├── perfect-numbers.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── phone-number/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── phone-number.test.ts
│   │   │   ├── phone-number.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── pig-latin/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── pig-latin.test.ts
│   │   │   ├── pig-latin.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── prime-factors/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── prime-factors.test.ts
│   │   │   ├── prime-factors.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── prism/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── prism.test.ts
│   │   │   ├── prism.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── protein-translation/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── protein-translation.test.ts
│   │   │   ├── protein-translation.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── proverb/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── proverb.test.ts
│   │   │   ├── proverb.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── pythagorean-triplet/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── pythagorean-triplet.test.ts
│   │   │   ├── pythagorean-triplet.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── queen-attack/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.append.md
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── queen-attack.test.ts
│   │   │   ├── queen-attack.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── raindrops/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── raindrops.test.ts
│   │   │   ├── raindrops.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── rational-numbers/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── rational-numbers.test.ts
│   │   │   ├── rational-numbers.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── react/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── react.test.ts
│   │   │   ├── react.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── rectangles/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── rectangles.test.ts
│   │   │   ├── rectangles.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── relative-distance/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── relative-distance.test.ts
│   │   │   ├── relative-distance.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── resistor-color/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── resistor-color.test.ts
│   │   │   ├── resistor-color.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── resistor-color-duo/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── resistor-color-duo.test.ts
│   │   │   ├── resistor-color-duo.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── resistor-color-trio/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── resistor-color-trio.test.ts
│   │   │   ├── resistor-color-trio.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── reverse-string/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── reverse-string.test.ts
│   │   │   ├── reverse-string.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── rna-transcription/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── rna-transcription.test.ts
│   │   │   ├── rna-transcription.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── robot-name/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   └── proof.ci.ts
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── robot-name.test.ts
│   │   │   ├── robot-name.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── robot-simulator/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── robot-simulator.test.ts
│   │   │   ├── robot-simulator.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── roman-numerals/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── roman-numerals.test.ts
│   │   │   ├── roman-numerals.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── rotational-cipher/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── rotational-cipher.test.ts
│   │   │   ├── rotational-cipher.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── run-length-encoding/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── run-length-encoding.test.ts
│   │   │   ├── run-length-encoding.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── saddle-points/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── saddle-points.test.ts
│   │   │   ├── saddle-points.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── say/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── say.test.ts
│   │   │   ├── say.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── scrabble-score/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── scrabble-score.test.ts
│   │   │   ├── scrabble-score.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── secret-handshake/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── secret-handshake.test.ts
│   │   │   ├── secret-handshake.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── series/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── series.test.ts
│   │   │   ├── series.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── sieve/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── sieve.test.ts
│   │   │   ├── sieve.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── simple-cipher/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── simple-cipher.test.ts
│   │   │   ├── simple-cipher.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── space-age/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── space-age.test.ts
│   │   │   ├── space-age.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── spiral-matrix/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── spiral-matrix.test.ts
│   │   │   ├── spiral-matrix.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── split-second-stopwatch/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── split-second-stopwatch.test.ts
│   │   │   ├── split-second-stopwatch.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── square-root/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── square-root.test.ts
│   │   │   ├── square-root.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── state-of-tic-tac-toe/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── state-of-tic-tac-toe.test.ts
│   │   │   ├── state-of-tic-tac-toe.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── strain/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── strain.test.ts
│   │   │   ├── strain.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── sublist/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── sublist.test.ts
│   │   │   ├── sublist.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── sum-of-multiples/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── sum-of-multiples.test.ts
│   │   │   ├── sum-of-multiples.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── tournament/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tournament.test.ts
│   │   │   ├── tournament.ts
│   │   │   └── tsconfig.json
│   │   ├── transpose/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── transpose.test.ts
│   │   │   ├── transpose.ts
│   │   │   └── tsconfig.json
│   │   ├── triangle/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── triangle.test.ts
│   │   │   ├── triangle.ts
│   │   │   └── tsconfig.json
│   │   ├── twelve-days/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── twelve-days.test.ts
│   │   │   └── twelve-days.ts
│   │   ├── two-bucket/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── two-bucket.test.ts
│   │   │   └── two-bucket.ts
│   │   ├── two-fer/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── two-fer.test.ts
│   │   │   └── two-fer.ts
│   │   ├── variable-length-quantity/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── variable-length-quantity.test.ts
│   │   │   └── variable-length-quantity.ts
│   │   ├── word-count/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── word-count.test.ts
│   │   │   └── word-count.ts
│   │   ├── word-search/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── word-search.test.ts
│   │   │   └── word-search.ts
│   │   ├── wordy/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── wordy.test.ts
│   │   │   └── wordy.ts
│   │   └── yacht/
│   │       ├── .docs/
│   │       │   ├── instructions.md
│   │       │   └── introduction.md
│   │       ├── .meta/
│   │       │   ├── config.json
│   │       │   ├── proof.ci.ts
│   │       │   └── tests.toml
│   │       ├── .vscode/
│   │       │   ├── extensions.json
│   │       │   └── settings.json
│   │       ├── .yarn/
│   │       │   └── releases/
│   │       │       └── yarn-3.6.4.cjs
│   │       ├── .yarnrc.yml
│   │       ├── babel.config.cjs
│   │       ├── eslint.config.mjs
│   │       ├── jest.config.cjs
│   │       ├── package.json
│   │       ├── test-runner.mjs
│   │       ├── tsconfig.json
│   │       ├── yacht.test.ts
│   │       └── yacht.ts
│   └── shared/
│       └── .docs/
│           ├── help.md
│           └── tests.md
├── package.json
├── reference/
│   └── implementing-a-concept-exercise.md
├── scripts/
│   ├── checksum.mjs
│   ├── ci-check.mjs
│   ├── ci.mjs
│   ├── format.mjs
│   ├── helpers.mjs
│   ├── lint.mjs
│   ├── name-check.mjs
│   ├── name-uniq.mjs
│   ├── pr-check.mjs
│   ├── pr.mjs
│   ├── stub-check.mjs
│   ├── sync.mjs
│   └── test.mjs
├── tsconfig.json
└── yarn-error.log

================================================
FILE CONTENTS
================================================

================================================
FILE: .appends/.github/labels.yml
================================================
# ----------------------------------------------------------------------------------------- #
# These are the repository-specific labels that augment the Exercise-wide labels defined in #
# https://github.com/exercism/org-wide-files/blob/main/global-files/.github/labels.yml.     #
# ----------------------------------------------------------------------------------------- #

- name: 'breaking :boom:'
  description: ''
  color: 'fca708'

- name: 'bug :bug:'
  description: "Something isn't working"
  color: 'b60205'

- name: 'chore :wrench:'
  description: 'Meta related task such as build, test, linting, maintainers.json etc.'
  color: '000000'

- name: 'ci :gear:'
  description: 'Continuous integration related'
  color: '000000'

- name: 'dependencies'
  description: 'Pull requests that update a dependency file'
  color: '0366d6'

- name: 'discussion :speech_balloon:'
  description: ''
  color: 'fbca04'

- name: 'do not merge :construction:'
  description: ''
  color: 'fbca04'

- name: 'documentation :book:'
  description: 'Documentation changes'
  color: '1d76db'

- name: 'duplicate  :repeat:'
  description: 'This issue or pull request already exists'
  color: 'ffffff'

- name: 'enhancement :unicorn:'
  description: "Changing current behaviour, enhancing what's already there"
  color: 'a2eeef'

- name: 'github_actions'
  description: 'Pull requests that update Github_actions code'
  color: '000000'

- name: 'good first issue'
  description: 'First-time contributors preferred'
  color: 'b1db51'

- name: 'hacktoberfest'
  description: 'Hacktoberfest issues! Everyone allowed <3'
  color: '000000'

- name: 'help wanted'
  description: ''
  color: 'b1db51'

- name: 'invalid'
  description: ''
  color: 'ffffff'

- name: 'javascript'
  description: 'Pull requests that update Javascript code'
  color: '168700'

- name: 'new exercise :sparkles:'
  description: 'Adding an exercise from the canonical data'
  color: '1105b7'

- name: 'question :thinking:'
  description: ''
  color: 'ffffff'

- name: 'reputation/contributed_code/major'
  description: ''
  color: '34FBF8'

- name: 'reputation/contributed_code/minor'
  description: ''
  color: 'EF6513'

- name: 'rfc :speech_balloon:'
  description: 'Request for Comments'
  color: 'fbca04'

- name: 'security :rotating_light:'
  description: 'Security related issue or change'
  color: 'b60205'

- name: 'sync :arrows_counterclockwise:'
  description: 'Sync an exercise with the canonical data'
  color: '1105b7'

- name: 'track-anatomy'
  description: 'config.json, new exercises'
  color: '000000'

- name: 'upstream ⬆'
  description: ''
  color: 'ffffff'

- name: 'v3-migration 🤖'
  description: 'Preparing for Exercism v3'
  color: 'E99695'

- name: 'wontfix :no_good_woman:'
  description: ''
  color: 'ffffff'


================================================
FILE: .dependabot/config.yml
================================================
version: 1
update_configs:
  - package_manager: 'javascript'
    directory: '/'
    update_schedule: 'live'
    allowed_updates:
      - match:
          update_type: 'security'


================================================
FILE: .gitattributes
================================================
* text=auto eol=lf


================================================
FILE: .github/CODEOWNERS
================================================
# Code owners
.github/CODEOWNERS      @exercism/maintainers-admin

# Changes to `fetch-configlet` should be made in the `exercism/configlet` repo
bin/fetch-configlet     @exercism/maintainers-admin
bin/fetch-configlet.ps1 @exercism/maintainers-admin



================================================
FILE: .github/dependabot.yml
================================================
version: 2

updates:
  # Keep dependencies for GitHub Actions up-to-date
  - package-ecosystem: 'github-actions'
    directory: '/'
    schedule:
      interval: 'monthly'

  # Enable version updates for npm (yarn)
  - package-ecosystem: 'npm'
    # Look for `package.json` and `lock` files in the `root` directory
    directory: '/'
    # Check the npm registry for updates every day (weekdays)
    schedule:
      interval: 'monthly'

  # Enable version updates for npm (yarn)
  - package-ecosystem: 'npm'
    # Look for `package.json` and `lock` files in the common directory
    directory: '/common/'
    # Check the npm registry for updates every day (weekdays)
    schedule:
      interval: 'monthly'


================================================
FILE: .github/labels.yml
================================================
# --------------------------------------------------------------- #
# This is an auto-generated file - Do not manually edit this file #
# --------------------------------------------------------------- #

# This file is automatically generated by concatenating two files:
#
# 1. The Exercism-wide labels: defined in https://github.com/exercism/org-wide-files/blob/main/global-files/.github/labels.yml
# 2. The repository-specific labels: defined in the `.appends/.github/labels.yml` file within this repository.
#
# If any of these two files change, a pull request is automatically created containing a re-generated version of this file.
# Consequently, to change repository-specific labels you should update the `.appends/.github/labels.yml` file and _not_ this file.
#
# When the pull request has been merged, the GitHub labels will be automatically updated by the "Sync labels" workflow.
# This typically takes 5-10 minutes.

# --------------------------------------------------------------------- #
# These are the Exercism-wide labels which are shared across all repos. #
# --------------------------------------------------------------------- #

# The following Exercism-wide labels are used to show "tasks" on the website, which will point users to things they can contribute to.

# The `x:action/<value>` labels describe what sort of work the contributor will be engaged in when working on the issue
- name: "x:action/create"
  description: "Work on something from scratch"
  color: "ffffff"

- name: "x:action/fix"
  description: "Fix an issue"
  color: "ffffff"

- name: "x:action/improve"
  description: "Improve existing functionality/content"
  color: "ffffff"

- name: "x:action/proofread"
  description: "Proofread text"
  color: "ffffff"

- name: "x:action/sync"
  description: "Sync content with its latest version"
  color: "ffffff"

# The `x:knowledge/<value>` labels describe how much Exercism knowledge is required by the contributor
- name: "x:knowledge/none"
  description: "No existing Exercism knowledge required"
  color: "ffffff"

- name: "x:knowledge/elementary"
  description: "Little Exercism knowledge required"
  color: "ffffff"

- name: "x:knowledge/intermediate"
  description: "Quite a bit of Exercism knowledge required"
  color: "ffffff"

- name: "x:knowledge/advanced"
  description: "Comprehensive Exercism knowledge required"
  color: "ffffff"

# The `x:module/<value>` labels indicate what part of Exercism the contributor will be working on
- name: "x:module/analyzer"
  description: "Work on Analyzers"
  color: "ffffff"

- name: "x:module/concept"
  description: "Work on Concepts"
  color: "ffffff"

- name: "x:module/concept-exercise"
  description: "Work on Concept Exercises"
  color: "ffffff"

- name: "x:module/generator"
  description: "Work on Exercise generators"
  color: "ffffff"

- name: "x:module/practice-exercise"
  description: "Work on Practice Exercises"
  color: "ffffff"

- name: "x:module/representer"
  description: "Work on Representers"
  color: "ffffff"

- name: "x:module/test-runner"
  description: "Work on Test Runners"
  color: "ffffff"

# The `x:rep/<value>` labels describe the amount of reputation to award
#
# For more information on reputation and how these labels should be used,
# check out https://exercism.org/docs/using/product/reputation
- name: "x:rep/tiny"
  description: "Tiny amount of reputation"
  color: "ffffff"

- name: "x:rep/small"
  description: "Small amount of reputation"
  color: "ffffff"

- name: "x:rep/medium"
  description: "Medium amount of reputation"
  color: "ffffff"

- name: "x:rep/large"
  description: "Large amount of reputation"
  color: "ffffff"

- name: "x:rep/massive"
  description: "Massive amount of reputation"
  color: "ffffff"

# The `x:size/<value>` labels describe the expected amount of work for a contributor
- name: "x:size/tiny"
  description: "Tiny amount of work"
  color: "ffffff"

- name: "x:size/small"
  description: "Small amount of work"
  color: "ffffff"

- name: "x:size/medium"
  description: "Medium amount of work"
  color: "ffffff"

- name: "x:size/large"
  description: "Large amount of work"
  color: "ffffff"

- name: "x:size/massive"
  description: "Massive amount of work"
  color: "ffffff"

# The `x:status/<value>` label indicates if there is already someone working on the issue
- name: "x:status/claimed"
  description: "Someone is working on this issue"
  color: "ffffff"

# The `x:type/<value>` labels describe what type of work the contributor will be engaged in
- name: "x:type/ci"
  description: "Work on Continuous Integration (e.g. GitHub Actions workflows)"
  color: "ffffff"

- name: "x:type/coding"
  description: "Write code that is not student-facing content (e.g. test-runners, generators, but not exercises)"
  color: "ffffff"

- name: "x:type/content"
  description: "Work on content (e.g. exercises, concepts)"
  color: "ffffff"

- name: "x:type/docker"
  description: "Work on Dockerfiles"
  color: "ffffff"

- name: "x:type/docs"
  description: "Work on Documentation"
  color: "ffffff"

# This Exercism-wide label is added to all automatically created pull requests that help migrate/prepare a track for Exercism v3
- name: "v3-migration 🤖"
  description: "Preparing for Exercism v3"
  color: "e99695"

# This Exercism-wide label can be used to bulk-close issues in preparation for pausing community contributions
- name: "paused"
  description: "Work paused until further notice"
  color: "e4e669"

# ----------------------------------------------------------------------------------------- #
# These are the repository-specific labels that augment the Exercise-wide labels defined in #
# https://github.com/exercism/org-wide-files/blob/main/global-files/.github/labels.yml.     #
# ----------------------------------------------------------------------------------------- #

- name: 'breaking :boom:'
  description: ''
  color: 'fca708'

- name: 'bug :bug:'
  description: "Something isn't working"
  color: 'b60205'

- name: 'chore :wrench:'
  description: 'Meta related task such as build, test, linting, maintainers.json etc.'
  color: '000000'

- name: 'ci :gear:'
  description: 'Continuous integration related'
  color: '000000'

- name: 'dependencies'
  description: 'Pull requests that update a dependency file'
  color: '0366d6'

- name: 'discussion :speech_balloon:'
  description: ''
  color: 'fbca04'

- name: 'do not merge :construction:'
  description: ''
  color: 'fbca04'

- name: 'documentation :book:'
  description: 'Documentation changes'
  color: '1d76db'

- name: 'duplicate  :repeat:'
  description: 'This issue or pull request already exists'
  color: 'ffffff'

- name: 'enhancement :unicorn:'
  description: "Changing current behaviour, enhancing what's already there"
  color: 'a2eeef'

- name: 'github_actions'
  description: 'Pull requests that update Github_actions code'
  color: '000000'

- name: 'good first issue'
  description: 'First-time contributors preferred'
  color: 'b1db51'

- name: 'hacktoberfest'
  description: 'Hacktoberfest issues! Everyone allowed <3'
  color: '000000'

- name: 'help wanted'
  description: ''
  color: 'b1db51'

- name: 'invalid'
  description: ''
  color: 'ffffff'

- name: 'javascript'
  description: 'Pull requests that update Javascript code'
  color: '168700'

- name: 'new exercise :sparkles:'
  description: 'Adding an exercise from the canonical data'
  color: '1105b7'

- name: 'question :thinking:'
  description: ''
  color: 'ffffff'

- name: 'reputation/contributed_code/major'
  description: ''
  color: '34FBF8'

- name: 'reputation/contributed_code/minor'
  description: ''
  color: 'EF6513'

- name: 'rfc :speech_balloon:'
  description: 'Request for Comments'
  color: 'fbca04'

- name: 'security :rotating_light:'
  description: 'Security related issue or change'
  color: 'b60205'

- name: 'sync :arrows_counterclockwise:'
  description: 'Sync an exercise with the canonical data'
  color: '1105b7'

- name: 'track-anatomy'
  description: 'config.json, new exercises'
  color: '000000'

- name: 'upstream ⬆'
  description: ''
  color: 'ffffff'

- name: 'v3-migration 🤖'
  description: 'Preparing for Exercism v3'
  color: 'E99695'

- name: 'wontfix :no_good_woman:'
  description: ''
  color: 'ffffff'


================================================
FILE: .github/workflows/action-format.yml
================================================
name: 'typescript / format'

on:
  issue_comment:
    types: [created]

jobs:
  format:
    name: 'Format code'
    runs-on: ubuntu-24.04
    if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/format')
    steps:
      - name: 'Post acknowledgement that it will format code'
        continue-on-error: true # Never fail the build if this fails
        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'The "Format code" action has started running.'
            })

      - name: 'Download PR data'
        run: |
          PR_DATA="/tmp/pr.json"

          jq -r ".issue.pull_request.url" "$GITHUB_EVENT_PATH" | \
            xargs curl --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' -o "$PR_DATA" --url

      - name: 'Check fork status'
        id: fork_status
        run: |
          IS_FORK="$(jq '.head.repo.fork' "/tmp/pr.json")"
          echo "fork=$IS_FORK" >> "$GITHUB_OUTPUT"

      - name: 'Setup SSH deploy key'
        if: steps.fork_status.outputs.fork == 'false'
        run: |
          mkdir ~/.ssh
          echo "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519

      - name: 'Checkout code'
        run: |
          PR_DATA="/tmp/pr.json"

          HEAD_REF=$(jq -r ".head.ref" "$PR_DATA")

          if [ ${{ steps.fork_status.outputs.fork }} == "false" ]; then
            echo "::debug::Setting up repo using SSH"
            HEAD_REPO=$(jq -r '.head.repo.ssh_url' "$PR_DATA")
          else
            echo "::debug::Setting up repo using HTTPS"
            HEAD_REPO=$(jq -r '.head.repo.clone_url | sub("https://"; "https://x-access-token:${{ secrets.GITHUB_TOKEN }}@")' "$PR_DATA")
          fi

          git clone $HEAD_REPO .
          git checkout -b "$HEAD_REF" "origin/$HEAD_REF"
      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901
        run: corepack enable yarn
      - name: Use Node.js LTS (20.x)
        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6
        with:
          node-version: 20.x
          cache: 'yarn'
      - name: Install project development dependencies
        run: corepack yarn install --immutable
      - name: 'Format code'
        run: ./bin/format.sh

      - name: 'Commit formatted code'
        run: |
          # Check if there is nothing to commit (i.e. no formatting changes made)
          if [ -z "$(git status --porcelain)" ]; then
            echo "Code is already formatted correctly"
            exit 0
          fi

          # Setup the git user (required to commit anything)
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
          git config --global user.name "github-actions[bot]"

          # Commit the changes made by prettier
          git add .
          git commit -m "[CI] Format code"
          git push

      - name: 'Post acknowledgement that it has formatted the code'
        continue-on-error: true # Never fail the build if this fails
        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'The "Format code" action has finished running.'
            })

      - name: 'Post reminder to trigger build manually'
        continue-on-error: true # Never fail the build if this fails
        if: steps.fork_status.outputs.fork == 'true'
        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'For security reasons, `/format` does not trigger CI builds when the PR has been submitted from a fork. If checks were not passing due to code format, trigger a build to make the required checks pass, through one of the following ways:\n\n- Push an empty commit to this branch: `git commit --allow-empty -m "Trigger builds"`.\n- Close and reopen the PR.\n- Push a regular commit to this branch.'
            })


================================================
FILE: .github/workflows/action-sync.yml
================================================
name: 'typescript / sync'

on:
  issue_comment:
    types: [created]

jobs:
  format:
    name: 'Sync all exercises'
    runs-on: ubuntu-24.04
    if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/sync')
    steps:
      - name: 'Post acknowledgement that it will sync exercises'
        continue-on-error: true # Never fail the build if this fails
        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'The "Sync all exercises" action has started running.'
            })

      - name: 'Download PR data'
        run: |
          PR_DATA="/tmp/pr.json"

          jq -r ".issue.pull_request.url" "$GITHUB_EVENT_PATH" | \
            xargs curl --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' -o "$PR_DATA" --url

      - name: 'Check fork status'
        id: fork_status
        run: |
          IS_FORK="$(jq '.head.repo.fork' "/tmp/pr.json")"
          echo "fork=$IS_FORK" >> "$GITHUB_OUTPUT"

      - name: 'Setup SSH deploy key'
        if: steps.fork_status.outputs.fork == 'false'
        run: |
          mkdir ~/.ssh
          echo "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519

      - name: 'Checkout code'
        run: |
          PR_DATA="/tmp/pr.json"

          HEAD_REF=$(jq -r ".head.ref" "$PR_DATA")

          if [ ${{ steps.fork_status.outputs.fork }} == "false" ]; then
            echo "::debug::Setting up repo using SSH"
            HEAD_REPO=$(jq -r '.head.repo.ssh_url' "$PR_DATA")
          else
            echo "::debug::Setting up repo using HTTPS"
            HEAD_REPO=$(jq -r '.head.repo.clone_url | sub("https://"; "https://x-access-token:${{ secrets.GITHUB_TOKEN }}@")' "$PR_DATA")
          fi

          git clone $HEAD_REPO .
          git checkout -b "$HEAD_REF" "origin/$HEAD_REF"

      - name: 'Install dependencies'
        run: |
          corepack enable yarn
          corepack yarn install
      - name: 'Sync exercises'
        run: corepack yarn sync

      - name: 'Commit changes'
        run: |
          # Check if there is nothing to commit (i.e. no syncing changes made)
          if [ -z "$(git status --porcelain)" ]; then
            echo "Exercises are already synced correctly"
            exit 0
          fi

          # Setup the git user (required to commit anything)
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
          git config --global user.name "github-actions[bot]"

          # Commit the changes made by prettier
          git add .
          git commit -m "[CI] Sync exercises"
          git push

      - name: 'Post acknowledgement that it has synced the code'
        continue-on-error: true # Never fail the build if this fails
        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'The "Sync all exercises" action has finished running.'
            })

      - name: 'Post reminder to trigger build manually'
        continue-on-error: true # Never fail the build if this fails
        if: steps.fork_status.outputs.fork == 'true'
        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'For security reasons, `/sync` does not trigger CI builds when the PR has been submitted from a fork. If checks were not passing due to code format, trigger a build to make the required checks pass, through one of the following ways:\n\n- Push an empty commit to this branch: `git commit --allow-empty -m "Trigger builds"`.\n- Close and reopen the PR.\n- Push a regular commit to this branch.'
            })


================================================
FILE: .github/workflows/ci.js.yml
================================================
# This workflow will do a clean install of node dependencies and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions

name: typescript / main

on:
  push:
    branches: [main]

jobs:
  precheck:
    runs-on: ubuntu-24.04

    steps:
      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871

      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901
        run: corepack enable yarn

      - name: Use Node.js LTS (20.x)
        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6
        with:
          node-version: 20.x
          cache: 'yarn'

      - name: Install project dependencies
        run: corepack yarn install --immutable

      - name: Run exercism/typescript ci precheck (checks config, lint code, and runs tests) for all exercises
        run: corepack yarn ci:check

  ci:
    runs-on: ubuntu-24.04

    strategy:
      matrix:
        node-version: [20.x, 22.x]

    steps:
      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901
        run: corepack enable yarn

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'yarn'

      - name: Install project dependencies
        run: corepack yarn install --immutable

      - name: Run exercism/typescript ci (checks config, lint code, and runs tests) for all exercises
        run: corepack yarn ci

  impersonate:
    # This job tries to run tests for the 'hello-world' exercise, but
    # simulating what would happen if a student runs the tests standalone.
    # We do this by removing all project files in the root.

    runs-on: ubuntu-24.04

    steps:
      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901
        run: corepack enable yarn

      - name: Use Node.js 20.x
        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6
        with:
          node-version: 20.x
          cache: 'yarn'

      - name: Remove root project files
        run: rm -f package.json yarn.lock .yarnrc.yml

      - name: Move solution file so that tests pass
        working-directory: exercises/practice/hello-world
        run: |
          rm -f hello-world.ts
          cp ./.meta/proof.ci.ts hello-world.ts

      - name: Install project dependencies
        working-directory: exercises/practice/hello-world
        run: corepack yarn install --no-immutable

      - name: Run tests
        working-directory: exercises/practice/hello-world
        run: corepack yarn test


================================================
FILE: .github/workflows/codeql.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
name: 'codeql'

on:
  push:
    branches: [main]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [main]
  schedule:
    - cron: '0 14 * * 5'

jobs:
  analyze:
    runs-on: ubuntu-24.04

    strategy:
      fail-fast: false
      matrix:
        # Override automatic language detection by changing the below list
        # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
        language: ['javascript']
        # Learn more...
        # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection

    steps:
      - name: Checkout repository
        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v2.3.4

      # Initializes the CodeQL tools for scanning.
      - name: Initialize CodeQL
        uses: github/codeql-action/init@v3
        with:
          languages: ${{ matrix.language }}
          # If you wish to specify custom queries, you can do so here or in a config file.
          # By default, queries listed here will override any specified in a config file.
          # Prefix the list here with "+" to use these queries and those in the config file.
          # queries: ./path/to/local/query, your-org/your-repo/queries@main

      # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
      # If this step fails, then you should remove it and run the build manually (see below)
      - name: Autobuild
        uses: github/codeql-action/autobuild@v3

      # ℹ️ Command-line programs to run using the OS shell.
      # 📚 https://git.io/JvXDl

      # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
      #    and modify them (or add more) to build your code if your project
      #    uses a compiled language

      #- run: |
      #   make bootstrap
      #   make release

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v3


================================================
FILE: .github/workflows/configlet.yml
================================================
name: Configlet

on:
  pull_request:
  push:
    branches:
      - main
  workflow_dispatch:

permissions:
  contents: read

jobs:
  configlet:
    uses: exercism/github-actions/.github/workflows/configlet.yml@main


================================================
FILE: .github/workflows/no-important-files-changed.yml
================================================
name: No important files changed

on:
  pull_request_target:
    types: [opened]
    branches: [main]
    paths:
      - "exercises/concept/**"
      - "exercises/practice/**"
      - "!exercises/*/*/.approaches/**"
      - "!exercises/*/*/.articles/**"
      - "!exercises/*/*/.docs/**"
      - "!exercises/*/*/.meta/**"

permissions:
  pull-requests: write

jobs:
  check:
    uses: exercism/github-actions/.github/workflows/check-no-important-files-changed.yml@main
    with:
      repository: ${{ github.event.pull_request.head.repo.owner.login }}/${{ github.event.pull_request.head.repo.name }}
      ref: ${{ github.head_ref }}


================================================
FILE: .github/workflows/pause-community-contributions.yml
================================================
name: Pause Community Contributions

on:
  issues:
    types:
      - opened
  pull_request_target:
    types:
      - opened
    paths-ignore:
      - 'exercises/*/*/.approaches/**'
      - 'exercises/*/*/.articles/**'

permissions:
  issues: write
  pull-requests: write

jobs:
  pause:
    if: github.repository_owner == 'exercism' # Stops this job from running on forks
    uses: exercism/github-actions/.github/workflows/community-contributions.yml@main
    with:
      forum_category: typescript
    secrets:
      github_membership_token: ${{ secrets.COMMUNITY_CONTRIBUTIONS_WORKFLOW_TOKEN }}


================================================
FILE: .github/workflows/ping-cross-track-maintainers-team.yml
================================================
name: Ping cross-track maintainers team

on:
  pull_request_target:
    types:
      - opened

permissions:
  pull-requests: write

jobs:
  ping:
    if: github.repository_owner == 'exercism' # Stops this job from running on forks
    uses: exercism/github-actions/.github/workflows/ping-cross-track-maintainers-team.yml@main
    secrets:
      github_membership_token: ${{ secrets.COMMUNITY_CONTRIBUTIONS_WORKFLOW_TOKEN }}


================================================
FILE: .github/workflows/pr.ci.js.yml
================================================
# This workflow will do a clean install of node dependencies and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions

name: typescript / pr

on: pull_request

jobs:
  precheck:
    runs-on: ubuntu-24.04

    steps:
      - name: Checkout PR
        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
        with:
          fetch-depth: ${{ github.event_name == 'pull_request' && 2 || 0 }}

      - name: Get changed files
        id: changed-files
        run: |
          if ${{ github.event_name == 'pull_request' }}; then
              echo "changed_files=$(git diff --name-only --diff-filter=ACM -r HEAD^1 HEAD | xargs)" >> $GITHUB_OUTPUT
          else
              echo "changed_files=$(git diff --name-only --diff-filter=ACM ${{ github.event.before }} ${{ github.event.after }} | xargs)" >> $GITHUB_OUTPUT
          fi

      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901
        run: corepack enable yarn

      - name: Use Node.js LTS (20.x)
        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6
        with:
          node-version: 20.x
          cache: 'yarn'

      - name: Install project dependencies
        run: corepack yarn install --immutable

      - name: Run exercism/typescript ci precheck (stub files, config integrity) for changed exercises
        run: corepack yarn node scripts/pr-check.mjs ${{ steps.changed-files.outputs.changed_files }}

  ci:
    runs-on: ubuntu-24.04

    strategy:
      matrix:
        node-version: [20.x, 22.x]

    steps:
      - name: Checkout PR
        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
        with:
          fetch-depth: ${{ github.event_name == 'pull_request' && 2 || 0 }}

      - name: Get changed files
        id: changed-files
        run: |
          if ${{ github.event_name == 'pull_request' }}; then
              echo "changed_files=$(git diff --name-only --diff-filter=ACM -r HEAD^1 HEAD | xargs)" >> $GITHUB_OUTPUT
          else
              echo "changed_files=$(git diff --name-only --diff-filter=ACM ${{ github.event.before }} ${{ github.event.after }} | xargs)" >> $GITHUB_OUTPUT
          fi

      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901
        run: corepack enable yarn

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'yarn'

      - name: Install project dependencies
        run: corepack yarn install --immutable

      - name: Run exercism/typescript ci (runs tests) for changed/added exercises
        run: corepack yarn node scripts/pr.mjs ${{ steps.changed-files.outputs.changed_files }}

  impersonate:
    # This job tries to run tests for the 'hello-world' exercise, but
    # simulating what would happen if a student runs the tests standalone.
    # We do this by removing all project files in the root.

    runs-on: ubuntu-24.04

    steps:
      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871
      - name: Enable corepack to fix https://github.com/actions/setup-node/pull/901
        run: corepack enable yarn

      - name: Use Node.js 20.x
        uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6
        with:
          node-version: 20.x
          cache: 'yarn'

      - name: Remove root project files
        run: rm -f package.json yarn.lock .yarnrc.yml

      - name: Move solution file so that tests pass
        working-directory: exercises/practice/hello-world
        run: |
          rm -f hello-world.ts
          cp ./.meta/proof.ci.ts hello-world.ts

      - name: Install project dependencies
        working-directory: exercises/practice/hello-world
        run: corepack yarn install --no-immutable

      - name: Run tests
        working-directory: exercises/practice/hello-world
        run: corepack yarn test


================================================
FILE: .github/workflows/run-configlet-sync.yml
================================================
name: Run Configlet Sync

on:
  workflow_dispatch:
  schedule:
    - cron: '0 0 15 * *'

jobs:
  call-gha-workflow:
    uses: exercism/github-actions/.github/workflows/configlet-sync.yml@main


================================================
FILE: .github/workflows/sync-labels.yml
================================================
name: Tools

on:
  push:
    branches:
      - main
    paths:
      - .github/labels.yml
      - .github/workflows/sync-labels.yml
  workflow_dispatch:
  schedule:
    - cron: 0 0 1 * * # First day of each month

permissions:
  issues: write

jobs:
  sync-labels:
    uses: exercism/github-actions/.github/workflows/labels.yml@main


================================================
FILE: .github/workflows/verify-code-formatting.yml
================================================
name: typescript / format

on:
  push:
  pull_request:
  workflow_dispatch:

jobs:
  verify:
    runs-on: ubuntu-24.04
    steps:
      - name: 'Checkout code'
        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871

      - name: 'Verify formatting of all files'
        run: ./bin/check-formatting.sh


================================================
FILE: .gitignore
================================================
*.swp
.DS_Store
.idea
npm-debug.log
build
babel-output
lintreport.json
debug.log

# Binaries downloaded by binary download scripts
bin/configlet
bin/configlet.exe

# Node modules
/exercises/**/node_modules
/common/node_modules
/node_modules

# Yarn files
/exercises/**/.pnp.*
/exercises/**/.yarn/*
!/exercises/**/.yarn/patches
!/exercises/**/.yarn/plugins
!/exercises/**/.yarn/releases
!/exercises/**/.yarn/sdks
!/exercises/**/.yarn/versions

/common/.pnp.*
/common/.yarn/*
!/common/.yarn/patches
!/common/.yarn/plugins
!/common/.yarn/releases
!/common/.yarn/sdks
!/common/.yarn/versions

/.pnp.*
/.yarn/*
!/.yarn/patches
!/.yarn/plugins
!/.yarn/releases
!/.yarn/sdks
!/.yarn/versions

# Maintainer specific generated files
/tmp_exercises
/tmp
exercise-package.json


================================================
FILE: .prettierignore
================================================
/.github/labels.yml
/.github/workflows/sync-labels.yml
/.github/workflows/no-important-files-changed.yml
exercises/**/README.md
!/README.md

.vscode/**/*
.yarn/**/*

# Originates from https://github.com/exercism/org-wide-files
CODE_OF_CONDUCT.md
LICENSE

# These are formatted via configlet and will not match prettier
exercises/**/.meta/config.json
exercises/**/.approaches/config.json
config.json

# Originates from https://github.com/exercism/problem-specifications
exercises/practice/**/.docs/instructions.md
exercises/practice/**/.docs/introduction.md


================================================
FILE: .prettierrc
================================================
{
  "trailingComma": "es5",
  "tabWidth": 2,
  "semi": false,
  "singleQuote": true,
  "arrowParens": "always",
  "printWidth": 80,
  "endOfLine": "lf"
}


================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    "arcanis.vscode-zipfs",
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode"
  ]
}


================================================
FILE: .vscode/settings.json
================================================
{
  "cSpell.words": [
    "exercism"
  ],
  "search.exclude": {
    "**/.yarn": true,
    "**/.pnp.*": true
  },
  "eslint.nodePath": ".yarn/sdks",
  "prettier.prettierPath": ".yarn/sdks/prettier/index.cjs",
  "typescript.tsdk": ".yarn/sdks/typescript/lib",
  "typescript.enablePromptUseWorkspaceTsdk": true
}


================================================
FILE: .yarn/sdks/eslint/bin/eslint.js
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require eslint/bin/eslint.js
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

// Defer to the real eslint/bin/eslint.js your application uses
module.exports = absRequire(`eslint/bin/eslint.js`);


================================================
FILE: .yarn/sdks/eslint/lib/api.js
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require eslint
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

// Defer to the real eslint your application uses
module.exports = absRequire(`eslint`);


================================================
FILE: .yarn/sdks/eslint/lib/unsupported-api.js
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require eslint/use-at-your-own-risk
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

// Defer to the real eslint/use-at-your-own-risk your application uses
module.exports = absRequire(`eslint/use-at-your-own-risk`);


================================================
FILE: .yarn/sdks/eslint/package.json
================================================
{
  "name": "eslint",
  "version": "9.8.0-sdk",
  "main": "./lib/api.js",
  "type": "commonjs",
  "bin": {
    "eslint": "./bin/eslint.js"
  },
  "exports": {
    "./package.json": "./package.json",
    ".": "./lib/api.js",
    "./use-at-your-own-risk": "./lib/unsupported-api.js"
  }
}


================================================
FILE: .yarn/sdks/integrations.yml
================================================
# This file is automatically generated by @yarnpkg/sdks.
# Manual changes might be lost!

integrations:
  - vscode


================================================
FILE: .yarn/sdks/prettier/bin/prettier.cjs
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require prettier/bin/prettier.cjs
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

// Defer to the real prettier/bin/prettier.cjs your application uses
module.exports = absRequire(`prettier/bin/prettier.cjs`);


================================================
FILE: .yarn/sdks/prettier/index.cjs
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require prettier
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

// Defer to the real prettier your application uses
module.exports = absRequire(`prettier`);


================================================
FILE: .yarn/sdks/prettier/package.json
================================================
{
  "name": "prettier",
  "version": "3.3.3-sdk",
  "main": "./index.cjs",
  "type": "commonjs",
  "bin": "./bin/prettier.cjs"
}


================================================
FILE: .yarn/sdks/typescript/bin/tsc
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require typescript/bin/tsc
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

// Defer to the real typescript/bin/tsc your application uses
module.exports = absRequire(`typescript/bin/tsc`);


================================================
FILE: .yarn/sdks/typescript/bin/tsserver
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require typescript/bin/tsserver
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

// Defer to the real typescript/bin/tsserver your application uses
module.exports = absRequire(`typescript/bin/tsserver`);


================================================
FILE: .yarn/sdks/typescript/lib/tsc.js
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require typescript/lib/tsc.js
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

// Defer to the real typescript/lib/tsc.js your application uses
module.exports = absRequire(`typescript/lib/tsc.js`);


================================================
FILE: .yarn/sdks/typescript/lib/tsserver.js
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require typescript/lib/tsserver.js
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

const moduleWrapper = tsserver => {
  if (!process.versions.pnp) {
    return tsserver;
  }

  const {isAbsolute} = require(`path`);
  const pnpApi = require(`pnpapi`);

  const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//);
  const isPortal = str => str.startsWith("portal:/");
  const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`);

  const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => {
    return `${locator.name}@${locator.reference}`;
  }));

  // VSCode sends the zip paths to TS using the "zip://" prefix, that TS
  // doesn't understand. This layer makes sure to remove the protocol
  // before forwarding it to TS, and to add it back on all returned paths.

  function toEditorPath(str) {
    // We add the `zip:` prefix to both `.zip/` paths and virtual paths
    if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) {
      // We also take the opportunity to turn virtual paths into physical ones;
      // this makes it much easier to work with workspaces that list peer
      // dependencies, since otherwise Ctrl+Click would bring us to the virtual
      // file instances instead of the real ones.
      //
      // We only do this to modules owned by the the dependency tree roots.
      // This avoids breaking the resolution when jumping inside a vendor
      // with peer dep (otherwise jumping into react-dom would show resolution
      // errors on react).
      //
      const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str;
      if (resolved) {
        const locator = pnpApi.findPackageLocator(resolved);
        if (locator && (dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) || isPortal(locator.reference))) {
          str = resolved;
        }
      }

      str = normalize(str);

      if (str.match(/\.zip\//)) {
        switch (hostInfo) {
          // Absolute VSCode `Uri.fsPath`s need to start with a slash.
          // VSCode only adds it automatically for supported schemes,
          // so we have to do it manually for the `zip` scheme.
          // The path needs to start with a caret otherwise VSCode doesn't handle the protocol
          //
          // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910
          //
          // 2021-10-08: VSCode changed the format in 1.61.
          // Before | ^zip:/c:/foo/bar.zip/package.json
          // After  | ^/zip//c:/foo/bar.zip/package.json
          //
          // 2022-04-06: VSCode changed the format in 1.66.
          // Before | ^/zip//c:/foo/bar.zip/package.json
          // After  | ^/zip/c:/foo/bar.zip/package.json
          //
          // 2022-05-06: VSCode changed the format in 1.68
          // Before | ^/zip/c:/foo/bar.zip/package.json
          // After  | ^/zip//c:/foo/bar.zip/package.json
          //
          case `vscode <1.61`: {
            str = `^zip:${str}`;
          } break;

          case `vscode <1.66`: {
            str = `^/zip/${str}`;
          } break;

          case `vscode <1.68`: {
            str = `^/zip${str}`;
          } break;

          case `vscode`: {
            str = `^/zip/${str}`;
          } break;

          // To make "go to definition" work,
          // We have to resolve the actual file system path from virtual path
          // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip)
          case `coc-nvim`: {
            str = normalize(resolved).replace(/\.zip\//, `.zip::`);
            str = resolve(`zipfile:${str}`);
          } break;

          // Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server)
          // We have to resolve the actual file system path from virtual path,
          // everything else is up to neovim
          case `neovim`: {
            str = normalize(resolved).replace(/\.zip\//, `.zip::`);
            str = `zipfile://${str}`;
          } break;

          default: {
            str = `zip:${str}`;
          } break;
        }
      } else {
        str = str.replace(/^\/?/, process.platform === `win32` ? `` : `/`);
      }
    }

    return str;
  }

  function fromEditorPath(str) {
    switch (hostInfo) {
      case `coc-nvim`: {
        str = str.replace(/\.zip::/, `.zip/`);
        // The path for coc-nvim is in format of /<pwd>/zipfile:/<pwd>/.yarn/...
        // So in order to convert it back, we use .* to match all the thing
        // before `zipfile:`
        return process.platform === `win32`
          ? str.replace(/^.*zipfile:\//, ``)
          : str.replace(/^.*zipfile:/, ``);
      } break;

      case `neovim`: {
        str = str.replace(/\.zip::/, `.zip/`);
        // The path for neovim is in format of zipfile:///<pwd>/.yarn/...
        return str.replace(/^zipfile:\/\//, ``);
      } break;

      case `vscode`:
      default: {
        return str.replace(/^\^?(zip:|\/zip(\/ts-nul-authority)?)\/+/, process.platform === `win32` ? `` : `/`)
      } break;
    }
  }

  // Force enable 'allowLocalPluginLoads'
  // TypeScript tries to resolve plugins using a path relative to itself
  // which doesn't work when using the global cache
  // https://github.com/microsoft/TypeScript/blob/1b57a0395e0bff191581c9606aab92832001de62/src/server/project.ts#L2238
  // VSCode doesn't want to enable 'allowLocalPluginLoads' due to security concerns but
  // TypeScript already does local loads and if this code is running the user trusts the workspace
  // https://github.com/microsoft/vscode/issues/45856
  const ConfiguredProject = tsserver.server.ConfiguredProject;
  const {enablePluginsWithOptions: originalEnablePluginsWithOptions} = ConfiguredProject.prototype;
  ConfiguredProject.prototype.enablePluginsWithOptions = function() {
    this.projectService.allowLocalPluginLoads = true;
    return originalEnablePluginsWithOptions.apply(this, arguments);
  };

  // And here is the point where we hijack the VSCode <-> TS communications
  // by adding ourselves in the middle. We locate everything that looks
  // like an absolute path of ours and normalize it.

  const Session = tsserver.server.Session;
  const {onMessage: originalOnMessage, send: originalSend} = Session.prototype;
  let hostInfo = `unknown`;

  Object.assign(Session.prototype, {
    onMessage(/** @type {string | object} */ message) {
      const isStringMessage = typeof message === 'string';
      const parsedMessage = isStringMessage ? JSON.parse(message) : message;

      if (
        parsedMessage != null &&
        typeof parsedMessage === `object` &&
        parsedMessage.arguments &&
        typeof parsedMessage.arguments.hostInfo === `string`
      ) {
        hostInfo = parsedMessage.arguments.hostInfo;
        if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) {
          const [, major, minor] = (process.env.VSCODE_IPC_HOOK.match(
            // The RegExp from https://semver.org/ but without the caret at the start
            /(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
          ) ?? []).map(Number)

          if (major === 1) {
            if (minor < 61) {
              hostInfo += ` <1.61`;
            } else if (minor < 66) {
              hostInfo += ` <1.66`;
            } else if (minor < 68) {
              hostInfo += ` <1.68`;
            }
          }
        }
      }

      const processedMessageJSON = JSON.stringify(parsedMessage, (key, value) => {
        return typeof value === 'string' ? fromEditorPath(value) : value;
      });

      return originalOnMessage.call(
        this,
        isStringMessage ? processedMessageJSON : JSON.parse(processedMessageJSON)
      );
    },

    send(/** @type {any} */ msg) {
      return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => {
        return typeof value === `string` ? toEditorPath(value) : value;
      })));
    }
  });

  return tsserver;
};

const [major, minor] = absRequire(`typescript/package.json`).version.split(`.`, 2).map(value => parseInt(value, 10));
// In TypeScript@>=5.5 the tsserver uses the public TypeScript API so that needs to be patched as well.
// Ref https://github.com/microsoft/TypeScript/pull/55326
if (major > 5 || (major === 5 && minor >= 5)) {
  moduleWrapper(absRequire(`typescript`));
}

// Defer to the real typescript/lib/tsserver.js your application uses
module.exports = moduleWrapper(absRequire(`typescript/lib/tsserver.js`));


================================================
FILE: .yarn/sdks/typescript/lib/tsserverlibrary.js
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require typescript/lib/tsserverlibrary.js
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

const moduleWrapper = tsserver => {
  if (!process.versions.pnp) {
    return tsserver;
  }

  const {isAbsolute} = require(`path`);
  const pnpApi = require(`pnpapi`);

  const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//);
  const isPortal = str => str.startsWith("portal:/");
  const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`);

  const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => {
    return `${locator.name}@${locator.reference}`;
  }));

  // VSCode sends the zip paths to TS using the "zip://" prefix, that TS
  // doesn't understand. This layer makes sure to remove the protocol
  // before forwarding it to TS, and to add it back on all returned paths.

  function toEditorPath(str) {
    // We add the `zip:` prefix to both `.zip/` paths and virtual paths
    if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) {
      // We also take the opportunity to turn virtual paths into physical ones;
      // this makes it much easier to work with workspaces that list peer
      // dependencies, since otherwise Ctrl+Click would bring us to the virtual
      // file instances instead of the real ones.
      //
      // We only do this to modules owned by the the dependency tree roots.
      // This avoids breaking the resolution when jumping inside a vendor
      // with peer dep (otherwise jumping into react-dom would show resolution
      // errors on react).
      //
      const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str;
      if (resolved) {
        const locator = pnpApi.findPackageLocator(resolved);
        if (locator && (dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) || isPortal(locator.reference))) {
          str = resolved;
        }
      }

      str = normalize(str);

      if (str.match(/\.zip\//)) {
        switch (hostInfo) {
          // Absolute VSCode `Uri.fsPath`s need to start with a slash.
          // VSCode only adds it automatically for supported schemes,
          // so we have to do it manually for the `zip` scheme.
          // The path needs to start with a caret otherwise VSCode doesn't handle the protocol
          //
          // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910
          //
          // 2021-10-08: VSCode changed the format in 1.61.
          // Before | ^zip:/c:/foo/bar.zip/package.json
          // After  | ^/zip//c:/foo/bar.zip/package.json
          //
          // 2022-04-06: VSCode changed the format in 1.66.
          // Before | ^/zip//c:/foo/bar.zip/package.json
          // After  | ^/zip/c:/foo/bar.zip/package.json
          //
          // 2022-05-06: VSCode changed the format in 1.68
          // Before | ^/zip/c:/foo/bar.zip/package.json
          // After  | ^/zip//c:/foo/bar.zip/package.json
          //
          case `vscode <1.61`: {
            str = `^zip:${str}`;
          } break;

          case `vscode <1.66`: {
            str = `^/zip/${str}`;
          } break;

          case `vscode <1.68`: {
            str = `^/zip${str}`;
          } break;

          case `vscode`: {
            str = `^/zip/${str}`;
          } break;

          // To make "go to definition" work,
          // We have to resolve the actual file system path from virtual path
          // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip)
          case `coc-nvim`: {
            str = normalize(resolved).replace(/\.zip\//, `.zip::`);
            str = resolve(`zipfile:${str}`);
          } break;

          // Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server)
          // We have to resolve the actual file system path from virtual path,
          // everything else is up to neovim
          case `neovim`: {
            str = normalize(resolved).replace(/\.zip\//, `.zip::`);
            str = `zipfile://${str}`;
          } break;

          default: {
            str = `zip:${str}`;
          } break;
        }
      } else {
        str = str.replace(/^\/?/, process.platform === `win32` ? `` : `/`);
      }
    }

    return str;
  }

  function fromEditorPath(str) {
    switch (hostInfo) {
      case `coc-nvim`: {
        str = str.replace(/\.zip::/, `.zip/`);
        // The path for coc-nvim is in format of /<pwd>/zipfile:/<pwd>/.yarn/...
        // So in order to convert it back, we use .* to match all the thing
        // before `zipfile:`
        return process.platform === `win32`
          ? str.replace(/^.*zipfile:\//, ``)
          : str.replace(/^.*zipfile:/, ``);
      } break;

      case `neovim`: {
        str = str.replace(/\.zip::/, `.zip/`);
        // The path for neovim is in format of zipfile:///<pwd>/.yarn/...
        return str.replace(/^zipfile:\/\//, ``);
      } break;

      case `vscode`:
      default: {
        return str.replace(/^\^?(zip:|\/zip(\/ts-nul-authority)?)\/+/, process.platform === `win32` ? `` : `/`)
      } break;
    }
  }

  // Force enable 'allowLocalPluginLoads'
  // TypeScript tries to resolve plugins using a path relative to itself
  // which doesn't work when using the global cache
  // https://github.com/microsoft/TypeScript/blob/1b57a0395e0bff191581c9606aab92832001de62/src/server/project.ts#L2238
  // VSCode doesn't want to enable 'allowLocalPluginLoads' due to security concerns but
  // TypeScript already does local loads and if this code is running the user trusts the workspace
  // https://github.com/microsoft/vscode/issues/45856
  const ConfiguredProject = tsserver.server.ConfiguredProject;
  const {enablePluginsWithOptions: originalEnablePluginsWithOptions} = ConfiguredProject.prototype;
  ConfiguredProject.prototype.enablePluginsWithOptions = function() {
    this.projectService.allowLocalPluginLoads = true;
    return originalEnablePluginsWithOptions.apply(this, arguments);
  };

  // And here is the point where we hijack the VSCode <-> TS communications
  // by adding ourselves in the middle. We locate everything that looks
  // like an absolute path of ours and normalize it.

  const Session = tsserver.server.Session;
  const {onMessage: originalOnMessage, send: originalSend} = Session.prototype;
  let hostInfo = `unknown`;

  Object.assign(Session.prototype, {
    onMessage(/** @type {string | object} */ message) {
      const isStringMessage = typeof message === 'string';
      const parsedMessage = isStringMessage ? JSON.parse(message) : message;

      if (
        parsedMessage != null &&
        typeof parsedMessage === `object` &&
        parsedMessage.arguments &&
        typeof parsedMessage.arguments.hostInfo === `string`
      ) {
        hostInfo = parsedMessage.arguments.hostInfo;
        if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) {
          const [, major, minor] = (process.env.VSCODE_IPC_HOOK.match(
            // The RegExp from https://semver.org/ but without the caret at the start
            /(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
          ) ?? []).map(Number)

          if (major === 1) {
            if (minor < 61) {
              hostInfo += ` <1.61`;
            } else if (minor < 66) {
              hostInfo += ` <1.66`;
            } else if (minor < 68) {
              hostInfo += ` <1.68`;
            }
          }
        }
      }

      const processedMessageJSON = JSON.stringify(parsedMessage, (key, value) => {
        return typeof value === 'string' ? fromEditorPath(value) : value;
      });

      return originalOnMessage.call(
        this,
        isStringMessage ? processedMessageJSON : JSON.parse(processedMessageJSON)
      );
    },

    send(/** @type {any} */ msg) {
      return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => {
        return typeof value === `string` ? toEditorPath(value) : value;
      })));
    }
  });

  return tsserver;
};

const [major, minor] = absRequire(`typescript/package.json`).version.split(`.`, 2).map(value => parseInt(value, 10));
// In TypeScript@>=5.5 the tsserver uses the public TypeScript API so that needs to be patched as well.
// Ref https://github.com/microsoft/TypeScript/pull/55326
if (major > 5 || (major === 5 && minor >= 5)) {
  moduleWrapper(absRequire(`typescript`));
}

// Defer to the real typescript/lib/tsserverlibrary.js your application uses
module.exports = moduleWrapper(absRequire(`typescript/lib/tsserverlibrary.js`));


================================================
FILE: .yarn/sdks/typescript/lib/typescript.js
================================================
#!/usr/bin/env node

const {existsSync} = require(`fs`);
const {createRequire, register} = require(`module`);
const {resolve} = require(`path`);
const {pathToFileURL} = require(`url`);

const relPnpApiPath = "../../../../.pnp.cjs";

const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = createRequire(absPnpApiPath);

const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`);
const isPnpLoaderEnabled = existsSync(absPnpLoaderPath);

if (existsSync(absPnpApiPath)) {
  if (!process.versions.pnp) {
    // Setup the environment to be able to require typescript
    require(absPnpApiPath).setup();
    if (isPnpLoaderEnabled && register) {
      register(pathToFileURL(absPnpLoaderPath));
    }
  }
}

// Defer to the real typescript your application uses
module.exports = absRequire(`typescript`);


================================================
FILE: .yarn/sdks/typescript/package.json
================================================
{
  "name": "typescript",
  "version": "5.5.4-sdk",
  "main": "./lib/typescript.js",
  "type": "commonjs",
  "bin": {
    "tsc": "./bin/tsc",
    "tsserver": "./bin/tsserver"
  }
}


================================================
FILE: .yarnrc.yml
================================================
compressionLevel: mixed

enableGlobalCache: true


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct

## Introduction

Exercism is a platform centered around empathetic conversation.
We have a low tolerance for communication that makes anyone feel unwelcome, unsupported, insulted or discriminated against.

## Seen or experienced something uncomfortable?

If you see or experience abuse, harassment, discrimination, or feel unsafe or upset, please email [abuse@exercism.org](mailto:abuse@exercism.org?subject=%5BCoC%5D) and include \[CoC\] in the subject line.
We will follow up with you as a priority.

## Enforcement

We actively monitor for Code of Conduct (CoC) violations and take any reports of violations extremely seriously.
We have banned contributors, mentors and users due to violations.

After we receive a report of a CoC violation, we view that person's conversation history on Exercism and related communication channels and attempt to understand whether someone has deliberately broken the CoC, or accidentally crossed a line.
We generally reach out to the person who has been reported to discuss any concerns we have and warn them that repeated violations will result in a ban.
Sometimes we decide that no violation has occurred and that no action is required and sometimes we will also ban people on a first offense.
We strive to be fair, but will err on the side of protecting the culture of our community.

Exercism's leadership reserve the right to take whatever action they feel appropriate with regards to CoC violations.

## The simple version

- Be empathetic
- Be welcoming
- Be kind
- Be honest
- Be supportive
- Be polite

## The details

Exercism should be a safe place for everybody regardless of

- Gender, gender identity or gender expression
- Sexual orientation
- Disability
- Physical appearance (including but not limited to body size)
- Race
- Age
- Religion
- Anything else you can think of

As someone who is part of this community, you agree that:

- We are collectively and individually committed to safety and inclusivity
- We have zero tolerance for abuse, harassment, or discrimination
- We respect people’s boundaries and identities
- We refrain from using language that can be considered offensive or oppressive (systemically or otherwise), eg. sexist, racist, homophobic, transphobic, ableist, classist, etc.
  - this includes (but is not limited to) various slurs.
- We avoid using offensive topics as a form of humor

We actively work towards:

- Being a safe community
- Cultivating a network of support & encouragement for each other
- Encouraging responsible and varied forms of expression

We condemn:

- Stalking, doxxing, or publishing private information
- Violence, threats of violence or violent language
- Anything that compromises people’s safety
- Conduct or speech which might be considered sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory or offensive in nature
- The use of unwelcome, suggestive, derogatory or inappropriate nicknames or terms
- Disrespect towards others (jokes, innuendo, dismissive attitudes) and towards differences of opinion
- Intimidation or harassment (online or in-person).
  Please read the [Citizen Code of Conduct](https://github.com/stumpsyn/policies/blob/master/citizen_code_of_conduct.md) for how we interpret harassment
- Inappropriate attention or contact
- Not understanding the differences between constructive criticism and disparagement

These things are NOT OK.

Be aware of how your actions affect others.
If it makes someone uncomfortable, stop.

If you say something that is found offensive, and you are called out on it, try to:

- Listen without interruption
- Believe what the person is saying & do not attempt to disqualify what they have to say
- Ask for tips / help with avoiding making the offense in the future
- Apologize and ask forgiveness

## History

This policy was initially adopted from the Front-end London Slack community and has been modified since.
A version history can be seen on [GitHub](https://github.com/exercism/website-copy/edit/main/pages/code_of_conduct.md).

_This policy is a "living" document, and subject to refinement and expansion in the future.
This policy applies to the Exercism website, the Exercism GitHub organization, any other Exercism-related communication channels (e.g. Discord, Forum, Twitter, email) and any other Exercism entity or event._


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

This is the TypeScript track, one of the many tracks on [exercism][web-exercism]. It holds all the _exercises_ that are currently implemented and available for students to complete.
The track consists of various **core** exercises, the ones a student _must_ complete, and each **core** exercise may unlock various _side_ exercises.
You can find this in the [`config.json`][file-config].
It's not uncommon that people discover incorrect implementations of certain tests, have a suggestion for a track specific hint to aid the student on the _JavaScript specifics_, see optimisations in terms of the configurations of `jest`, `eslint` or other dependencies, report missing edge cases, factual errors, logical errors, and, implement exercises or develop new exercises.

> [!IMPORTANT]
> When contributing, please open your PR from a branch so our automated tooling can run.

We welcome contributions of all sorts and sizes, from reporting issues to submitting patches, as well as joining the current [discussions 💬][issue-discussion].

---

## Table of Contents

- [Contributing](#contributing)
  - [Table of Contents](#table-of-contents)
  - [Code of Conduct](#code-of-conduct)
  - [Exercises](#exercises)
    - [New exercise](#new-exercise)
      - [Implementing existing exercise](#implementing-existing-exercise)
      - [Creating a track-specific exercise](#creating-a-track-specific-exercise)
    - [Existing exercises](#existing-exercises)
      - [Improving the README.md](#improving-the-readmemd)
      - [Syncing the exercise](#syncing-the-exercise)
      - [Improving or adding mentor notes](#improving-or-adding-mentor-notes)
      - [Improving or adding automated test analyzers](#improving-or-adding-automated-test-analyzers)
  - [Documentation](#documentation)
  - [Tools](#tools)
    - [Fetch configlet](#fetch-configlet)
    - [Scripts](#scripts)
      - [`format`](#format)
      - [`lint`](#lint)
      - [`test`](#test)
      - [`sync`](#sync)
      - [`checksum`](#checksum)
      - [`ci-check`](#ci-check)
      - [`ci`](#ci)
      - [`name-check`](#name-check)
      - [`name-uniq`](#name-uniq)

---

This guide covers several common scenarios pertaining to **improving the TypeScript track**.
There are several other guides about contributing to other parts of the Exercism ecosystem, that are similar to this repository.

- [Generic information about track-contributing][contributing-generic]
- [The JavaScript track][contributing-javascript]
- [The JavaScript Analyzer][contributing-javascript-analyzer]
- [The JavaScript Test Runner][contributing-javascript-test-runner]
- [The TypeScript Analyzer][contributing-typescript-analyzer]
- [The TypeScript Test Runner][contributing-typescript-test-runner]

## Code of Conduct

Help us keep Exercism welcoming. Please read and abide by the [Code of Conduct][coc].

## Exercises

Before contributing code to any existing exercise or any new exercise, please have a thorough look at the current exercises and dive into [open issues][issue-open].

### New exercise

There are two ways to implement new exercises (exercises that don't exist in this track).

1. Pick one from [the list of exercises][list-of-exercises] (implemented in other tracks).
2. Create a new, track-specific exercise from scratch.

#### Implementing existing exercise

Let's say you want to implement a new exercise, from the list of (practice) exercises, because you've noticed that this track could benefit from this exercise, really liked it in another track, or just because you find this interesting; the first step is to [check for an open issue][issue-new-exercise].
If it's there, make sure no one is working on it, and most of all that there is not an open Pull Request towards this exercise.

If there is no such issue, you may open one. The baseline of work is as follows:

1. Open a new issue, we'll label it with `new exercise ✨`
1. We'll assign the issue to you, so you get to work on this exercise
1. Create a new folder in `/exercises`
1. You'll need to sync this folder with the matching config files.
   You can use `sync` to do this: `ASSIGNMENT=practice/slug corepack yarn sync`.
1. Create a `<slug>.ts` stub file.
1. Create a `<slug>.test.ts` test file.
   Here add the tests, per canonical data if possible (more on canonical data below).
1. Create a `.meta/proof.ci.ts` file.
   Place a working implementation, assuming it's renamed to `<slug>.ts`
1. Create `.meta/tests.toml`.
   If the exercise that is being implemented has test data in the [problem specifications repository][problem-specifications], the contents of this file **must** be a list of UUIDs of the tests that are implemented or not implemented.
   Scroll down to [tools](#tools) to find the configlet application which aids generating this file _interactively_.
1. Create a `.meta/config.json`.
   Copy the structure from any other `.meta/config.json`. Fill the `blurb`, `source` and `source_url` according to the `metadata.yml` in the [problem specifications repository][problem-specifications].
   Add yourself as author.
1. Create a `.docs/instructions.md` file.
   Copy the instructions from the [problem specifications repository][problem-specifications]
1. Run the tests locally, using `scripts/test`: `ASSIGNMENT=practice/slug corepack yarn test`.
1. Run the linter locally, using `scripts/lint`: `ASSIGNMENT=practice/slug corepack yarn lint`.
1. Create an entry in `config.json`: a unique _new_ UUID (you can use the `configlet uuid` tool to generate one, scroll down to [tools](#tools) to see how you can get it), give it a difficulty (should be similar to similar exercises), and make sure the _order_ of the file is sane.
   Currently the file is ordered first on core - non core, then on difficulty low to high, and finally lexographically.
1. Format the files, using `scripts/format`: `corepack yarn format`.

The final step is opening a Pull Request, with these items all checked off.
Make sure the tests run and the linter is happy.
It will run automatically on your PR.

#### Creating a track-specific exercise

The steps for a track-specific exercise are similar to those of implementing an established, existing exercise. The differences are:

- You'll have to write a README.md and test-suite from scratch
- You'll have to come up with a unique _slug_.
- We need to require an icon for it.
- Generate a UUID, for example using [configlet][configlet].

Open a new issue with your proposal, and we'll make sure all these steps are correctly taken.
Don't worry! You're not alone in this.

### Existing exercises

There are always improvements possible on existing exercises.

#### Improving the README.md

`README.md`: the description that shows up on the student's exercise page, when they are ready to start.
It's also downloaded as part of the exercise's data.
he `README.md`, together with the `<slug>.test.ts` file form the contract for the implementation of the exercise.
No test should _force_ a specific implementation, no `README.md` explanation should _give away_ a certain implementation.
The `README.md` files are [generated][doc-readme], which is explains [here][doc-readme].

- This file may need to be _regenerated_ in order to sync with the latest canonical data.
- You may contribute track specific `hints.md`, as listed in that [document][doc-readme]
- You may improve the track specific `exercise-readme-insert.md`, and regenerate all the READMEs.

> **Note**: In v3, this will no longer be exactly the same. We'll update this section of the guide when V3 is live.

#### Syncing the exercise

Syncing an exercise with _canonical data_: There is a [problem-specifications][problem-specifications] repository that holds test data in a standardised format.
These tests are occasionally fixed, improved, added, removed or otherwise changed.
Syncing an exercise consists of:

- updating `tests.toml`;
- updating the `<slug>.test.ts` file;
- updating the `.meta/tests.toml` file, if the exercise that is being updated has test data in the [problem specifications repository][problem-specifications].
  The contents of this file can be updated using configlet, interactively;
- match the `proof.ci.ts` file to still work with the new tests; and
- regenerate the [`README.md`][doc-readme], should there be any changes.

#### Improving or adding mentor notes

[Mentor notes][mentor-notes] are the notes that are given to the mentors to guide them with mentoring.
These notes _do not live in this repository_, but instead in the `website-copy` repository.
Find their [contributing guidelines][contributing-website-copy] [here][contributing-website-copy].

#### Improving or adding automated test analyzers

Some exercises already have automated mentoring support.
These automations don't live in this repository, but instead in the `typescript-analyzer` repository.
Find their [contributing guidelines][contributing-typescript-analyzer] [here][contributing-typescript-analyzer].

## Documentation

There is quite a bit of student-facing documentation, which can be found in the [`docs`][file-docs] folder.
You may improve these files by making the required changes and opening a new Pull Request.

## Tools

You'll need LTS or higher NodeJS in order to contribute to the _code_ in this respository. Run `yarn` in the root in order to be able to run the scripts as listed below.
We use the following dependencies:

- `shelljs` in order to provide shell interface to scripts
- `eslint` for linting all code in the stub, test file and example file
- `jest` to run all the test files on all example implementations
- `babel` to transpile everything so it works _regardless of your version of NodeJS_.

We also use `prettier` to format the files. When possible, use `corepack yarn format` to run prettier.
If you want to auto-format using your editor, match the version in the GitHub Workflow `verify-code-formatting.yml`.

### Fetch configlet

If you'd like to download [configlet][configlet], you can use the [`fetch-configlet`][bin-fetch-configlet] binary.
It will run on Linux, Mac OSX and Windows, and download `configlet` to your local drive.
Find more information about [configlet][configlet] [here][configlet].

> If a track implements an exercise for which test data exists, the exercise _must_ contain a `.meta/tests.toml` file.
> The goal of the `tests.toml` file is to keep track of which tests are implemented by the exercise.
> Tests in this file are identified by their UUID and each test has a boolean value that indicates if it is implemented by that exercise.

A `tests.toml` file for a track's `two-fer` exercise looks like this:

```toml
[canonical-tests]

[19709124-b82e-4e86-a722-9e5c5ebf3952]
description = "no name given"
include = true

[3451eebd-123f-4256-b667-7b109affce32]
description = "a name given"
include = true

[653611c6-be9f-4935-ab42-978e25fe9a10]
description = "another name given"
include = false
```

To make it easy to keep the `tests.toml` files up to date, contributors can use the `configlet` application's `sync` command.
This command will compare the tests specified in the `tests.toml` files against the tests that are defined in the exercise's canonical data.
It then interactively gives the maintainer the option to include or exclude test cases that are currently missing, updating the `tests.toml` file accordingly.

### Scripts

We have various `scripts` for you in order to aid with maintaining and contributing to this repository.

#### `format`

> This has been aliased as a top-level package.json `scripts` script:
>
> ```shell
> corepack yarn format
> ```

```typescript
/*
 * Run this script (from root directory):
 *
 * $ corepack yarn format
 *
 * This runs `prettier` on all applicable files, FORCES using the same version
 * as the CI uses to check if the files have been formatted.
 */
```

Use this action to format all the files using the correct version of prettier.
If you want your editor to do this automatically, make sure you install `corepack yarn install`.

#### `lint`

> This has been aliased as a top-level package.json `scripts` script:
>
> ```shell
> corepack yarn lint
> ```

```typescript
/*
 * Run this script (from root directory):
 *
 * $ corepack yarn lint
 *
 * This runs `eslint` on all sample solutions (and test) files
 */
```

If the `ASSIGNMENT` environment variable is set, only _that_ exercise is tested.
For example, if you only want to lint `two-fer`, you may, depending on your environment use:

```shell
ASSIGNMENT=practice/two-fer corepack yarn lint
```

#### `test`

> This has been aliased as a top-level package.json `scripts` script:
>
> ```shell
> corepack yarn test
> ```

```typescript
/**
 * Run this script (from root directory):
 *
 * $ corepack yarn test
 *
 * This runs `jest` tests for all sample solutions
 */
```

If the `ASSIGNMENT` environment variable is set, only _that_ exercise is tested.
For example, if you only want to test the `example.js` for `two-fer`, you may, depending on your environment, use:

```shell
ASSIGNMENT=practice/two-fer corepack yarn test
```

#### `sync`

> This has been aliased as a top-level package.json `scripts` script:
>
> ```shell
> corepack yarn sync
> ```

```typescript
/**
 * Run this script (from root directory):
 *
 * $ corepack yarn sync
 *
 * This script is used to propagate any change to root package.json to
 * all exercises and keep them in sync.
 * There is a CI step which checks that package.json in root & exercises match
 * (see checksum script for more info).
 */
```

If the `ASSIGNMENT` environment variable is set, only _that_ exercise is tested.
For example, if you only want to sync the files for `two-fer`, you may, depending on your environment, use:

```shell
ASSIGNMENT=practice/two-fer corepack yarn sync
```

#### `checksum`

```typescript
/*
 * Run this script (from root directory):
 *
 * $ corepack yarn node scripts/checksum.mjs
 *
 * This will check root `package.json` matches each exercise's `package.json`.
 * But the catch is there are some dependencies used for build but not served to end users
 * We skip those dependencies while performing checksum.
 * See `SKIP_PACKAGES_FOR_CHECKSUM` in helpers.js for list of skipped packages.
 */
```

#### `ci-check`

> This has been aliased as a top-level package.json `scripts` script:
>
> ```shell
> corepack yarn ci:check
> ```

```typescript
/**
 * Run this script (from root directory):
 *
 * $ corepack yarn ci:check
 *
 * This will run following checks:
 *
 * 1. Check config in all exercises matches
 * 2. Checks stubs exist
 * 3. Run eslint to check code-style
 */
```

Run this script to check stubs, configuration integrity and lint the code.

#### `ci`

> This has been aliased as a top-level package.json `scripts` script:
>
> ```shell
> corepack yarn ci
> ```

This script is _almost_ the same as `test`. You may use them interchangeably at moment of writing

```typescript
/**
 * Run this script (from root directory):
 *
 * $ corepack yarn ci
 *
 * This will run following checks:
 *
 * 1. Find the exercises
 * 2. Run tests against sample solutions
 */
```

Run this script to test all exercises.

#### `name-check`

```typescript
/**
 * Run this script (from root directory):
 *
 * $ corepack yarn node scripts/name-check.mjs
 *
 * This will run following checks:
 *
 * 1. Package name is of the format "@exercism/typescript-<exercise>"
 *
 * This script also allows fixing these names:
 *
 * $ corepack yarn node scripts/name-check.mjs --fix
 */
```

Run this script to check if package name in package.json of exercises is in expected format.
Run this script with the `--fix` flag to automatically fix the names.

#### `name-uniq`

```typescript
/**
 * Run this script (from root directory):
 *
 * $ corepack yarn node scripts/name-uniq.mjs
 *
 * This will run following checks:
 *
 * 1. All exercises have unique package names in their package.json files.
 */
```

Run this script to check if there is any duplicate package name.

[configlet]: https://github.com/exercism/docs/blob/master/language-tracks/configuration/configlet.md
[bin-fetch-configlet]: https://github.com/exercism/javascript/blob/master/bin/fetch-configlet
[web-exercism]: https://exercism.org
[file-config]: https://github.com/exercism/javascript/blob/master/config.json
[file-docs]: https://github.com/exercism/javascript/blob/master/docs
[issue-open]: https://github.com/exercism/javascript/issues
[issue-discussion]: https://github.com/exercism/javascript/labels/discussion%20%3Aspeech_balloon%3A
[issue-new-exercise]: https://github.com/exercism/javascript/issues?q=is%3Aopen+is%3Aissue+label%3A%22%3Asparkles%3A+new+exercise%22
[list-of-exercises]: https://tracks.exercism.org/typescript/master/unimplemented
[contributing-generic]: https://github.com/exercism/docs/tree/master/contributing-to-language-tracks
[contributing-javascript]: https://github.com/exercism/javascript/blob/master/CONTRIBUTING.md
[contributing-javascript-analyzer]: https://github.com/exercism/javascript-analyzer/blob/master/CONTRIBUTING.md
[contributing-javascript-test-runner]: https://github.com/exercism/javascript-test-runner
[contributing-typescript]: https://github.com/exercism/typescript/blob/master/CONTRIBUTING.md
[contributing-typescript-analyzer]: https://github.com/exercism/typescript-analyzer/blob/master/CONTRIBUTING.md
[contributing-typescript-test-runner]: https://github.com/exercism/typescript-test-runner
[contributing-website-copy]: https://github.com/exercism/website-copy#contributing
[doc-readme]: https://github.com/exercism/docs/blob/master/language-tracks/exercises/anatomy/readmes.md
[problem-specifications]: https://github.com/exercism/problem-specifications
[coc]: https://exercism.org/code-of-conduct
[mentor-notes]: https://github.com/exercism/website-copy/tree/master/tracks/javascript/exercises


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2021 Exercism

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# Exercism TypeScript Track

[![configlet](https://github.com/exercism/typescript/actions/workflows/configlet.yml/badge.svg)](https://github.com/exercism/typescript/actions/workflows/configlet.yml) [![typescript / ci](https://github.com/exercism/typescript/workflows/typescript%20/%20main/badge.svg)](https://github.com/exercism/typescript/actions?query=workflow%3A%22typescript+%2F+main%22)

**Exercism exercises in TypeScript**

This is the TypeScript track, one of the many tracks on [exercism][web-exercism].
It holds all the _exercises_ that are currently implemented and available for students to complete.
The track consists of various **core** exercises - the ones a student _must_ complete - and each **core** exercise may unlock various _side_ exercises.
You can find this in the [`config.json`][file-config].

> In version 3 of exercism, the above no longer holds. See the [`exercism/v3`][git-v3] repository for more information.

## Tools

See [CONTRIBUTING.md][file-contributing] for a list of requirements to contribute to this track.
It also has a list of tools you can use, of which the `test` tool is one of them.

## Running the test suite

This runs `jest` tests for all sample solutions.
This _does not_ use the regular way to run `jest`, because the example solution files must be renamed to be imported correctly into the test files.

```shell
corepack yarn test
```

If the `ASSIGNMENT` environment variable is set, only _that_ exercise is tested.
For example, if you only want to test the `two-fer.example.ts` for `two-fer`, you may, depending on your environment, use:

```shell
ASSIGNMENT=practice/two-fer corepack yarn test
```

> Running on Windows? Depending on your shell, environment variables are set differently.
> You can use `cross-env` to normalize this. The following should work across environments:
>
> ```bash
> corepack yarn dlx cross-env ASSIGNMENT=practice/two-fer corepack yarn test
> ```

## Related repositories

- [Website Copy][git-website-copy] (Mentor Notes)
- [The TypeScript Analyzer][git-typescript-analyzer]
- [The TypeScript Representer][git-typescript-representer]
- [The TypeScript Test Runner][git-typescript-test-runner]

### Related JavaScript repositories

A lot of the improvements made to this track and tooling, is also made to the JavaScript track and tooling and vice-versa.

- [The JavaScript track][git-javascript]
- [The JavaScript Analyzer][git-javascript-analyzer] (Automated Code Analysis)
- [The JavaScript Representer][git-javascript-representer]
- [The JavaScript Test Runner][git-javascript-test-runner]

[web-exercism]: https://exercism.org
[file-config]: https://github.com/exercism/typescript/blob/master/config.json
[file-contributing]: https://github.com/exercism/typescript/blob/master/CONTRIBUTING.md
[git-javascript]: https://github.com/exercism/javascript
[git-javascript-analyzer]: https://github.com/exercism/javascript-analyzer
[git-javascript-representer]: https://github.com/exercism/javascript-representer
[git-javascript-test-runner]: https://github.com/exercism/javascript-test-runner
[git-typescript]: https://github.com/exercism/typescript/
[git-typescript-analyzer]: https://github.com/exercism/typescript-analyzer
[git-typescript-representer]: https://github.com/exercism/typescript-representer
[git-typescript-test-runner]: https://github.com/exercism/typescript-test-runner
[git-v3]: https://github.com/exercism/v3
[git-website-copy]: https://github.com/exercism/website-copy


================================================
FILE: TAGS.md
================================================
# Tags

This document aims to provide reasoning why `config.json` contains the `"tags"` it contains.

It uses as a basis the JavaScript's [TAGS.md](https://github.com/exercism/javascript/blob/main/TAGS.md) because anything that JavaScript does can be done with TypeScript, being a transpiled language, and adds/modifies with the perks TypeScript brings on top of it.

## Paradigms

- [x] `paradigm/declarative`: mostly popularised by libraries and frameworks such as React, Vue, etc.
- [x] `paradigm/functional`: there is a lot of support for functional programming, including various defactor libraries in the ecosystem providing functional programming patterns.
- [x] `paradigm/imperative`: It retains JavaScript's script and DOM's manipulation imperative programming, but the language design doesn't encourage it.
- [ ] `paradigm/logic`: whilst it is possible to write DSL or patterns that' allow for logic-based programming, JavaScript doesn't inherently support it.
- [x] `paradigm/object_oriented`: becomes a main feature of the language compared to JavaScript, along with static type checking and a rich type system.

## Typing

- [x] `typing/static`: Will check types at compile time for any part of the code which has its types stated.
- [x] `typing/dynamic`: At runtime all TypeScript's type information is stripped. Runtime type checking can also be manually achieved, as well.
- [x] `typing/strong`: TypeScript adds a rich type system, that is checked at compile time if used.
- [x] `typing/weak`: TypeScript allows for explicit (strong) typing, inferred (weak) typing, deferred (computed / conditional) typing, opt-out (using `any`) of typing, and forced run-time (using `unknown`) typing.

## Execution mode

- [x] `execution_mode/compiled`: TypeScript transpilation (transpilation via [`tsc`](https://www.typescriptlang.org/), or stripping types and then compiling using [`@babel/preset-typescript`](https://babeljs.io/docs/en/babel-preset-typescript)) compiles the code to a certain version of JavaScript. This includes in-memory compilation using tools such as [`ts-node`](https://github.com/TypeStrong/ts-node), however due to the in-line nature and REPL like support, it might be considered interpreted.
- [x] `execution_mode/interpreted`: TypeScript _can_ be interpreted Just-In-Time by stripping types, for example using [`@babel/preset-typescript`](https://babeljs.io/docs/en/babel-preset-typescript).

## Platform

- [x] `platform/windows`: popularised by Electron and Node
- [x] `platform/mac`: popularised by Electron and Node
- [x] `platform/linux`: popularised by Electron and Node
- [x] `platform/ios`: popularised by PhoneGap/Cordova, Ionic, React-Native
- [x] `platform/android`: popularised by PhoneGap/Cordova, Ionic, React-Native
- [x] `platform/web`: used in frontend frameworks like Angular

## Runtime

- [ ] `runtime/standalone_executable`: it doesn't. Any executable that exists packages Node, or requires Node or a Browser.
- [x] `runtime/language_specific`: it runs on Node
- [ ] `runtime/clr`: it doesn't
- [ ] `runtime/jvm`: it doesn't
- [ ] `runtime/beam`: it doesn't
- [x] `runtime/wasmtime`: Just like JavaScript, it doesn't natively, but JavaScript can compile to WASM, and thus then run on wastime. It's a bit of a cheat, but probably what people will search for.

## Used for

- [x] `used_for/artificial_intelligence`: popularised by TensorFlow
- [x] `used_for/backends`: popularised by Express
- [x] `used_for/cross_platform_development`: popularised by PhoneGap/Cordova, Ionic, React-Native, Electron and more
- [ ] `used_for/embedded_systems`: It's possible to run the transpiled JavaScript on microcontrollers and IoT platforms, but the low-end nature makes it not a viable, professional, solution. Therefore this is not included.
- [ ] `used_for/financial_systems`: Although it improves in the type safeness department, TypeScript being still JavaScript makes it too slow for fintech.
- [x] `used_for/frontends`: Most TypeScript usage is with Frontend frameworks.
- [x] `used_for/games`: probably one of the most popular replacements for browser-based games.
- [x] `used_for/guis`: same reason as frontends, which is more and more interesting as libraries such as React can now also render to less common/expected displays, such as terminals (and thus be used to build GUIs), not requiring CSS or other ways to provide styling.
- [x] `used_for/mobile`: yep, see platform
- [ ] `used_for/robotics`: it's possible. Things like Johnny-Five help a lot. However, it's not a _go to_ language to provide robotics programming, so it's not included.
- [ ] `used_for/scientific_calculations`: possible, and not uncommon especially for _visualisation_ (for example d3), but not a _go to_ language to do scientific calculations, so it's not included.
- [ ] `used_for/scripts`: You could still transpile your TypeScript files, but is usually not worth the hassle, so is not used for scripting at all compared to JavaScript
- [x] `used_for/web_development`: yes


================================================
FILE: babel.config.cjs
================================================
module.exports = {
  // eslint-disable-next-line @typescript-eslint/no-require-imports
  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],
  plugins: [],
}


================================================
FILE: bin/check-formatting.sh
================================================
#!/usr/bin/env bash

set -uo pipefail

if [ -z "${EXERCISM_PRETTIER_VERSION:-}" ]; then
  echo "[format] pulling prettier version from yarn.lock using sed"
  EXERCISM_PRETTIER_VERSION="$(corepack yarn info prettier --json --name-only | sed -n -e 's/^"prettier@npm://' -e 's/"//p')"
  echo "[format] expected version is now ${EXERCISM_PRETTIER_VERSION:-}"
fi

if [ -z "${EXERCISM_PRETTIER_VERSION:-}" ]; then
  echo "Version could not be pulled using sed" >&2
  echo "[format] pulling prettier version from yarn.lock using grep"
  EXERCISM_PRETTIER_VERSION="$(corepack yarn info prettier --json --name-only | grep -Po '"prettier@npm:\K[^"]+')"
  echo "[format] expected version is now ${EXERCISM_PRETTIER_VERSION:-}"
fi

if [ -z "${EXERCISM_PRETTIER_VERSION:-}" ]; then
  echo "Version could not be pulled using grep or sed" >&2
  echo ""
  echo "---------------------------------------------------"
  echo "This script requires the EXERCISM_PRETTIER_VERSION variable to work."
  echo "Please see https://exercism.org/docs/building/markdown/style-guide for guidance."
  echo "---------------------------------------------------"
  echo "$(corepack yarn -v)"
  echo ""
  echo "This is what yarn why reports:"
  echo "$ corepack yarn why prettier"
  echo "$(corepack yarn why prettier)"
  echo ""
  echo "And corepack yarn info reports the following:"
  echo "$ corepack yarn info prettier --name-only"
  echo "$(corepack yarn info prettier --name-only)"
  echo ""
  echo "This is the version that can be extracted using grep:"
  echo "$ corepack yarn info prettier --json --name-only | grep -Po '"prettier@npm:\K[^"]+'"
  echo "└─ $(corepack yarn info prettier --json --name-only | grep -Po '"prettier@npm:\K[^"]+')"
  echo ""
  echo "This is the version that can be extracted using sed:"
  echo "$ corepack yarn info prettier --json --name-only | sed -n -e 's/^"prettier@npm://' -e 's/"//p'"
  echo "└─ $(corepack yarn info prettier --json --name-only | sed -n -e 's/^"prettier@npm://' -e 's/"//p')"
  echo ""
  echo "These files are found in the repo root:"
  echo "$(ls -p | grep -v /)"
  echo "---------------------------------------------------"
  exit 1
else
 echo "[format] running with prettier@$EXERCISM_PRETTIER_VERSION"
fi

corepack yarn dlx "prettier@$EXERCISM_PRETTIER_VERSION" --check "**/*.{js,jsx,ts,tsx,css,sass,scss,html,json,md,yml}"


================================================
FILE: bin/fetch-configlet
================================================
#!/usr/bin/env bash

# This file is a copy of the
# https://github.com/exercism/configlet/blob/main/scripts/fetch-configlet file.
# Please submit bugfixes/improvements to the above file to ensure that all tracks benefit from the changes.

set -eo pipefail

curlopts=(
  --silent
  --show-error
  --fail
  --location
  --retry 3
)

if [[ -n "${GITHUB_TOKEN}" ]]; then
  curlopts+=(--header "authorization: Bearer ${GITHUB_TOKEN}")
fi

get_download_url() {
  local os="$1"
  local ext="$2"
  local latest='https://api.github.com/repos/exercism/configlet/releases/latest'
  local arch
  case "$(uname -m)" in
    aarch64|arm64) arch='arm64'  ;;
    x86_64)        arch='x86-64' ;;
    *686*)         arch='i386'   ;;
    *386*)         arch='i386'   ;;
    *)             arch='x86-64' ;;
  esac
  local suffix="${os}_${arch}.${ext}"
  curl "${curlopts[@]}" --header 'Accept: application/vnd.github.v3+json' "${latest}" |
    grep "\"browser_download_url\": \".*/download/.*/configlet.*${suffix}\"$" |
    cut -d'"' -f4
}

main() {
  local output_dir
  if [[ -d ./bin ]]; then
    output_dir="./bin"
  elif [[ $PWD == */bin ]]; then
    output_dir="$PWD"
  else
    echo "Error: no ./bin directory found. This script should be ran from a repo root." >&2
    return 1
  fi

  local os
  case "$(uname -s)" in
    Darwin*)   os='macos'   ;;
    Linux*)    os='linux'   ;;
    Windows*)  os='windows' ;;
    MINGW*)    os='windows' ;;
    MSYS_NT-*) os='windows' ;;
    *)         os='linux'   ;;
  esac

  local ext
  case "${os}" in
    windows) ext='zip'    ;;
    *)       ext='tar.gz' ;;
  esac

  echo "Fetching configlet..." >&2
  local download_url
  download_url="$(get_download_url "${os}" "${ext}")"
  local output_path="${output_dir}/latest-configlet.${ext}"
  curl "${curlopts[@]}" --output "${output_path}" "${download_url}"

  case "${ext}" in
    zip) unzip "${output_path}" -d "${output_dir}"   ;;
    *)   tar xzf "${output_path}" -C "${output_dir}" ;;
  esac

  rm -f "${output_path}"

  local executable_ext
  case "${os}" in
    windows) executable_ext='.exe' ;;
    *)       executable_ext=''     ;;
  esac

  local configlet_path="${output_dir}/configlet${executable_ext}"
  local configlet_version
  configlet_version="$(${configlet_path} --version)"
  echo "Downloaded configlet ${configlet_version} to ${configlet_path}"
}

main


================================================
FILE: bin/fetch-configlet.ps1
================================================
# This file is a copy of the
# https://github.com/exercism/configlet/blob/main/scripts/fetch-configlet.ps1 file.
# Please submit bugfixes/improvements to the above file to ensure that all tracks
# benefit from the changes.

$ErrorActionPreference = "Stop"
$ProgressPreference = "SilentlyContinue"

$requestOpts = @{
    Headers           = If ($env:GITHUB_TOKEN) { @{ Authorization = "Bearer ${env:GITHUB_TOKEN}" } } Else { @{ } }
    MaximumRetryCount = 3
    RetryIntervalSec  = 1
}

Function Get-DownloadUrl {
    $arch = If ([Environment]::Is64BitOperatingSystem) { "x86-64" } Else { "i386" }
    $latestUrl = "https://api.github.com/repos/exercism/configlet/releases/latest"
    Invoke-RestMethod -Uri $latestUrl -PreserveAuthorizationOnRedirect @requestOpts `
    | Select-Object -ExpandProperty assets `
    | Where-Object { $_.name -match "^configlet_.+_windows_${arch}.zip$" } `
    | Select-Object -ExpandProperty browser_download_url -First 1
}

$outputDirectory = "bin"
if (!(Test-Path -Path $outputDirectory)) {
    Write-Output "Error: no ./bin directory found. This script should be ran from a repo root."
    exit 1
}

Write-Output "Fetching configlet..."
$downloadUrl = Get-DownloadUrl
$outputFileName = "configlet.zip"
$outputPath = Join-Path -Path $outputDirectory -ChildPath $outputFileName
Invoke-WebRequest -Uri $downloadUrl -OutFile $outputPath @requestOpts

$configletPath = Join-Path -Path $outputDirectory -ChildPath "configlet.exe"
if (Test-Path -Path $configletPath) { Remove-Item -Path $configletPath }
[System.IO.Compression.ZipFile]::ExtractToDirectory($outputPath, $outputDirectory)
Remove-Item -Path $outputPath

$configletVersion = (Select-String -Pattern "/releases/download/(.+?)/" -InputObject $downloadUrl -AllMatches).Matches.Groups[1].Value
Write-Output "Downloaded configlet ${configletVersion} to ${configletPath}"


================================================
FILE: bin/format.sh
================================================
#!/usr/bin/env bash

set -uo pipefail

if [ -z "${EXERCISM_PRETTIER_VERSION:-}" ]; then
  echo "[format] pulling prettier version from yarn.lock using sed"
  EXERCISM_PRETTIER_VERSION="$(corepack yarn info prettier --json --name-only | sed -n -e 's/^"prettier@npm://' -e 's/"//p')"
  echo "[format] expected version is now ${EXERCISM_PRETTIER_VERSION:-}"
fi

if [ -z "${EXERCISM_PRETTIER_VERSION:-}" ]; then
  echo "Version could not be pulled using sed" >&2
  echo "[format] pulling prettier version from yarn.lock using grep"
  EXERCISM_PRETTIER_VERSION="$(corepack yarn info prettier --json --name-only | grep -Po '"prettier@npm:\K[^"]+')"
  echo "[format] expected version is now ${EXERCISM_PRETTIER_VERSION:-}"
fi

if [ -z "${EXERCISM_PRETTIER_VERSION:-}" ]; then
  echo "Version could not be pulled using grep or sed" >&2
  echo ""
  echo "---------------------------------------------------"
  echo "This script requires the EXERCISM_PRETTIER_VERSION variable to work."
  echo "Please see https://exercism.org/docs/building/markdown/style-guide for guidance."
  echo "---------------------------------------------------"
  echo "$(corepack yarn -v)"
  echo ""
  echo "This is what corepack yarn why reports:"
  echo "$ corepack yarn why prettier"
  echo "$(corepack yarn why prettier)"
  echo ""
  echo "And corepack yarn info reports the following:"
  echo "$ corepack yarn info prettier --name-only"
  echo "$(corepack yarn info prettier --name-only)"
  echo ""
  echo "This is the version that can be extracted using grep:"
  echo "$ corepack yarn info prettier --json --name-only | grep -Po '"prettier@npm:\K[^"]+'"
  echo "└─ $(corepack yarn info prettier --json --name-only | grep -Po '"prettier@npm:\K[^"]+')"
  echo ""
  echo "This is the version that can be extracted using sed:"
  echo "$ corepack yarn info prettier --json --name-only | sed -n -e 's/^"prettier@npm://' -e 's/"//p'"
  echo "└─ $(corepack yarn info prettier --json --name-only | sed -n -e 's/^"prettier@npm://' -e 's/"//p')"
  echo ""
  echo "These files are found in the repo root:"
  echo "$(ls -p | grep -v /)"
  echo "---------------------------------------------------"
  exit 1
else
 echo "[format] running with prettier@$EXERCISM_PRETTIER_VERSION"
fi

corepack yarn dlx "prettier@$EXERCISM_PRETTIER_VERSION" --write "**/*.{js,jsx,ts,tsx,css,sass,scss,html,json,md,yml}"


================================================
FILE: bin/generate-config-tree
================================================
#!/usr/bin/env node

const { exercises } = require('../config.json')
const TAG_CORE = '__core'
const TAG_BONUS = '__bonus'

// node inter-opt exports
exports.TAG_CORE = TAG_CORE
exports.TAG_BONUS = TAG_BONUS

exports.tree = exercises.reduce((result, exercise) => {
    const tag = exercise.slug
    const item = {
        slug: tag,
        difficulty: exercise.difficulty,
    }

    if (exercise.core) {
        const current = result[TAG_CORE] || []

        if (result[tag]) {
            console.warn(`${tag} is not ordered correctly in config.json`)
        }

        return {
            ...result,
            __core: current.concat([item]),
            [tag]: result[tag] || []
        }
    }

    const parent = exercise.unlocked_by || TAG_BONUS
    const current = result[parent] || []
    return { ...result, [parent]: current.concat([item]) }
}, {})


================================================
FILE: bin/md5-hash
================================================
#!/bin/bash
#
# Calculates the MD5 hash of a given file. It uses hashing utilities powered by
# operating systems, but wraps them into a consistent interface.

OS=$(
    case $(uname) in
        (Darwin*)  echo "mac";;
        (Linux*)   echo "linux";;
        # TODO: implement MD5 hashing on Windows
        # (Windows*) echo "windows";;
        (*)        echo "linux";;
    esac
)

case $OS in
    mac )
        md5 -q $@;;
    linux )
        md5sum $@ | sed -E 's/([a-z0-9]{32}).+$/\1/';;
esac


================================================
FILE: bin/print-config-tree
================================================
#!/usr/bin/env node

const actions = require('./generate-config-tree')

const { tree, TAG_BONUS, TAG_CORE } = actions
const { [TAG_BONUS]: __bonus, [TAG_CORE]: __core, ...track } = tree

function printLn(line) {
    process.stdout.write(`${line}\n`)
}

function printList(items) {
    items.forEach(item => {
        printLn(`- ${item.slug} (${item.difficulty})`)
    })
}

printLn('Core (matches config.json) of this track:')
printList(__core)
printLn('\n')
printLn('core')
printLn('----')
Object.keys(track).forEach(slug => {
    printLn(`├─ ${slug}`)
    track[slug].forEach((side, index, self) => {
        junction = index === self.length - 1 ? '└─' : '├─'
        printLn(`│  ${junction} ${side.slug} (${side.difficulty})`)
    })
    printLn('│')
})

printLn('bonus')
printLn('----')
printList(__bonus)


================================================
FILE: common/.vscode/extensions.json
================================================
{
  "recommendations": [
    "arcanis.vscode-zipfs",
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode"
  ]
}


================================================
FILE: common/.vscode/settings.json
================================================
{
  "cSpell.words": ["exercism"],
  "search.exclude": {
    "**/.yarn": true,
    "**/.pnp.*": true
  }
}


================================================
FILE: common/.yarnrc.yml
================================================
compressionLevel: mixed

enableGlobalCache: true


================================================
FILE: common/babel.config.cjs
================================================
module.exports = {
  // eslint-disable-next-line @typescript-eslint/no-require-imports
  presets: [[require('@exercism/babel-preset-typescript'), { corejs: '3.38' }]],
  plugins: [],
}


================================================
FILE: common/eslint.config.mjs
================================================
// @ts-check

import tsEslint from 'typescript-eslint'
import config from '@exercism/eslint-config-typescript'
import maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'

export default [
  ...tsEslint.config(...config, {
    files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],
    extends: maintainersConfig,
  }),
  {
    ignores: [
      // # Protected or generated
      '.git/**/*',
      '.vscode/**/*',

      //# When using npm
      'node_modules/**/*',

      // # Configuration files
      'babel.config.cjs',
      'jest.config.cjs',
    ],
  },
]


================================================
FILE: common/jest.config.cjs
================================================
module.exports = {
  verbose: true,
  projects: ['<rootDir>'],
  testMatch: [
    '**/__tests__/**/*.[jt]s?(x)',
    '**/test/**/*.[jt]s?(x)',
    '**/?(*.)+(spec|test).[jt]s?(x)',
  ],
  testPathIgnorePatterns: [
    '/(?:production_)?node_modules/',
    '.d.ts$',
    '<rootDir>/test/fixtures',
    '<rootDir>/test/helpers',
    '__mocks__',
  ],
  transform: {
    '^.+\\.[jt]sx?$': 'babel-jest',
  },
  moduleNameMapper: {
    '^(\\.\\/.+)\\.js$': '$1',
  },
}


================================================
FILE: common/keep.ts
================================================
// This exists to keep tsconfig.json in this folder happy
export {}


================================================
FILE: common/package.json
================================================
{
  "name": "@exercism/typescript",
  "version": "1.0.0",
  "description": "Exercism exercises in Typescript.",
  "author": "Katrina Owen",
  "contributors": [
    "Derk-Jan Karrenbeld <derk-jan+git@karrenbeld.info> (https://derk-jan.com)"
  ],
  "private": true,
  "repository": {
    "type": "git",
    "url": "https://github.com/exercism/typescript"
  },
  "type": "module",
  "engines": {
    "node": "^18.16.0 || >=20.0.0"
  },
  "devDependencies": {
    "@exercism/babel-preset-typescript": "^0.6.0",
    "@exercism/eslint-config-typescript": "^0.8.0",
    "@jest/globals": "^29.7.0",
    "@types/node": "~22.7.6",
    "babel-jest": "^29.7.0",
    "core-js": "~3.38.1",
    "eslint": "^9.12.0",
    "expect": "^29.7.0",
    "jest": "^29.7.0",
    "prettier": "^3.3.3",
    "tstyche": "^2.1.1",
    "typescript": "~5.6.3",
    "typescript-eslint": "^8.10.0"
  },
  "scripts": {
    "test": "corepack yarn node test-runner.mjs",
    "test:types": "corepack yarn tstyche",
    "test:implementation": "corepack yarn jest --no-cache --passWithNoTests",
    "lint": "corepack yarn lint:types && corepack yarn lint:ci",
    "lint:types": "corepack yarn tsc --noEmit -p .",
    "lint:ci": "corepack yarn eslint . --ext .tsx,.ts"
  },
  "packageManager": "yarn@4.5.1"
}


================================================
FILE: common/test-runner.mjs
================================================
#!/usr/bin/env node

/**
 * 👋🏽 Hello there reader,
 *
 * It looks like you are working on this solution using the Exercism CLI and
 * not the online editor. That's great! The file you are looking at executes
 * the various steps the online test-runner also takes.
 *
 * @see https://github.com/exercism/typescript-test-runner
 *
 * TypeScript track exercises generally consist of at least two out of three
 * types of tests to run.
 *
 * 1. tsc, the TypeScript compiler. This tests if the TypeScript code is valid
 * 2. tstyche, static analysis tests to see if the types used are expected
 * 3. jest, runtime implementation tests to see if the solution is correct
 *
 * If one of these three fails, this script terminates with -1, -2, or -3
 * respectively. If it succeeds, it terminates with exit code 0.
 *
 * @note you need corepack (bundled with node LTS) enabled in order for this
 *    test runner to work as expected. Follow the installation and test
 *    instructions if you see errors about corepack or pnp.
 */

import { execSync } from 'node:child_process'
import { existsSync, readFileSync } from 'node:fs'
import { exit } from 'node:process'
import { URL } from 'node:url'

/**
 * Before executing any tests, the test runner attempts to find the
 * exercise config.json file which has metadata about which types of tests
 * to run for this solution.
 */
const metaDirectory = new URL('./.meta/', import.meta.url)
const exercismDirectory = new URL('./.exercism/', import.meta.url)
const configDirectory = existsSync(metaDirectory)
  ? metaDirectory
  : existsSync(exercismDirectory)
    ? exercismDirectory
    : null

if (configDirectory === null) {
  throw new Error(
    'Expected .meta or .exercism directory to exist, but I cannot find it.'
  )
}

const configFile = new URL('./config.json', configDirectory)
if (!existsSync(configFile)) {
  throw new Error('Expected config.json to exist at ' + configFile.toString())
}

// Experimental: import config from './config.json' with { type: 'json' }
/** @type {import('./config.json') } */
const config = JSON.parse(readFileSync(configFile))

const jest = !config.custom || config.custom['flag.tests.jest']
const tstyche = config.custom?.['flag.tests.tstyche']
console.log(
  `[tests] tsc: ✅, tstyche: ${tstyche ? '✅' : '❌'}, jest: ${jest ? '✅' : '❌'}, `
)

/**
 * 1. tsc: the typescript compiler
 */
try {
  console.log('[tests] tsc (compile)')
  execSync('corepack yarn lint:types', {
    stdio: 'inherit',
    cwd: process.cwd(),
  })
} catch {
  exit(-1)
}

/**
 * 2. tstyche: type tests
 */
if (tstyche) {
  try {
    console.log('[tests] tstyche (type tests)')
    execSync('corepack yarn test:types', {
      stdio: 'inherit',
      cwd: process.cwd(),
    })
  } catch {
    exit(-2)
  }
}

/**
 * 3. jest: implementation tests
 */
if (jest) {
  try {
    console.log('[tests] tstyche (implementation tests)')
    execSync('corepack yarn test:implementation', {
      stdio: 'inherit',
      cwd: process.cwd(),
    })
  } catch {
    exit(-3)
  }
}

/**
 * Done! 🥳
 */


================================================
FILE: common/tsconfig.json
================================================
{
  "display": "Configuration for Exercism TypeScript Exercises",
  "compilerOptions": {
    // Allows you to use the newest syntax, and have access to console.log
    // https://www.typescriptlang.org/tsconfig#lib
    "lib": ["ES2020", "dom"],
    // Make sure typescript is configured to output ESM
    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm
    "module": "Node16",
    // Since this project is using babel, TypeScript may target something very
    // high, and babel will make sure it runs on your local Node version.
    // https://babeljs.io/docs/en/
    "target": "ES2020", // ESLint doesn't support this yet: "es2022",

    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,

    // Because jest-resolve isn't like node resolve, the absolute path must be .ts
    "allowImportingTsExtensions": true,
    "noEmit": true,

    // Because we'll be using babel: ensure that Babel can safely transpile
    // files in the TypeScript project.
    //
    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats
    "isolatedModules": true
  },
  "include": [
    "*.ts",
    "*.tsx",
    ".meta/*.ts",
    ".meta/*.tsx",
    "__typetests__/*.tst.ts"
  ],
  "exclude": ["node_modules"]
}


================================================
FILE: concepts/.keep
================================================


================================================
FILE: concepts/basics/.meta/config.json
================================================
{
  "blurb": "Basics contains the minimal knowledge required to get started in TypeScript: function declarations, variable assignment, and exposing entities.",
  "authors": ["SleeplessByte"],
  "contributors": ["junedev"]
}


================================================
FILE: concepts/basics/about.md
================================================
# About

TypeScript is JavaScript with syntax for types, making it a a strongly typed programming language, supporting object-oriented, imperative, and declarative (e.g. functional programming) styles, giving you better tooling at any scale.
It has a few [primitives][mdn-primitive], and everything else is considered an object.

While JavaScript is the most well-known as the scripting language for Web pages, many non-browser environments also use it, such as Node.js.
The language is actively being developed; and because of its multi-paradigm property, allows for many styles of programming.

TypeScript builds on-top of this and is also actively developed.
In some rankings from 2023 it is more popular than JavaScript in daily use.

Because [you cannot learn TypeScript without learning JavaScript][handbook-js-or-ts], some of the content in this Track is focused on teaching JavaScript concepts and some of the concepts focus on TypeScript specific features only.

## (Re-)Assignment

There are a few primary ways to assign values to names in TypeScript - using variables or constants.
On Exercism, variables are always written in [camelCase][wiki-camel-case]; constants are written in [SCREAMING_SNAKE_CASE][wiki-snake-case].
There is no official guide to follow, and various companies and organizations have various style guides.
_Feel free to write variables any way you like_.
The upside from writing them the way the exercises are prepared is that they'll be highlighted differently in the web interface and most IDEs.

Variables in TypeScript can be defined using the [`const`][mdn-const], [`let`][mdn-let] or [`var`][mdn-var] keyword.

A variable can reference different values over its lifetime when using `let` or `var`.
For example, `myFirstVariable` can be defined and redefined many times using the assignment operator `=`:

```typescript
let myFirstVariable = 1
myFirstVariable = 'Some string'
myFirstVariable = new SomeComplexClass()
```

In contrast to `let` and `var`, variables that are defined with `const` can only be assigned once.
This is used to define constants in TypeScript.

```typescript
const MY_FIRST_CONSTANT = 10

// Can not be re-assigned.
MY_FIRST_CONSTANT = 20
// => TypeError: Assignment to constant variable.
```

Because TypeScript can detect this statically, the TypeScript compiler will also yield an error:

```typescript
// ^? Cannot assign to 'MY_FIRST_CONSTANT' because it is a constant.(2588)
```

This means you don't need to run the code to detect the `TypeError`.

<!--prettier-ignore -->
~~~~exercism/note
💡 In a later Learning Exercise, the difference between _constant_ assignment / binding and _constant_ value is explored and explained.
~~~~

## Type inference

Without diving too deep into the subject of [type inference][handbook-type-inference], you should be aware that an assigned variable usually as an inferred type, even without a type annotation.

```typescript
const MY_FIRST_CONSTANT = 10
// ^? const MY_FIRST_CONSTANT: number
```

This type is then enforced throughout the code.
This also means that where the following code is valid JavaScript:

```javascript
let myFirstVariable = 1
myFirstVariable = 'Some string'
```

It complains when using TypeScript:

```typescript
let myFirstVariable = 1
myFirstVariable = 'Some string'
// ^? Type 'string' is not assignable to type 'number'.(2322)
```

This feature ensures type-safety even when type annotations are not used.

### Constant Assignment

The `const` keyword is mentioned _both_ for variables and constants.
Another concept often mentioned around constants is [(im)-mutability][wiki-mutability].

The `const` keyword only makes the _binding_ immutable, that is, you can only assign a value to a `const` variable once.
In TypeScript, only [primitive][mdn-primitive] values are immutable.
However, [non-primitive][mdn-primitive] values can still be mutated.

```typescript
const MY_MUTABLE_VALUE_CONSTANT = { food: 'apple' }

// This is possible
MY_MUTABLE_VALUE_CONSTANT.food = 'pear'

MY_MUTABLE_VALUE_CONSTANT
// => { food: "pear" }
```

### Constant Value (Immutability)

As a rule, on Exercism, and many other organizations and project style guides, don't mutate values that look like `const SCREAMING_SNAKE_CASE`.
Technically the values _can_ be changed, but for clarity and expectation management on Exercism this is discouraged.
When this _must_ be enforced, use [`Object.freeze(value)`][mdn-object-freeze].

Where possible, the TypeScript keyword `readonly`, `as const`, or `Readonly<T>` generic type may be used to enforce immutability statically.
You will learn more about this subject later.

```typescript
const MY_VALUE_CONSTANT = Object.freeze({ food: 'apple' })

MY_VALUE_CONSTANT.food = 'pear'
// ^? Cannot assign to 'food' because it is a read-only property.(2540)

MY_VALUE_CONSTANT
// => { food: "apple" }
```

In the wild, it's unlikely to see `Object.freeze` all over a code base, but the rule to not mutate a `SCREAMING_SNAKE_CASE` value ever, is a good rule; often enforced using automated analysis such as a linter.

## Function Declarations

In TypeScript, units of functionality are encapsulated in _functions_, usually grouping functions together in the same file if they belong together.
These functions can take parameters (arguments), and can _return_ a value using the `return` keyword.
Functions are invoked using `()` syntax.

```typescript
function add(num1: number, num2: number): number {
  return num1 + num2
}

add(1, 3)
// => 4
```

Function parameters should usually be annotated with a type using a colon (`:`) followed by the type.
Function return values can be annotated after closing the parameter list using a colon (`:`) followed by the type.

If a function does not have a type annotation for its return value, the type will be inferred.

```typescript
function add(num1: number, num2: number) {
  return num1 + num2
}

add(1, 3)
// ^? function add(num1: number, num2: number): number
```

Here the return type was inferred because TypeScript knows that the result of `number + number` must always be `number`.

<!--prettier-ignore -->
~~~~exercism/note
💡 In TypeScript there are _many_ different ways to declare a function.
These other ways look different than using the `function` keyword.
The track tries to gradually introduce them, but if you already know about them, feel free to use any of them.
In most cases, using one or the other isn't better or worse.
~~~~

## Type Annotations

As shown in the function declaration for `add`, the parameters have an explicit type annotation `: number`.
Variable declarations, class properties, function declarations and more all support type annotations.

Both explicit type annotation as inferred types are enforced by the type-checker.

```typescript
add('foo', 3)
// ^? Argument of type 'string' is not assignable to parameter of type 'number'.(2345)
```

If TypeScript does not find an explicit type annotation and cannot infer the type, it will assign the `any` type, which [you should not use][handbook-dont-use-any].
Later you will learn about the `unknown` type as a good alternative.

## Export and Import

The `export` and `import` keywords are powerful tools that turn a regular TypeScript file into a [TypeScript module][mdn-module].
Apart from allowing code to selectively expose components, such as functions, classes, variables and constants, it also enables a whole range of other features, such as:

- [Renaming exports and imports][mdn-renaming-modules], which allows you to avoid naming conflicts,
- [Dynamic Imports][mdn-dynamic-imports], which loads code on demand,
- [Tree shaking][blog-tree-shaking], which reduces the size of the final code by eliminating side-effect free modules and even contents of modules _that are not used_,
- Exporting [_live bindings_][blog-live-bindings], which allows you to export a value that mutates everywhere it's imported if the original value mutates.

A concrete example is how the tests work on Exercism's TypeScript Track.
Each exercise has at least one implementation file, for example `lasagna.ts`, and each exercise has at least one test file, for example `lasagna.test.ts`.
The implementation file uses `export` to expose the public API and the test file uses `import` to access these, which is how it can test the implementation's outcomes.

```typescript
// file.js
export const MY_VALUE = 10

export function add(num1, num2) {
  return num1 + num2
}

// file.spec.js
import { MY_VALUE, add } from './file.js'

add(MY_VALUE, 5)
// => 15
```

<!--prettier-ignore -->
~~~~exercism/advanced
Because the TypeScript compiler does _not rewrite import paths_, the imports should be written using the `.js` extension (as that's what it will become after transpilation).
However, the option `allowImportingTsExtensions` is on because we have a process that rewrites the paths.
This allows importing from `.ts` (as well as `.js`).

In older code you will find imports _without file extension_.
~~~~

[blog-live-bindings]: https://2ality.com/2015/07/es6-module-exports.html#es6-modules-export-immutable-bindings
[blog-tree-shaking]: https://bitsofco.de/what-is-tree-shaking/
[mdn-const]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
[mdn-dynamic-imports]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports
[mdn-let]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
[mdn-module]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules
[mdn-object-freeze]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
[mdn-primitive]: https://developer.mozilla.org/en-US/docs/Glossary/Primitive
[mdn-renaming-modules]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#Renaming_imports_and_exports
[mdn-var]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var
[handbook-dont-use-any]: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html#any
[handbook-js-or-ts]: https://www.typescriptlang.org/docs/handbook/typescript-from-scratch.html#learning-javascript-and-typescript
[handbook-type-inference]: https://www.typescriptlang.org/docs/handbook/type-inference.html
[wiki-mutability]: https://en.wikipedia.org/wiki/Immutable_object
[wiki-camel-case]: https://en.wikipedia.org/wiki/Camel_case
[wiki-snake-case]: https://en.wikipedia.org/wiki/Snake_case


================================================
FILE: concepts/basics/introduction.md
================================================
# Introduction

TypeScript is JavaScript with syntax for types, making it a a strongly typed programming language, supporting object-oriented, imperative, and declarative (e.g. functional programming) styles, giving you better tooling at any scale.

Because [you cannot learn TypeScript without learning JavaScript][handbook-js-or-ts], some of the content in this Track is focused on teaching JavaScript concepts and some of the concepts focus on TypeScript specific features only.

## (Re-)Assignment

There are a few primary ways to assign values to names in TypeScript - using variables or constants.
On Exercism, variables are always written in [camelCase][wiki-camel-case]; constants are written in [SCREAMING_SNAKE_CASE][wiki-snake-case].
There is no official guide to follow, and various companies and organizations have various style guides.
_Feel free to write variables any way you like_.
The upside from writing them the way the exercises are prepared is that they'll be highlighted differently in the web interface and most IDEs.

Variables in TypeScript can be defined using the [`const`][mdn-const], [`let`][mdn-let] or [`var`][mdn-var] keyword.

A variable can reference different values over its lifetime when using `let` or `var`.
For example, `myFirstVariable` can be defined and redefined many times using the assignment operator `=`:

```typescript
let myFirstVariable = 1
myFirstVariable = 0
myFirstVariable = 42
```

In contrast to `let` and `var`, variables that are defined with `const` can only be assigned once.
This is used to define constants in TypeScript.

```typescript
const MY_FIRST_CONSTANT = 10

// Can not be re-assigned.
MY_FIRST_CONSTANT = 20
// => TypeError: Assignment to constant variable.
```

Because TypeScript can detect this statically, the TypeScript compiler will also yield an error:

```typescript
// ^? Cannot assign to 'MY_FIRST_CONSTANT' because it is a constant.(2588)
```

This means you don't need to run the code to detect the `TypeError`.

<!--prettier-ignore -->
~~~~exercism/note
💡 In a later Learning Exercise, the difference between _constant_ assignment / binding and _constant_ value is explored and explained.
~~~~

## Type inference

Without diving too deep into the subject of [type inference][handbook-type-inference], you should be aware that an assigned variable usually as an inferred type, even without a type annotation.

```typescript
const MY_FIRST_CONSTANT = 10
// ^? const MY_FIRST_CONSTANT: number
```

This type is then enforced throughout the code.
This also means that where the following code is valid JavaScript:

```javascript
let myFirstVariable = 1
myFirstVariable = 'Some string'
```

It complains when using TypeScript:

```typescript
let myFirstVariable = 1
myFirstVariable = 'Some string'
// ^? Type 'string' is not assignable to type 'number'.(2322)
```

This feature ensures type-safety even when type annotations are not used.

## Function Declarations

In TypeScript, units of functionality are encapsulated in _functions_, usually grouping functions together in the same file if they belong together.
These functions can take parameters (arguments), and can _return_ a value using the `return` keyword.
Functions are invoked using `()` syntax.

```typescript
function add(num1: number, num2: number): number {
  return num1 + num2
}

add(1, 3)
// => 4
```

Function parameters should usually be annotated with a type using a colon (`:`) followed by the type.
Function return values can be annotated after closing the parameter list using a colon (`:`) followed by the type.

<!--prettier-ignore -->
~~~~exercism/note
💡 In TypeScript there are _many_ different ways to declare a function.
These other ways look different than using the `function` keyword.
The track tries to gradually introduce them, but if you already know about them, feel free to use any of them.
In most cases, using one or the other isn't better or worse.
~~~~

## Type Annotations

As shown in the function declaration for `add`, the parameters have an explicit type annotation `: number`.
Variable declarations, class properties, function declarations and more all support type annotations.

Both explicit type annotation as inferred types are enforced by the type-checker.

```typescript
add('foo', 3)
// ^? Argument of type 'string' is not assignable to parameter of type 'number'.(2345)
```

## Exposing to Other Files

To make a `function`, a constant, or a variable available in _other files_, they need to be [exported][mdn-export] using the `export` keyword.
Another file may then [import][mdn-import] these using the `import` keyword.
This is also known as the module system.
A great example is how all the tests work.
Each exercise has at least one file, for example `lasagna.ts`, which contains the _implementation_.
Additionally, there is at least one other file, for example `lasagna.test.ts`, that contains the _tests_.
This file _imports_ the public (i.e. exported) entities to test the implementation:

```typescript
// file.ts
export const MY_VALUE = 10

export function add(num1, num2) {
  return num1 + num2
}

// file.test.ts
import { MY_VALUE, add } from './file.js'

add(MY_VALUE, 5)
// => 15
```

[mdn-const]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
[mdn-export]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export
[mdn-import]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
[mdn-let]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
[mdn-var]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var
[handbook-js-or-ts]: https://www.typescriptlang.org/docs/handbook/typescript-from-scratch.html#learning-javascript-and-typescript
[handbook-type-inference]: https://www.typescriptlang.org/docs/handbook/type-inference.html
[wiki-camel-case]: https://en.wikipedia.org/wiki/Camel_case
[wiki-snake-case]: https://en.wikipedia.org/wiki/Snake_case


================================================
FILE: concepts/basics/links.json
================================================
[
  {
    "url": "https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html",
    "description": "TypeScript for JavaScript Programmers"
  },
  {
    "url": "https://www.typescriptlang.org/docs/handbook/2/basic-types.html",
    "description": "TypeScript Handbook: The Basics"
  },
  {
    "url": "https://www.typescriptlang.org/docs/handbook/type-inference.html",
    "description": "TypeScript Handbook: Type Inference"
  },
  {
    "url": "https://developer.mozilla.org/en-US/docs/Glossary/Primitive",
    "description": "MDN Glossary: JavaScript Primitive"
  },
  {
    "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze",
    "description": "MDN: JavaScript Object freezing"
  },
  {
    "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules",
    "description": "MDN: JavaScript Module System"
  },
  {
    "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#Renaming_imports_and_exports",
    "description": "MDN: Renaming modules when importing or exporting"
  },
  {
    "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports",
    "description": "MDN: JavaScript Dynamic imports"
  },
  {
    "url": "https://en.wikipedia.org/wiki/Immutable_object",
    "description": "About immutable objects"
  },
  {
    "url": "https://bitsofco.de/what-is-tree-shaking/",
    "description": "About tree shaking"
  },
  {
    "url": "https://2ality.com/2015/07/es6-module-exports.html#es6-modules-export-immutable-bindings",
    "description": "About live bindings (JavaScript exports)"
  }
]


================================================
FILE: config.json
================================================
{
  "language": "TypeScript",
  "slug": "typescript",
  "active": true,
  "status": {
    "concept_exercises": false,
    "test_runner": true,
    "representer": true,
    "analyzer": true
  },
  "blurb": "TypeScript is a language for writing more maintainable JavaScript. TypeScript adds optional types, classes, and modules to JavaScript.",
  "version": 3,
  "online_editor": {
    "indent_style": "space",
    "indent_size": 2,
    "highlightjs_language": "typescript"
  },
  "test_runner": {
    "average_run_time": 8
  },
  "files": {
    "solution": [
      "%{kebab_slug}.ts"
    ],
    "test": [
      "%{kebab_slug}.test.ts"
    ],
    "example": [
      ".meta/proof.ci.ts"
    ],
    "exemplar": [
      ".meta/exemplar.ts"
    ]
  },
  "exercises": {
    "concept": [
      {
        "slug": "lasagna",
        "name": "lasagna",
        "uuid": "a0bed44f-b179-4d09-8788-a23d2ace359e",
        "concepts": [
          "basics"
        ],
        "prerequisites": [],
        "status": "wip"
      }
    ],
    "practice": [
      {
        "slug": "hello-world",
        "name": "Hello World",
        "uuid": "755f6f85-9ab3-4af6-9e35-dbb9d64be9c5",
        "practices": [],
        "prerequisites": [],
        "difficulty": 1,
        "topics": [
          "optional_values",
          "strings",
          "text_formatting"
        ]
      },
      {
        "slug": "two-fer",
        "name": "Two Fer",
        "uuid": "f66508fe-4ddc-4bbd-b8e6-542d400e57e9",
        "practices": [],
        "prerequisites": [],
        "difficulty": 1,
        "topics": [
          "optional_values",
          "strings",
          "text_formatting"
        ]
      },
      {
        "slug": "resistor-color",
        "name": "Resistor Color",
        "uuid": "c6f41fd5-584c-46ca-b3c5-6a0825446bf4",
        "practices": [],
        "prerequisites": [],
        "difficulty": 1,
        "topics": [
          "arrays",
          "strings"
        ]
      },
      {
        "slug": "resistor-color-duo",
        "name": "Resistor Color Duo",
        "uuid": "fd677d24-72eb-46d9-bfa4-8013e96fa71f",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "strings",
          "arrays"
        ]
      },
      {
        "slug": "resistor-color-trio",
        "name": "Resistor Color Trio",
        "uuid": "9316fc6a-42d2-4b12-85e1-e8abd9ce3ae2",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "strings",
          "arrays"
        ]
      },
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "fb80f76c-42da-4f62-9f0f-8c85d984908b",
        "practices": [],
        "prerequisites": [],
        "difficulty": 1,
        "topics": [
          "booleans",
          "integers",
          "logic"
        ]
      },
      {
        "slug": "line-up",
        "name": "Line Up",
        "uuid": "614dbbe5-56dc-47ea-86e6-ee64497f2cac",
        "practices": [],
        "prerequisites": [],
        "difficulty": 1,
        "topics": [
          "numbers",
          "strings"
        ]
      },
      {
        "slug": "rna-transcription",
        "name": "RNA Transcription",
        "uuid": "b4db381f-1c99-44c6-948c-c8892d77823e",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "strings",
          "transforming"
        ]
      },
      {
        "slug": "space-age",
        "name": "Space Age",
        "uuid": "8fe1e0ef-068e-4a53-a576-35be59f8152f",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "classes",
          "floating_point_numbers"
        ]
      },
      {
        "slug": "dnd-character",
        "name": "D&D Character",
        "uuid": "6f34eb4d-4028-4f89-9965-c9a887f416a0",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "classes"
        ]
      },
      {
        "slug": "darts",
        "name": "Darts",
        "uuid": "5697c090-4ab3-4f76-b9d2-a82330a27a91",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3
      },
      {
        "slug": "pangram",
        "name": "Pangram",
        "uuid": "721d9c74-cc16-4b32-8f0b-ffab75027539",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "algorithms",
          "conditionals",
          "loops",
          "lists",
          "maps",
          "searching",
          "strings"
        ]
      },
      {
        "slug": "bob",
        "name": "Bob",
        "uuid": "3977d4e5-82ca-4801-ae20-6682dda23506",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "conditionals",
          "pattern_recognition",
          "polymorphism",
          "regular_expressions",
          "strings",
          "unicode"
        ]
      },
      {
        "slug": "matrix",
        "name": "Matrix",
        "uuid": "167ec8f2-a206-4a7e-999d-7dbfc136a9fe",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "data_structures",
          "matrices",
          "text_formatting"
        ]
      },
      {
        "slug": "robot-name",
        "name": "Robot Name",
        "uuid": "b00dd1af-f89c-4382-ab43-514651de6b20",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "conditionals",
          "exception_handling",
          "randomness",
          "regular_expressions",
          "sets"
        ]
      },
      {
        "slug": "grade-school",
        "name": "Grade School",
        "uuid": "32e79fd7-f002-4bdc-b6bd-7a91d8c1af61",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "arrays",
          "maps",
          "sorting"
        ]
      },
      {
        "slug": "clock",
        "name": "Clock",
        "uuid": "c6960d69-7794-4711-8891-9c5a63727112",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "integers",
          "logic",
          "strings"
        ]
      },
      {
        "slug": "split-second-stopwatch",
        "name": "Split-Second Stopwatch",
        "uuid": "bc1fc50f-36ed-4a16-92bd-3001c8cd53d3",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4
      },
      {
        "slug": "secret-handshake",
        "name": "Secret Handshake",
        "uuid": "ac2ec51b-a2cd-4d8c-99e3-5bd6758b4e7b",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "algorithms",
          "arrays",
          "bitwise_operations",
          "conditionals",
          "loops",
          "games"
        ]
      },
      {
        "slug": "binary-search",
        "name": "Binary Search",
        "uuid": "53584e8d-9b8d-4c0e-8ad8-4c228fcf6bcf",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "algorithms",
          "arrays",
          "conditionals",
          "loops"
        ]
      },
      {
        "slug": "linked-list",
        "name": "Linked List",
        "uuid": "5b7ab927-6e4d-480f-b005-d23091e579d6",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "algorithms",
          "arrays",
          "conditionals",
          "loops",
          "data_structures",
          "lists",
          "optional_values"
        ]
      },
      {
        "slug": "prism",
        "name": "Prism",
        "uuid": "ba7d5b31-50ab-482f-9669-718949ccb753",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5
      },
      {
        "slug": "rational-numbers",
        "name": "Rational Numbers",
        "uuid": "4439ab9d-266b-483b-b5ca-3920c478fd62",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "algorithms",
          "floating_point_numbers",
          "math"
        ]
      },
      {
        "slug": "atbash-cipher",
        "name": "Atbash Cipher",
        "uuid": "04de61fb-9fde-461c-b306-0b4ce52e2169",
        "practices": [],
        "prerequisites": [],
        "difficulty": 6,
        "topics": [
          "algorithms",
          "arrays",
          "conditionals",
          "loops",
          "text_formatting"
        ]
      },
      {
        "slug": "simple-cipher",
        "name": "Simple Cipher",
        "uuid": "3ea9d03e-6d06-48e5-a4d3-6e1bb9367c2f",
        "practices": [],
        "prerequisites": [],
        "difficulty": 7,
        "topics": [
          "algorithms",
          "conditionals",
          "loops",
          "randomness",
          "strings",
          "text_formatting",
          "transforming"
        ]
      },
      {
        "slug": "wordy",
        "name": "Wordy",
        "uuid": "269577e5-e782-4264-9ad9-9ad4b8bc0aab",
        "practices": [],
        "prerequisites": [],
        "difficulty": 7,
        "topics": [
          "conditionals",
          "loops",
          "exception_handling",
          "parsing",
          "pattern_recognition",
          "regular_expressions",
          "strings"
        ]
      },
      {
        "slug": "list-ops",
        "name": "List Ops",
        "uuid": "26787ded-0aa2-46f6-88dd-13a00cce9236",
        "practices": [],
        "prerequisites": [],
        "difficulty": 8,
        "topics": [
          "data_structures",
          "lists",
          "recursion"
        ]
      },
      {
        "slug": "word-count",
        "name": "Word Count",
        "uuid": "5e5c48fb-91bb-495a-97f6-ec8642739a0a",
        "practices": [],
        "prerequisites": [],
        "difficulty": 1,
        "topics": [
          "loops",
          "lists",
          "regular_expressions",
          "strings",
          "unicode"
        ]
      },
      {
        "slug": "difference-of-squares",
        "name": "Difference of Squares",
        "uuid": "3f649490-dc7d-4a77-a2a0-2ae71ae834a9",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "algorithms",
          "loops",
          "integers",
          "math"
        ]
      },
      {
        "slug": "gigasecond",
        "name": "Gigasecond",
        "uuid": "9dfabc5c-d2a5-4896-9fc2-2b25b9a5f62f",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "time"
        ]
      },
      {
        "slug": "square-root",
        "name": "Square Root",
        "uuid": "bf4a0802-334b-4ed7-9ade-a3ef5fa6878e",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2
      },
      {
        "slug": "reverse-string",
        "name": "Reverse String",
        "uuid": "86d5a60a-fc44-443d-bc00-5c6265e736c4",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "loops",
          "strings"
        ]
      },
      {
        "slug": "triangle",
        "name": "Triangle",
        "uuid": "0eb37e93-d191-4451-bd77-cd3681c91d94",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "conditionals",
          "loops",
          "exception_handling",
          "integers"
        ]
      },
      {
        "slug": "collatz-conjecture",
        "name": "Collatz Conjecture",
        "uuid": "a701b4ca-55ea-4aa9-a607-2fe8a9828d9c",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "conditionals",
          "exception_handling",
          "integers",
          "math",
          "recursion"
        ]
      },
      {
        "slug": "etl",
        "name": "ETL",
        "uuid": "ab027a47-d483-4011-aac4-564a6284e5b8",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "loops",
          "integers",
          "maps",
          "transforming"
        ]
      },
      {
        "slug": "protein-translation",
        "name": "Protein Translation",
        "uuid": "e18a436f-5d7b-4372-9f74-15e8e9a52d63",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "strings"
        ]
      },
      {
        "slug": "raindrops",
        "name": "Raindrops",
        "uuid": "c8677318-ba6c-4e8c-83ec-513cc6530e7f",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "conditionals",
          "integers",
          "strings",
          "transforming"
        ]
      },
      {
        "slug": "hamming",
        "name": "Hamming",
        "uuid": "18204e23-fca8-44dc-8d5c-abe66b87c640",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "conditionals",
          "loops",
          "equality",
          "strings"
        ]
      },
      {
        "slug": "nucleotide-count",
        "name": "Nucleotide Count",
        "uuid": "ef16d487-524e-4c5a-8311-9162babba181",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "strings",
          "text_formatting"
        ]
      },
      {
        "slug": "camicia",
        "name": "Camicia",
        "uuid": "5ee5b5e4-bc56-4be5-b384-225b2b339444",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "conditionals",
          "loops",
          "strings"
        ]
      },
      {
        "slug": "scrabble-score",
        "name": "Scrabble Score",
        "uuid": "7c60f7c5-2922-4ce4-acbe-51c5ab654b4d",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "conditionals",
          "loops",
          "maps",
          "strings"
        ]
      },
      {
        "slug": "allergies",
        "name": "Allergies",
        "uuid": "9389fcb2-841a-42b6-8ece-f5a63f750273",
        "practices": [],
        "prerequisites": [],
        "difficulty": 6,
        "topics": [
          "arrays",
          "bitwise_operations",
          "conditionals",
          "loops"
        ]
      },
      {
        "slug": "perfect-numbers",
        "name": "Perfect Numbers",
        "uuid": "53cc064f-35d2-4a0e-a915-6a25130252c3",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "integers",
          "math"
        ]
      },
      {
        "slug": "complex-numbers",
        "name": "Complex Numbers",
        "uuid": "59d842b4-a804-4cd5-a388-983a22a70c9e",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "math"
        ]
      },
      {
        "slug": "luhn",
        "name": "Luhn",
        "uuid": "249365fb-145c-40e3-90ed-11f3f74a9df1",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "conditionals",
          "loops",
          "integers",
          "strings"
        ]
      },
      {
        "slug": "grains",
        "name": "Grains",
        "uuid": "5a04b3f8-99b6-4aec-8afd-0d54930e4aff",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "conditionals",
          "loops",
          "integers"
        ]
      },
      {
        "slug": "pythagorean-triplet",
        "name": "Pythagorean Triplet",
        "uuid": "85d74be3-8a54-4355-9ef8-0f13ed2a7683",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "algorithms",
          "conditionals",
          "loops",
          "integers",
          "math"
        ]
      },
      {
        "slug": "relative-distance",
        "name": "Relative Distance",
        "uuid": "bbdf7688-65cb-4291-9a4a-0ab89d122a31",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "algorithms",
          "data_structures",
          "maps"
        ]
      },
      {
        "slug": "sum-of-multiples",
        "name": "Sum of Multiples",
        "uuid": "e431fb10-766a-4542-94ad-9c30224a3885",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "conditionals",
          "loops",
          "integers",
          "lists",
          "math"
        ]
      },
      {
        "slug": "acronym",
        "name": "Acronym",
        "uuid": "f6631a0f-2da3-47a4-b46b-7a81fa0d4dfd",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "loops",
          "regular_expressions",
          "strings",
          "transforming"
        ]
      },
      {
        "slug": "anagram",
        "name": "Anagram",
        "uuid": "d3c93056-07b9-4d06-a681-1bb25db68c01",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "filtering",
          "strings"
        ]
      },
      {
        "slug": "isogram",
        "name": "Isogram",
        "uuid": "505eadfc-40df-476f-82d7-fe3b78b1f713",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "conditionals",
          "loops",
          "filtering",
          "searching",
          "strings"
        ]
      },
      {
        "slug": "roman-numerals",
        "name": "Roman Numerals",
        "uuid": "a4ea1a4d-d010-4039-a2b5-e3e748df7f8a",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "conditionals",
          "loops",
          "pattern_recognition",
          "transforming"
        ]
      },
      {
        "slug": "series",
        "name": "Series",
        "uuid": "dd332597-4924-48dc-abb3-1d3fde492777",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "loops",
          "exception_handling",
          "strings",
          "text_formatting"
        ]
      },
      {
        "slug": "state-of-tic-tac-toe",
        "name": "State of Tic-Tac-Toe",
        "uuid": "86316f23-cbea-4a4d-b5e0-577d24073f08",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2
      },
      {
        "slug": "phone-number",
        "name": "Phone Number",
        "uuid": "bbd4665c-be4b-4d70-bc92-e91ce7a1d55f",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "parsing",
          "transforming"
        ]
      },
      {
        "slug": "two-bucket",
        "name": "Two Bucket",
        "uuid": "6d187289-27b2-4630-b37b-58553271188a",
        "practices": [],
        "prerequisites": [],
        "difficulty": 6,
        "topics": [
          "algorithms",
          "arrays",
          "conditionals",
          "loops",
          "exception_handling",
          "games",
          "parsing"
        ]
      },
      {
        "slug": "variable-length-quantity",
        "name": "Variable Length Quantity",
        "uuid": "50050198-b5a3-4ab1-8b4b-0eadc8007ebb",
        "practices": [],
        "prerequisites": [],
        "difficulty": 6,
        "topics": [
          "algorithms",
          "arrays",
          "bitwise_operations",
          "conditionals",
          "loops",
          "exception_handling",
          "lists",
          "transforming"
        ]
      },
      {
        "slug": "largest-series-product",
        "name": "Largest Series Product",
        "uuid": "b646dc26-59c1-436e-883a-20290de7a526",
        "practices": [],
        "prerequisites": [],
        "difficulty": 7,
        "topics": [
          "conditionals",
          "loops",
          "exception_handling",
          "integers",
          "math",
          "regular_expressions",
          "strings"
        ]
      },
      {
        "slug": "food-chain",
        "name": "Food Chain",
        "uuid": "246129c9-83b5-43e0-beb6-8a2cea7e4e17",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "algorithms",
          "text_formatting"
        ]
      },
      {
        "slug": "house",
        "name": "House",
        "uuid": "9850a74a-1842-4db0-b3ed-5a53b4f25050",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "recursion",
          "strings"
        ]
      },
      {
        "slug": "isbn-verifier",
        "name": "ISBN Verifier",
        "uuid": "50447e18-cfe8-43fb-a791-e8a82483bef6",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "conditionals",
          "loops",
          "pattern_recognition",
          "regular_expressions",
          "strings"
        ]
      },
      {
        "slug": "pig-latin",
        "name": "Pig Latin",
        "uuid": "38951bf1-6e7d-4d7d-9b7d-219471f17112",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "conditionals",
          "loops",
          "games",
          "regular_expressions",
          "strings",
          "transforming"
        ]
      },
      {
        "slug": "proverb",
        "name": "Proverb",
        "uuid": "b18876a7-f281-46e5-94b9-f805bb0d1fec",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "optional_values",
          "strings",
          "text_formatting"
        ]
      },
      {
        "slug": "twelve-days",
        "name": "Twelve Days",
        "uuid": "cb04ab17-9611-44a1-8406-ed385da0044d",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "conditionals",
          "loops",
          "pattern_recognition",
          "polymorphism",
          "strings"
        ]
      },
      {
        "slug": "beer-song",
        "name": "Beer Song",
        "uuid": "7a4fefd2-6e71-42d6-82fd-a25d2ef9eae9",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "status": "deprecated",
        "topics": [
          "conditionals",
          "loops",
          "strings"
        ]
      },
      {
        "slug": "say",
        "name": "Say",
        "uuid": "8e7b92f4-a508-4200-bd62-b36281dd9ed9",
        "practices": [],
        "prerequisites": [],
        "difficulty": 6,
        "topics": [
          "conditionals",
          "loops",
          "exception_handling",
          "integers",
          "strings",
          "text_formatting"
        ]
      },
      {
        "slug": "rectangles",
        "name": "Rectangles",
        "uuid": "6d81d98f-afde-4aea-85ff-c7baef98fb7e",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "matrices",
          "strings"
        ]
      },
      {
        "slug": "saddle-points",
        "name": "Saddle Points",
        "uuid": "d35da73a-5124-4911-a2c3-07c68d4b79c2",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "integers",
          "lists",
          "matrices",
          "sets"
        ]
      },
      {
        "slug": "spiral-matrix",
        "name": "Spiral Matrix",
        "uuid": "702b1e87-55db-479f-9ef9-4ccdfe8849b1",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "data_structures",
          "matrices"
        ]
      },
      {
        "slug": "transpose",
        "name": "Transpose",
        "uuid": "4e484e0f-0b24-4778-a949-224294735c23",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "lists",
          "matrices",
          "strings",
          "text_formatting"
        ]
      },
      {
        "slug": "ocr-numbers",
        "name": "OCR Numbers",
        "uuid": "61f0964f-0779-446d-bd6b-6bb988414302",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "conditionals",
          "loops",
          "equality",
          "exception_handling",
          "integers",
          "parsing",
          "text_formatting"
        ]
      },
      {
        "slug": "nth-prime",
        "name": "Nth Prime",
        "uuid": "4c1392d7-8779-496f-b0bb-81605e777e3b",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "algorithms",
          "conditionals",
          "loops",
          "exception_handling",
          "integers",
          "math"
        ]
      },
      {
        "slug": "alphametics",
        "name": "Alphametics",
        "uuid": "7219275b-935b-48ac-8bed-3436221bf3f1",
        "practices": [],
        "prerequisites": [],
        "difficulty": 7,
        "topics": [
          "algorithms",
          "games"
        ]
      },
      {
        "slug": "connect",
        "name": "Connect",
        "uuid": "69cbdc2a-50f4-4e14-b9f4-c1ddee021018",
        "practices": [],
        "prerequisites": [],
        "difficulty": 7,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "games",
          "maps",
          "parsing"
        ]
      },
      {
        "slug": "bowling",
        "name": "Bowling",
        "uuid": "18376dda-8e8d-4cf7-a44a-db71da438e87",
        "practices": [],
        "prerequisites": [],
        "difficulty": 8,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "exception_handling",
          "games",
          "parsing",
          "text_formatting"
        ]
      },
      {
        "slug": "prime-factors",
        "name": "Prime Factors",
        "uuid": "ef38ee9b-39b7-4bb8-9a34-2e19eba92260",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "algorithms",
          "conditionals",
          "loops",
          "integers",
          "math"
        ]
      },
      {
        "slug": "diamond",
        "name": "Diamond",
        "uuid": "df7c1bff-2224-422b-9c34-64b28b09510e",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "exception_handling",
          "games",
          "parsing",
          "text_formatting"
        ]
      },
      {
        "slug": "pascals-triangle",
        "name": "Pascal's Triangle",
        "uuid": "10edb37d-cf5d-443a-bb4c-8831a3986b61",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "conditionals",
          "loops",
          "math"
        ]
      },
      {
        "slug": "binary-search-tree",
        "name": "Binary Search Tree",
        "uuid": "b912fe4f-c505-4bac-8029-76412644375b",
        "practices": [],
        "prerequisites": [],
        "difficulty": 6,
        "topics": [
          "algorithms",
          "conditionals",
          "loops",
          "recursion"
        ]
      },
      {
        "slug": "sublist",
        "name": "Sublist",
        "uuid": "c5ed4703-59cd-4e31-b109-ba5bfc48a578",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "data_structures",
          "lists"
        ]
      },
      {
        "slug": "custom-set",
        "name": "Custom Set",
        "uuid": "e2cfc3b4-5c71-4344-a692-5d55609f097b",
        "practices": [],
        "prerequisites": [],
        "difficulty": 6,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "data_structures",
          "equality",
          "lists",
          "recursion",
          "sets"
        ]
      },
      {
        "slug": "circular-buffer",
        "name": "Circular Buffer",
        "uuid": "759aa79d-975a-4b54-b306-618caba8f201",
        "practices": [],
        "prerequisites": [],
        "difficulty": 8,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "data_structures",
          "exception_handling",
          "lists"
        ]
      },
      {
        "slug": "word-search",
        "name": "Word Search",
        "uuid": "ab16bfad-960d-405b-aba4-afd142330663",
        "practices": [],
        "prerequisites": [],
        "difficulty": 8,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "equality",
          "optional_values",
          "parsing",
          "text_formatting"
        ]
      },
      {
        "slug": "sieve",
        "name": "Sieve",
        "uuid": "f3ad1525-c124-4b2f-b09f-4639eb4a6ad9",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "conditionals",
          "loops",
          "integers",
          "math",
          "recursion"
        ]
      },
      {
        "slug": "palindrome-products",
        "name": "Palindrome Products",
        "uuid": "ffb0ad36-2cf5-46d4-9a5f-5bbdfb9691a7",
        "practices": [],
        "prerequisites": [],
        "difficulty": 7,
        "topics": [
          "algorithms",
          "conditionals",
          "loops",
          "integers",
          "math"
        ]
      },
      {
        "slug": "diffie-hellman",
        "name": "Diffie-Hellman",
        "uuid": "1d12bce3-bfdc-4785-9dc7-0a496d2e6d38",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "algorithms",
          "arrays",
          "conditionals",
          "loops",
          "exception_handling",
          "math"
        ]
      },
      {
        "slug": "robot-simulator",
        "name": "Robot Simulator",
        "uuid": "abe907d0-7ca0-4fe5-83fd-72a4d2acab66",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "conditionals",
          "loops",
          "exception_handling",
          "games",
          "parsing",
          "strings"
        ]
      },
      {
        "slug": "armstrong-numbers",
        "name": "Armstrong Numbers",
        "uuid": "31e1b8ba-a5dd-4806-9a4c-94f7550e25d5",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "algorithms",
          "integers",
          "math"
        ]
      },
      {
        "slug": "run-length-encoding",
        "name": "Run-Length Encoding",
        "uuid": "16c5cf98-c381-46bb-a439-78dbc847c0d0",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2,
        "topics": [
          "conditionals",
          "exception_handling",
          "parsing",
          "pattern_recognition",
          "regular_expressions",
          "strings",
          "text_formatting"
        ]
      },
      {
        "slug": "bank-account",
        "name": "Bank Account",
        "uuid": "3247f8b4-8b80-4c0b-bc3b-779f7a3eb291",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "classes",
          "conditionals"
        ]
      },
      {
        "slug": "eliuds-eggs",
        "name": "Eliud's Eggs",
        "uuid": "2cdf947c-34ed-4ecf-92dd-4c4e6c21f9f3",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3
      },
      {
        "slug": "bottle-song",
        "name": "Bottle Song",
        "uuid": "6bcfe2b6-e555-4c90-8c80-168730dd5ad3",
        "practices": [],
        "prerequisites": [],
        "difficulty": 3,
        "topics": [
          "conditionals",
          "loops",
          "strings"
        ]
      },
      {
        "slug": "rotational-cipher",
        "name": "Rotational Cipher",
        "uuid": "dbe39983-5635-4369-89a3-fd549144259b",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "strings",
          "iterators"
        ]
      },
      {
        "slug": "strain",
        "name": "Strain",
        "uuid": "160c31bd-814c-4de7-8af5-7cd223763da8",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": [
          "algorithms",
          "arrays",
          "callbacks",
          "conditionals",
          "loops",
          "filtering",
          "lists"
        ]
      },
      {
        "slug": "accumulate",
        "name": "Accumulate",
        "uuid": "32953258-d488-4761-9669-895a359a8b9a",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "status": "deprecated",
        "topics": [
          "algorithms",
          "callbacks",
          "conditionals",
          "lists"
        ]
      },
      {
        "slug": "all-your-base",
        "name": "All Your Base",
        "uuid": "0f4f98fe-245a-4842-b3cf-6581b89afd44",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "conditionals",
          "loops",
          "exception_handling",
          "integers",
          "math",
          "parsing"
        ]
      },
      {
        "slug": "flatten-array",
        "name": "Flatten Array",
        "uuid": "ebe8227e-f445-4387-bf9f-54d4d9730142",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "arrays",
          "lists",
          "loops",
          "recursion"
        ]
      },
      {
        "slug": "matching-brackets",
        "name": "Matching Brackets",
        "uuid": "b455f96b-329d-4dec-ac31-599b02c0b2e5",
        "practices": [],
        "prerequisites": [],
        "difficulty": 5,
        "topics": [
          "parsing",
          "stacks",
          "strings"
        ]
      },
      {
        "slug": "tournament",
        "name": "Tournament",
        "uuid": "f4634d37-2357-4b54-8cd8-ad450234537a",
        "practices": [
          "string-formatting"
        ],
        "prerequisites": [
          "strings",
          "string-formatting"
        ],
        "difficulty": 6
      },
      {
        "slug": "flower-field",
        "name": "Flower Field",
        "uuid": "f1c96aaa-0944-4a11-83df-9f3a4f5417f0",
        "practices": [],
        "prerequisites": [],
        "difficulty": 7,
        "topics": [
          "algorithms",
          "arrays",
          "games"
        ]
      },
      {
        "slug": "minesweeper",
        "name": "Minesweeper",
        "uuid": "f5b00e76-3015-444d-8012-9862990db08c",
        "practices": [],
        "prerequisites": [],
        "difficulty": 7,
        "status": "deprecated",
        "topics": [
          "algorithms",
          "arrays",
          "games"
        ]
      },
      {
        "slug": "kindergarten-garden",
        "name": "Kindergarten Garden",
        "uuid": "d70d3579-999c-452c-9243-98908e24b47e",
        "practices": [],
        "prerequisites": [],
        "difficulty": 7,
        "topics": [
          "arrays",
          "conditionals",
          "loops",
          "strings",
          "text_formatting"
        ]
      },
      {
        "slug": "queen-attack",
        "name": "Queen Attack",
        "uuid": "837fbe57-a567-4fc7-a7a2-8b63059ac8b7",
        "practices": [],
        "prerequisites": [],
        "difficulty": 8,
        "topics": [
          "conditionals",
          "loops",
          "equality",
          "exception_handling",
          "optional_values",
          "parsing",
          "text_formatting"
        ]
      },
      {
        "slug": "react",
        "name": "React",
        "uuid": "6ad78102-09cc-4aeb-bfa7-58ba3dba57f3",
        "practices": [],
        "prerequisites": [],
        "difficulty": 8,
        "topics": [
          "algorithms",
          "closures",
          "reactive_programming"
        ]
      },
      {
        "slug": "crypto-square",
        "name": "Crypto Square",
        "uuid": "e92b7444-a5c3-4452-82fd-8c70cf14085a",
        "practices": [],
        "prerequisites": [],
        "difficulty": 9,
        "topics": [
          "algorithms",
          "arrays",
          "conditionals",
          "loops",
          "regular_expressions",
          "sorting",
          "text_formatting",
          "transforming"
        ]
      },
      {
        "slug": "knapsack",
        "name": "Knapsack",
        "uuid": "b80ebb8d-9416-4fc8-91ee-3db99411810c",
        "practices": [],
        "prerequisites": [],
        "difficulty": 9,
        "topics": [
          "algorithms"
        ]
      },
      {
        "slug": "game-of-life",
        "name": "Conway's Game of Life",
        "uuid": "c338cbce-fad4-4de0-bf0d-4a90803a0fe9",
        "practices": [],
        "prerequisites": [],
        "difficulty": 2
      },
      {
        "slug": "yacht",
        "name": "Yacht",
        "uuid": "06ac7eed-1417-4510-b526-eb068af21ad9",
        "practices": [],
        "prerequisites": [],
        "difficulty": 4,
        "topics": ["arrays", "conditionals", "filtering", "games"]
      }
    ]
  },
  "concepts": [
    {
      "uuid": "6b93ea93-3312-4aee-ad6f-3f8b034e92d9",
      "slug": "basics",
      "name": "Basics"
    }
  ],
  "key_features": [
    {
      "title": "Evolving",
      "content": "Typescript is a modern and constantly evolving open-source language supported by Microsoft.",
      "icon": "evolving"
    },
    {
      "title": "Widely used",
      "content": "TypeScript is used by many libraries and frameworks, and integrates with JavaScript code as well.",
      "icon": "widely-used"
    },
    {
      "title": "Typed JavaScript",
      "content": "Typescript flexible typing system lets you describe what to expect, supporting gradual adoption.",
      "icon": "dynamically-typed"
    },
    {
      "title": "Use any programming style",
      "content": "Use prototype-based, object-oriented, functional, or declarative programming styles, and more.",
      "icon": "multi-paradigm"
    },
    {
      "title": "Consistently Good Tooling",
      "content": "TS's JavaScript integration is handled by the language itself, enabling its tools and features.",
      "icon": "tooling"
    },
    {
      "title": "Large Community",
      "content": "The large number of users makes it easy to find answers, documentation, and libraries.",
      "icon": "community"
    }
  ],
  "tags": [
    "execution_mode/compiled",
    "paradigm/declarative",
    "paradigm/functional",
    "paradigm/imperative",
    "paradigm/object_oriented",
    "platform/android",
    "platform/ios",
    "platform/linux",
    "platform/mac",
    "platform/web",
    "platform/windows",
    "runtime/language_specific",
    "runtime/wasmtime",
    "typing/dynamic",
    "typing/static",
    "typing/strong",
    "typing/weak",
    "used_for/artificial_intelligence",
    "used_for/backends",
    "used_for/cross_platform_development",
    "used_for/frontends",
    "used_for/games",
    "used_for/guis",
    "used_for/mobile",
    "used_for/web_development"
  ]
}


================================================
FILE: docs/ABOUT.md
================================================
# About

[TypeScript](https://www.typescriptlang.org/) (TS) is a superset of JavaScript (JS), created at Microsoft
in response to frustration developing large-scale applications in JS. In a large JS project, knowing
what properties your own objects have, what arguments your functions take (and what type they need to be)
can become difficult. Similarly, since there is no ability to intelligently inspect JS code, when you include
a package (like from `npm`), you have to keep the documentation up so you know what methods are available and
what arguments they take. TS solves these issues. It is currently an open-source project hosted on Github.
It supports tools for any browser as well as Node, for any host, on any OS. TS compiles to readable,
standards-based JavaScript.

TS adds a flexible type system to JS, in addition to interfaces (custom types) and modifying the syntax of
some ECMAScript features such as classes. Types are optional and flexible (for example, you can specify an
argument is a string OR a number). Types allow tooling available in most code editors that improve the
development experience such as code completion and method detection, both in your own code and in packages
you use. It supports many upcoming ECMAScript features (such as async/await). TS can be written in Object Oriented or Functional
styles. It is compatible with all existing JS packages. TS transpiles to clean, readable JS.

Try it out at the [playground](https://www.typescriptlang.org/play), and stay up to date via [the Typescript blog](https://devblogs.microsoft.com/typescript/) and [Twitter account](https://twitter.com/typescript).


================================================
FILE: docs/INSTALLATION.md
================================================
# Installation

You need [NodeJS LTS](https://nodejs.org/en).

> 💡 This track likely works with older stable versions, as well as the "current" version.
> However, [by design](https://github.com/nodejs/release#release-schedule), odd versions are never stable.
> Always make sure you install an even version of NodeJS.

Install [Yarn 4+](https://yarnpkg.com/getting-started/install) using Node.JS `corepack`:

```shell
corepack enable yarn
```

## Checking your installation

You generally need to open a new terminal in order to use binaries you've just installed.

```shell
$ node -v
v20.15.0

$ corepack -v
0.28.1

$ corepack yarn -v
v4.3.1
```

_Note: your versions will likely differ from this._

## Assignment installation

**Each assignment** needs some tools to run the tests:

They can be installed running this command within each assignment directory:

```bash
$ corepack yarn install
```

Depending on your editor, the [Editor SDK](https://yarnpkg.com/getting-started/editor-sdks) needs to be installed in each assignment, in order to work with Plug'n'Play installs.
At moment of writing the following are supported:

- [CoC nvim](https://yarnpkg.com/getting-started/editor-sdks#coc-nvim)
- [Emacs](https://yarnpkg.com/getting-started/editor-sdks#emacs)
- [Neovim Native LSP](https://yarnpkg.com/getting-started/editor-sdks#neovim-native-lsp)
- [VSCode](https://yarnpkg.com/getting-started/editor-sdks#vscode)

For example, if using VSCode, the commands you run are:

```shell
$ corepack yarn install

➤ YN0000: · Yarn 4.3.1
➤ YN0000: ┌ Resolution step
➤ YN0000: └ Completed
➤ YN0000: ┌ Post-resolution validation
➤ YN0060: │ # [...]
➤ YN0000: └ Completed
➤ YN0000: ┌ Fetch step
➤ YN0000: └ Completed in 0s 566ms
➤ YN0000: ┌ Link step
➤ YN0000: │ ESM support for PnP uses the experimental loader API and is therefore experimental
➤ YN0000: └ Completed
➤ YN0000: · Done with warnings in 0s 768ms

$ corepack yarn dlx @yarnpkg/sdks vscode

➤ YN0000: · Yarn 4.3.1
➤ YN0000: ┌ Resolution step
➤ YN0085: │ + @yarnpkg/sdks@npm:3.1.3, and 103 more.
➤ YN0000: └ Completed in 0s 509ms
➤ YN0000: ┌ Fetch step
➤ YN0013: │ 104 packages were added to the project (+ 2.87 MiB).
➤ YN0000: └ Completed
➤ YN0000: ┌ Link step
➤ YN0000: └ Completed in 0s 270ms
➤ YN0000: · Done in 0s 881ms

➤ YN0000: Cleaning up the existing SDK files...
➤ YN0000: ┌ Generating SDKs inside .yarn/sdks
➤ YN0000: │ ✓ Eslint
➤ YN0000: │ ✓ Prettier
➤ YN0000: │ ✓ Typescript
➤ YN0000: │ • 5 SDKs were skipped based on your root dependencies
➤ YN0000: └ Completed
➤ YN0000: ┌ Generating settings
➤ YN0000: │ ✓ Vscode (updated 🔼)
➤ YN0000: └ Completed
```

You must run install _inside the exercise directory_ before you are able to run the tests.
[Yarn 4 PnP](https://yarnpkg.com/features/pnp/) is enabled, installing the dependencies in each exercise directory does NOT install a complete copy of all the dependencies.

If your editor is showing errors for `eslint`, `prettier`, or `typescript` afterwards, reload the window or reopen the editor.


================================================
FILE: docs/LEARNING.md
================================================
# Learning

If you want to learn Typescript, check out the following resources.

- [TS Tutorial](https://www.typescriptlang.org/docs/handbook/release-notes/overview.html)
- [TS Playground](https://www.typescriptlang.org/play)

TypeScript is a superset of JS.
TypeScript offers all of JavaScript’s features, and an additional layer on top of these: TypeScript’s type system.

- [Exploring ES6](https://leanpub.com/exploring-es6) book, by Axel Rauschmayer
- [ES6 Katas](https://jskatas.org/#bundle-es6-katas) website
- [Babel compiler](https://github.com/babel/babel)


================================================
FILE: docs/RESOURCES.md
================================================
# Resources

## Recommended References

- [TypeScript QuickStart](https://www.typescriptlang.org/docs/handbook/release-notes/overview.html)
- [TypeScript Playground](https://www.typescriptlang.org/play)

- [ECMAScript 2015 Language Specification](https://www.ecma-international.org/wp-content/uploads/ECMA-262_6th_edition_june_2015.pdf) (pdf)
- [Mozilla JavaScript Reference](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference)

## Editors

### Free/Open-Source

- [VS Code](https://code.visualstudio.com)

  VS Code is an open-source code editor. You can find information on how to set up TypeScript [here](https://code.visualstudio.com/docs/languages/typescript). VS Code is a popular editor for TypeScript because Microsoft maintains both VS Code and TypeScript, so it works well with the language; VS Code supports TS without any extra configuration. In fact, VS Code was written using TypeScript!

  A common issue with VS Code and TS is when your editor and project versions are different, which can cause VS Code to display a possibly confusing error message. Instructions on how to handle this error are [here](https://code.visualstudio.com/docs/typescript/typescript-compiling#_using-newer-typescript-versions)

### Licensed

- [Sublime Text](https://www.sublimetext.com)

  Sublime Text is a popular code editor with support for most languages through installable plugins. It is free to try, but you will be regularly prompted to buy a license, which currently costs \$70 USD.

- [WebStorm](https://www.jetbrains.com/webstorm/)

  WebStorm is a fully-featured JavaScript/TypeScript IDE (Integrated Development Environment). It supports TypeScript with no extra configuration and has integrated testing, debugging and code analysis. It is free to try for 30 days, then an annual license costs \$129 USD for the first year.


================================================
FILE: docs/SNIPPET.txt
================================================

export class HelloWorld {
  static hello(name = 'World'): string {
    return `Hello, ${name}!`
  }
}


================================================
FILE: docs/TESTS.md
================================================
# Tests

Before trying to execute the tests, ensure the assignment folder is set-up correctly by following the installation steps, namely `corepack yarn install` and the Editor SDK setup.

Execute the tests with:

```bash
$ corepack yarn test
```

Be sure your code follows best practices, as other users do, with eslint, a tool to perform static analysis to your code.
Tools like this save you some time detecting typos or silly mistakes in your code:

```bash
$ corepack yarn lint
```

Or do both at the same time:

```bash
$ corepack yarn test && corepack yarn lint
```

The TypeScript track on Exercism does not enforce code _style_, so you're free to choose between semicolons, tabs vs spaces, and everything in-between.

## Making Your First Module

Usually, tests on this track will load your implementation importing it as a module: `import Bob from './bob';`.
To make it work, you need to export your implementation from the file the tests are looking for your module, `bob.ts`:

```typescript
export class Bob {
  public hey(message: string) {
    // Your solution here
  }
}
```

We've provided stubs in each exercise and placed this `export` in there for you.


================================================
FILE: docs/config.json
================================================
{
  "docs": [
    {
      "uuid": "c79ecacf-6b92-4033-9f25-1f86e7299760",
      "slug": "installation",
      "path": "docs/INSTALLATION.md",
      "title": "Installing TypeScript locally",
      "blurb": "Learn how to install TypeScript locally to solve Exercism's exercises on your own machine"
    },
    {
      "uuid": "d5553e1b-8432-4b27-a855-d060e830636d",
      "slug": "learning",
      "path": "docs/LEARNING.md",
      "title": "How to learn TypeScript",
      "blurb": "An overview of how to get started from scratch with TypeScript"
    },
    {
      "uuid": "bef8b724-0569-4ad9-8e00-5daff3c17057",
      "slug": "tests",
      "path": "docs/TESTS.md",
      "title": "Testing on the TypeScript track",
      "blurb": "Learn how to test your TypeScript exercises on Exercism"
    },
    {
      "uuid": "4d00c4da-0f99-4d0c-9a43-aca47128e4fb",
      "slug": "resources",
      "path": "docs/RESOURCES.md",
      "title": "Useful TypeScript resources",
      "blurb": "A collection of useful resources to help you master TypeScript"
    }
  ]
}


================================================
FILE: eslint.config.mjs
================================================
// @ts-check

import tsEslint from 'typescript-eslint'
import config from '@exercism/eslint-config-typescript'
import maintainersConfig from '@exercism/eslint-config-typescript/maintainers.mjs'

import globals from 'globals'

export default [
  ...tsEslint.config(
    ...config,
    {
      files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],
      extends: maintainersConfig,
    },
    {
      files: ['scripts/**/*.mjs'],
      languageOptions: {
        globals: {
          ...globals.node,
        },
      },
    }
  ),
  {
    ignores: [
      // # Protected or generated
      '/.appends/**/*',
      '/.github/**/*',
      '/.vscode/**/*',
      '/.yarn/**/*',
      '/common/.vscode/**/*',
      '/common/.yarn/**/*',

      // # Binaries
      '/bin/*',

      // # Configuration
      '/config',
      '/babel.config.cjs',
    ],
  },
]


================================================
FILE: exercises/concept/.keep
================================================


================================================
FILE: exercises/concept/lasagna/.docs/hints.md
================================================
# Hints

## 1. Define the expected oven time in minutes

- Define a [constant][constants] which should contain the [`number`][numbers] value specified in the recipe.
- [`export`][export] the constant.

## 2. Calculate the remaining oven time in minutes

- [Explicitly return a number][return] from the function.
- Use the [mathematical operator for subtraction][operators] to subtract values.

## 3. Calculate the preparation time in minutes

- [Explicitly return a number][return] from the function.
- Use the [mathematical operator for multiplication][operators] to multiply values.
- Use the extra constant for the time in minutes per layer.

## 4. Calculate the total working time in minutes

- [Explicitly return a number][return] from the function.
- [Invoke][invocation] one of the other methods implemented previously.
- Use the [mathematical operator for addition][operators] to add values.

[return]: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Return_values
[export]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export
[operators]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators
[constants]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
[invocation]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions#Calling_functions
[numbers]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type


================================================
FILE: exercises/concept/lasagna/.docs/instructions.md
================================================
# Instructions

Lucian's girlfriend is on her way home, and he hasn't cooked their anniversary dinner!

In this exercise, you're going to write some code to help Lucian cook an exquisite lasagna from his favorite cookbook.

You have four tasks related to the time spent cooking the lasagna.

## 1. Define the expected oven time in minutes

Define the `EXPECTED_MINUTES_IN_OVEN` constant that represents how many minutes the lasagna should be in the oven. It must be exported. According to the cooking book, the expected oven time in minutes is `40`.

## 2. Calculate the remaining oven time in minutes

Implement the `remainingMinutesInOven` function that takes the actual minutes the lasagna has been in the oven as a _parameter_ and _returns_ how many minutes the lasagna still has to remain in the oven, based on the **expected oven time in minutes** from the previous task.

```javascript
remainingMinutesInOven(30)
// => 10
```

## 3. Calculate the preparation time in minutes

Implement the `preparationTimeInMinutes` function that takes the number of layers you added to the lasagna as a _parameter_ and _returns_ how many minutes you spent preparing the lasagna, assuming each layer takes you 2 minutes to prepare.

```javascript
preparationTimeInMinutes(2)
// => 4
```

## 4. Calculate the total working time in minutes

Implement the `totalTimeInMinutes` function that takes _two parameters_: the `numberOfLayers` parameter is the number of layers you added to the lasagna, and the `actualMinutesInOven` parameter is the number of minutes the lasagna has been in the oven. The function should _return_ how many minutes in total you've worked on cooking the lasagna, which is the sum of the preparation time in minutes, and the time in minutes the lasagna has spent in the oven at the moment.

```javascript
totalTimeInMinutes(3, 20)
// => 26
```


================================================
FILE: exercises/concept/lasagna/.docs/introduction.md
================================================
# Introduction

JavaScript is a dynamic language, supporting object-oriented, imperative, and declarative (e.g. functional programming) styles.

## (Re-)Assignment

There are a few primary ways to assign values to names in JavaScript - using variables or constants. On Exercism, variables are always written in [camelCase][wiki-camel-case]; constants are written in [SCREAMING_SNAKE_CASE][wiki-snake-case]. There is no official guide to follow, and various companies and organizations have various style guides. _Feel free to write variables any way you like_. The upside from writing them the way the exercises are prepared is that they'll be highlighted differently in the web interface and most IDEs.

Variables in JavaScript can be defined using the [`const`][mdn-const], [`let`][mdn-let] or [`var`][mdn-var] keyword.

A variable can reference different values over its lifetime when using `let` or `var`. For example, `myFirstVariable` can be defined and redefined many times using the assignment operator `=`:

```javascript
let myFirstVariable = 1
myFirstVariable = 'Some string'
myFirstVariable = new SomeComplexClass()
```

In contrast to `let` and `var`, variables that are defined with `const` can only be assigned once. This is used to define constants in JavaScript.

```javascript
const MY_FIRST_CONSTANT = 10

// Can not be re-assigned.
MY_FIRST_CONSTANT = 20
// => TypeError: Assignment to constant variable.
```

> 💡 In a later Concept Exercise the difference between _constant_ assignment / binding and _constant_ value is explored and explained.

## Function Declarations

In JavaScript, units of functionality are encapsulated in _functions_, usually grouping functions together in the same file if they belong together. These functions can take parameters (arguments), and can _return_ a value using the `return` keyword. Functions are invoked using `()` syntax.

```javascript
function add(num1, num2) {
  return num1 + num2
}

add(1, 3)
// => 4
```

> 💡 In JavaScript there are _many_ different ways to declare a function. These other ways look different than using the `function` keyword. The track tries to gradually introduce them, but if you already know about them, feel free to use any of them. In most cases, using one or the other isn't better or worse.

## Exposing to Other Files

To make a `function`, a constant, or a variable available in _other files_, they need to be [exported][mdn-export] using the `export` keyword. Another file may then [import][mdn-import] these using the `import` keyword. This is also known as the module system. A great example is how all the tests work. Each exercise has at least one file, for example `lasagna.js`, which contains the _implementation_. Additionally there is at least one other file, for example `lasagna.spec.js`, that contains the _tests_. This file _imports_ the public (i.e. exported) entities in order to test the implementation:

```javascript
// file.js
export const MY_VALUE = 10

export function add(num1, num2) {
  return num1 + num2
}

// file.spec.js
import { MY_VALUE, add } from './file'

add(MY_VALUE, 5)
// => 15
```

[mdn-const]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
[mdn-export]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export
[mdn-import]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
[mdn-let]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
[mdn-var]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var
[wiki-camel-case]: https://en.wikipedia.org/wiki/Camel_case
[wiki-snake-case]: https://en.wikipedia.org/wiki/Snake_case


================================================
FILE: exercises/concept/lasagna/.meta/config.json
================================================
{
  "authors": ["SleeplessByte"],
  "files": {
    "solution": [
      "lasagna.ts"
    ],
    "test": [
      "__typetests__/lasagna.tst.ts",
      "lasagna.test.ts"
    ],
    "exemplar": [
      ".meta/exemplar.ts"
    ]
  },
  "forked_from": [
    "javascript/lasagna"
  ],
  "blurb": "Learn the basics of TypeScript cooking a brilliant lasagna from your favorite cooking book.",
  "custom": {
    "version.tests.compatibility": "jest-29",
    "flag.tests.task-per-describe": true,
    "flag.tests.may-run-long": false,
    "flag.tests.includes-optional": false,
    "flag.tests.jest": true,
    "flag.tests.tstyche": true
  }
}


================================================
FILE: exercises/concept/lasagna/.meta/design.md
================================================
# Design

## Learning objectives

- Know what a variable is.
- Know what a constant variable is.
- Know how to define a variable.
- Know how to export a variable
- Know how to return a value from a function (explicit return).
- Know how to annotate a
Download .txt
gitextract_nny146az/

├── .appends/
│   └── .github/
│       └── labels.yml
├── .dependabot/
│   └── config.yml
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── dependabot.yml
│   ├── labels.yml
│   └── workflows/
│       ├── action-format.yml
│       ├── action-sync.yml
│       ├── ci.js.yml
│       ├── codeql.yml
│       ├── configlet.yml
│       ├── no-important-files-changed.yml
│       ├── pause-community-contributions.yml
│       ├── ping-cross-track-maintainers-team.yml
│       ├── pr.ci.js.yml
│       ├── run-configlet-sync.yml
│       ├── sync-labels.yml
│       └── verify-code-formatting.yml
├── .gitignore
├── .prettierignore
├── .prettierrc
├── .vscode/
│   ├── extensions.json
│   └── settings.json
├── .yarn/
│   └── sdks/
│       ├── eslint/
│       │   ├── bin/
│       │   │   └── eslint.js
│       │   ├── lib/
│       │   │   ├── api.js
│       │   │   └── unsupported-api.js
│       │   └── package.json
│       ├── integrations.yml
│       ├── prettier/
│       │   ├── bin/
│       │   │   └── prettier.cjs
│       │   ├── index.cjs
│       │   └── package.json
│       └── typescript/
│           ├── bin/
│           │   ├── tsc
│           │   └── tsserver
│           ├── lib/
│           │   ├── tsc.js
│           │   ├── tsserver.js
│           │   ├── tsserverlibrary.js
│           │   └── typescript.js
│           └── package.json
├── .yarnrc.yml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── TAGS.md
├── babel.config.cjs
├── bin/
│   ├── check-formatting.sh
│   ├── fetch-configlet
│   ├── fetch-configlet.ps1
│   ├── format.sh
│   ├── generate-config-tree
│   ├── md5-hash
│   └── print-config-tree
├── common/
│   ├── .vscode/
│   │   ├── extensions.json
│   │   └── settings.json
│   ├── .yarnrc.yml
│   ├── babel.config.cjs
│   ├── eslint.config.mjs
│   ├── jest.config.cjs
│   ├── keep.ts
│   ├── package.json
│   ├── test-runner.mjs
│   └── tsconfig.json
├── concepts/
│   ├── .keep
│   └── basics/
│       ├── .meta/
│       │   └── config.json
│       ├── about.md
│       ├── introduction.md
│       └── links.json
├── config.json
├── docs/
│   ├── ABOUT.md
│   ├── INSTALLATION.md
│   ├── LEARNING.md
│   ├── RESOURCES.md
│   ├── SNIPPET.txt
│   ├── TESTS.md
│   └── config.json
├── eslint.config.mjs
├── exercises/
│   ├── concept/
│   │   ├── .keep
│   │   └── lasagna/
│   │       ├── .docs/
│   │       │   ├── hints.md
│   │       │   ├── instructions.md
│   │       │   └── introduction.md
│   │       ├── .meta/
│   │       │   ├── config.json
│   │       │   ├── design.md
│   │       │   └── exemplar.ts
│   │       ├── .vscode/
│   │       │   ├── extensions.json
│   │       │   └── settings.json
│   │       ├── .yarnrc.yml
│   │       ├── __typetests__/
│   │       │   └── lasagna.tst.ts
│   │       ├── babel.config.cjs
│   │       ├── eslint.config.mjs
│   │       ├── jest.config.cjs
│   │       ├── lasagna.test.ts
│   │       ├── lasagna.ts
│   │       ├── package.json
│   │       ├── test-runner.mjs
│   │       └── tsconfig.json
│   ├── practice/
│   │   ├── accumulate/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   └── proof.ci.ts
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── accumulate.test.ts
│   │   │   ├── accumulate.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── acronym/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── acronym.test.ts
│   │   │   ├── acronym.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── all-your-base/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── all-your-base.test.ts
│   │   │   ├── all-your-base.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── allergies/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── allergies.test.ts
│   │   │   ├── allergies.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── alphametics/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── alphametics.test.ts
│   │   │   ├── alphametics.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── anagram/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.append.md
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── anagram.test.ts
│   │   │   ├── anagram.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── armstrong-numbers/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── armstrong-numbers.test.ts
│   │   │   ├── armstrong-numbers.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── atbash-cipher/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── atbash-cipher.test.ts
│   │   │   ├── atbash-cipher.ts
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── bank-account/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   ├── solutions/
│   │   │   │   │   └── bank-account.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── bank-account.test.ts
│   │   │   ├── bank-account.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── beer-song/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── beer-song.test.ts
│   │   │   ├── beer-song.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── binary-search/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── binary-search.test.ts
│   │   │   ├── binary-search.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── binary-search-tree/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── binary-search-tree.test.ts
│   │   │   ├── binary-search-tree.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── bob/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── description.md
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── bob.test.ts
│   │   │   ├── bob.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── bottle-song/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── bottle-song.test.ts
│   │   │   ├── bottle-song.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── bowling/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── bowling.test.ts
│   │   │   ├── bowling.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── camicia/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── camicia.test.ts
│   │   │   ├── camicia.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── circular-buffer/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── circular-buffer.test.ts
│   │   │   ├── circular-buffer.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── clock/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── clock.test.ts
│   │   │   ├── clock.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── collatz-conjecture/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── collatz-conjecture.test.ts
│   │   │   ├── collatz-conjecture.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── complex-numbers/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── complex-numbers.test.ts
│   │   │   ├── complex-numbers.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── connect/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── connect.test.ts
│   │   │   ├── connect.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── crypto-square/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── crypto-square.test.ts
│   │   │   ├── crypto-square.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── custom-set/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── custom-set.test.ts
│   │   │   ├── custom-set.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── darts/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── darts.test.ts
│   │   │   ├── darts.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── diamond/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── diamond.test.ts
│   │   │   ├── diamond.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── difference-of-squares/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── difference-of-squares.test.ts
│   │   │   ├── difference-of-squares.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── diffie-hellman/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── diffie-hellman.test.ts
│   │   │   ├── diffie-hellman.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── dnd-character/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── dnd-character.test.ts
│   │   │   ├── dnd-character.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── eliuds-eggs/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eliuds-eggs.test.ts
│   │   │   ├── eliuds-eggs.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── etl/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── etl.test.ts
│   │   │   ├── etl.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── flatten-array/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── flatten-array.test.ts
│   │   │   ├── flatten-array.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── flower-field/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── flower-field.test.ts
│   │   │   ├── flower-field.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── food-chain/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── food-chain.test.ts
│   │   │   ├── food-chain.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── game-of-life/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── game-of-life.test.ts
│   │   │   ├── game-of-life.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── gigasecond/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── gigasecond.test.ts
│   │   │   ├── gigasecond.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── grade-school/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── grade-school.test.ts
│   │   │   ├── grade-school.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── grains/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── grains.test.ts
│   │   │   ├── grains.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── hamming/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── hamming.test.ts
│   │   │   ├── hamming.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── hello-world/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.append.md
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── hello-world.test.ts
│   │   │   ├── hello-world.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── house/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── house.test.ts
│   │   │   ├── house.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── isbn-verifier/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── isbn-verifier.test.ts
│   │   │   ├── isbn-verifier.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── isogram/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── isogram.test.ts
│   │   │   ├── isogram.ts
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── kindergarten-garden/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── kindergarten-garden.test.ts
│   │   │   ├── kindergarten-garden.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── knapsack/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── knapsack.test.ts
│   │   │   ├── knapsack.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── largest-series-product/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── largest-series-product.test.ts
│   │   │   ├── largest-series-product.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── leap/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── leap.test.ts
│   │   │   ├── leap.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── line-up/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── line-up.test.ts
│   │   │   ├── line-up.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── linked-list/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   └── proof.ci.ts
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── linked-list.test.ts
│   │   │   ├── linked-list.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── list-ops/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.append.md
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── list-ops.test.ts
│   │   │   ├── list-ops.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── luhn/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── luhn.test.ts
│   │   │   ├── luhn.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── matching-brackets/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── matching-brackets.test.ts
│   │   │   ├── matching-brackets.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── matrix/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── matrix.test.ts
│   │   │   ├── matrix.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── minesweeper/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── minesweeper.test.ts
│   │   │   ├── minesweeper.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── nth-prime/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── nth-prime.test.ts
│   │   │   ├── nth-prime.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── nucleotide-count/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── nucleotide-count.test.ts
│   │   │   ├── nucleotide-count.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── ocr-numbers/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── ocr-numbers.test.ts
│   │   │   ├── ocr-numbers.ts
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── palindrome-products/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── palindrome-products.test.ts
│   │   │   ├── palindrome-products.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── pangram/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── pangram.test.ts
│   │   │   ├── pangram.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── pascals-triangle/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── pascals-triangle.test.ts
│   │   │   ├── pascals-triangle.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── perfect-numbers/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── perfect-numbers.test.ts
│   │   │   ├── perfect-numbers.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── phone-number/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── phone-number.test.ts
│   │   │   ├── phone-number.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── pig-latin/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── pig-latin.test.ts
│   │   │   ├── pig-latin.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── prime-factors/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── prime-factors.test.ts
│   │   │   ├── prime-factors.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── prism/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── prism.test.ts
│   │   │   ├── prism.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── protein-translation/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── protein-translation.test.ts
│   │   │   ├── protein-translation.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── proverb/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── proverb.test.ts
│   │   │   ├── proverb.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── pythagorean-triplet/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── pythagorean-triplet.test.ts
│   │   │   ├── pythagorean-triplet.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── queen-attack/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.append.md
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── queen-attack.test.ts
│   │   │   ├── queen-attack.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── raindrops/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── raindrops.test.ts
│   │   │   ├── raindrops.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── rational-numbers/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── rational-numbers.test.ts
│   │   │   ├── rational-numbers.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── react/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── react.test.ts
│   │   │   ├── react.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── rectangles/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── rectangles.test.ts
│   │   │   ├── rectangles.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── relative-distance/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── relative-distance.test.ts
│   │   │   ├── relative-distance.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── resistor-color/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── resistor-color.test.ts
│   │   │   ├── resistor-color.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── resistor-color-duo/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── resistor-color-duo.test.ts
│   │   │   ├── resistor-color-duo.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── resistor-color-trio/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── resistor-color-trio.test.ts
│   │   │   ├── resistor-color-trio.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── reverse-string/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── reverse-string.test.ts
│   │   │   ├── reverse-string.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── rna-transcription/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── rna-transcription.test.ts
│   │   │   ├── rna-transcription.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── robot-name/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   └── proof.ci.ts
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── robot-name.test.ts
│   │   │   ├── robot-name.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── robot-simulator/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── robot-simulator.test.ts
│   │   │   ├── robot-simulator.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── roman-numerals/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── roman-numerals.test.ts
│   │   │   ├── roman-numerals.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── rotational-cipher/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── rotational-cipher.test.ts
│   │   │   ├── rotational-cipher.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── run-length-encoding/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── run-length-encoding.test.ts
│   │   │   ├── run-length-encoding.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── saddle-points/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── saddle-points.test.ts
│   │   │   ├── saddle-points.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── say/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── say.test.ts
│   │   │   ├── say.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── scrabble-score/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── scrabble-score.test.ts
│   │   │   ├── scrabble-score.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── secret-handshake/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── secret-handshake.test.ts
│   │   │   ├── secret-handshake.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── series/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── series.test.ts
│   │   │   ├── series.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── sieve/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── sieve.test.ts
│   │   │   ├── sieve.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── simple-cipher/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── simple-cipher.test.ts
│   │   │   ├── simple-cipher.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── space-age/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── space-age.test.ts
│   │   │   ├── space-age.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── spiral-matrix/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── spiral-matrix.test.ts
│   │   │   ├── spiral-matrix.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── split-second-stopwatch/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── split-second-stopwatch.test.ts
│   │   │   ├── split-second-stopwatch.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── square-root/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── square-root.test.ts
│   │   │   ├── square-root.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── state-of-tic-tac-toe/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── state-of-tic-tac-toe.test.ts
│   │   │   ├── state-of-tic-tac-toe.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── strain/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── strain.test.ts
│   │   │   ├── strain.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── sublist/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── sublist.test.ts
│   │   │   ├── sublist.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── sum-of-multiples/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── sum-of-multiples.test.ts
│   │   │   ├── sum-of-multiples.ts
│   │   │   ├── test-runner.mjs
│   │   │   └── tsconfig.json
│   │   ├── tournament/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tournament.test.ts
│   │   │   ├── tournament.ts
│   │   │   └── tsconfig.json
│   │   ├── transpose/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── transpose.test.ts
│   │   │   ├── transpose.ts
│   │   │   └── tsconfig.json
│   │   ├── triangle/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── triangle.test.ts
│   │   │   ├── triangle.ts
│   │   │   └── tsconfig.json
│   │   ├── twelve-days/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── twelve-days.test.ts
│   │   │   └── twelve-days.ts
│   │   ├── two-bucket/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── two-bucket.test.ts
│   │   │   └── two-bucket.ts
│   │   ├── two-fer/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── two-fer.test.ts
│   │   │   └── two-fer.ts
│   │   ├── variable-length-quantity/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── variable-length-quantity.test.ts
│   │   │   └── variable-length-quantity.ts
│   │   ├── word-count/
│   │   │   ├── .docs/
│   │   │   │   ├── instructions.md
│   │   │   │   └── introduction.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── word-count.test.ts
│   │   │   └── word-count.ts
│   │   ├── word-search/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── word-search.test.ts
│   │   │   └── word-search.ts
│   │   ├── wordy/
│   │   │   ├── .docs/
│   │   │   │   └── instructions.md
│   │   │   ├── .meta/
│   │   │   │   ├── config.json
│   │   │   │   ├── proof.ci.ts
│   │   │   │   └── tests.toml
│   │   │   ├── .vscode/
│   │   │   │   ├── extensions.json
│   │   │   │   └── settings.json
│   │   │   ├── .yarnrc.yml
│   │   │   ├── babel.config.cjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.cjs
│   │   │   ├── package.json
│   │   │   ├── test-runner.mjs
│   │   │   ├── tsconfig.json
│   │   │   ├── wordy.test.ts
│   │   │   └── wordy.ts
│   │   └── yacht/
│   │       ├── .docs/
│   │       │   ├── instructions.md
│   │       │   └── introduction.md
│   │       ├── .meta/
│   │       │   ├── config.json
│   │       │   ├── proof.ci.ts
│   │       │   └── tests.toml
│   │       ├── .vscode/
│   │       │   ├── extensions.json
│   │       │   └── settings.json
│   │       ├── .yarn/
│   │       │   └── releases/
│   │       │       └── yarn-3.6.4.cjs
│   │       ├── .yarnrc.yml
│   │       ├── babel.config.cjs
│   │       ├── eslint.config.mjs
│   │       ├── jest.config.cjs
│   │       ├── package.json
│   │       ├── test-runner.mjs
│   │       ├── tsconfig.json
│   │       ├── yacht.test.ts
│   │       └── yacht.ts
│   └── shared/
│       └── .docs/
│           ├── help.md
│           └── tests.md
├── package.json
├── reference/
│   └── implementing-a-concept-exercise.md
├── scripts/
│   ├── checksum.mjs
│   ├── ci-check.mjs
│   ├── ci.mjs
│   ├── format.mjs
│   ├── helpers.mjs
│   ├── lint.mjs
│   ├── name-check.mjs
│   ├── name-uniq.mjs
│   ├── pr-check.mjs
│   ├── pr.mjs
│   ├── stub-check.mjs
│   ├── sync.mjs
│   └── test.mjs
├── tsconfig.json
└── yarn-error.log
Download .txt
Showing preview only (451K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4744 symbols across 219 files)

FILE: .yarn/sdks/typescript/lib/tsserver.js
  function toEditorPath (line 46) | function toEditorPath(str) {
  function fromEditorPath (line 134) | function fromEditorPath(str) {
  method onMessage (line 182) | onMessage(/** @type {string | object} */ message) {
  method send (line 221) | send(/** @type {any} */ msg) {

FILE: .yarn/sdks/typescript/lib/tsserverlibrary.js
  function toEditorPath (line 46) | function toEditorPath(str) {
  function fromEditorPath (line 134) | function fromEditorPath(str) {
  method onMessage (line 182) | onMessage(/** @type {string | object} */ message) {
  method send (line 221) | send(/** @type {any} */ msg) {

FILE: exercises/concept/lasagna/.meta/exemplar.ts
  constant EXPECTED_MINUTES_IN_OVEN (line 4) | const EXPECTED_MINUTES_IN_OVEN = 40
  constant PREPARATION_MINUTES_PER_LAYER (line 9) | const PREPARATION_MINUTES_PER_LAYER = 2
  function remainingMinutesInOven (line 18) | function remainingMinutesInOven(actualMinutesInOven: number): number {
  function preparationTimeInMinutes (line 28) | function preparationTimeInMinutes(numberOfLayers: number): number {
  function totalTimeInMinutes (line 40) | function totalTimeInMinutes(

FILE: exercises/concept/lasagna/lasagna.ts
  constant PREPARATION_MINUTES_PER_LAYER (line 28) | const PREPARATION_MINUTES_PER_LAYER = 2
  function remainingMinutesInOven (line 37) | function remainingMinutesInOven(actualMinutesInOven: number): number {
  function preparationTimeInMinutes (line 47) | function preparationTimeInMinutes(numberOfLayers: number): number {
  function totalTimeInMinutes (line 59) | function totalTimeInMinutes(

FILE: exercises/practice/accumulate/.meta/proof.ci.ts
  function accumulate (line 1) | function accumulate<T, O>(list: T[], accumulator: (arg: T) => O): O[] {

FILE: exercises/practice/accumulate/accumulate.ts
  function accumulate (line 1) | function accumulate(list: unknown, accumulator: unknown): never {

FILE: exercises/practice/acronym/.meta/proof.ci.ts
  function parse (line 1) | function parse(phrase: string): string {

FILE: exercises/practice/acronym/acronym.ts
  function parse (line 1) | function parse(phrase: unknown): unknown {

FILE: exercises/practice/all-your-base/.meta/proof.ci.ts
  function convert (line 32) | function convert(

FILE: exercises/practice/all-your-base/all-your-base.ts
  function convert (line 1) | function convert(

FILE: exercises/practice/allergies/.meta/proof.ci.ts
  class Allergies (line 1) | class Allergies {
    method constructor (line 15) | constructor(allergenIndex: number) {
    method allergicTo (line 19) | public allergicTo(food: string): boolean {
    method list (line 33) | public list(): string[] {

FILE: exercises/practice/allergies/allergies.ts
  class Allergies (line 1) | class Allergies {
    method constructor (line 2) | constructor(allergenIndex: unknown) {
    method list (line 6) | public list(): unknown {
    method allergicTo (line 10) | public allergicTo(allergen: unknown): unknown {

FILE: exercises/practice/alphametics/.meta/proof.ci.ts
  function solve (line 1) | function solve(puzzle: string): undefined | { [key: string]: number } {
  function assignNumbers (line 40) | function assignNumbers(
  function testNumbers (line 53) | function testNumbers(
  function swap (line 106) | function swap(list: number[], x: number, y: number): number[] {
  function getNumberCombinations (line 113) | function getNumberCombinations(arr: number[], size: number): number[][] {

FILE: exercises/practice/alphametics/alphametics.ts
  function solve (line 1) | function solve(puzzle: unknown): unknown {

FILE: exercises/practice/anagram/.meta/proof.ci.ts
  function sort (line 1) | function sort(input: string): string {
  class Anagram (line 5) | class Anagram {
    method constructor (line 7) | constructor(input: string) {
    method matches (line 11) | public matches(...input: string[]): string[] {

FILE: exercises/practice/anagram/anagram.ts
  class Anagram (line 1) | class Anagram {
    method constructor (line 2) | constructor(input: unknown) {
    method matches (line 6) | public matches(...potentials: unknown[]): unknown {

FILE: exercises/practice/armstrong-numbers/.meta/proof.ci.ts
  function isArmstrongNumber (line 1) | function isArmstrongNumber(input: number | bigint): boolean {

FILE: exercises/practice/armstrong-numbers/armstrong-numbers.ts
  function isArmstrongNumber (line 1) | function isArmstrongNumber(number: unknown): unknown {

FILE: exercises/practice/atbash-cipher/.meta/proof.ci.ts
  function encode (line 4) | function encode(plainText: string): string {
  function decode (line 22) | function decode(cipherText: string): string {

FILE: exercises/practice/atbash-cipher/atbash-cipher.ts
  function encode (line 1) | function encode(plainText: unknown): unknown {
  function decode (line 5) | function decode(cipherText: unknown): unknown {

FILE: exercises/practice/bank-account/.meta/proof.ci.ts
  class ValueError (line 1) | class ValueError extends Error {
    method constructor (line 2) | constructor() {
  class BankAccount (line 7) | class BankAccount {
    method constructor (line 11) | constructor() {
    method open (line 16) | open(): void {
    method close (line 21) | close(): void {
    method deposit (line 27) | deposit(amount: number): void {
    method withdraw (line 32) | withdraw(amount: number): void {
    method balance (line 38) | get balance(): number {

FILE: exercises/practice/bank-account/.meta/solutions/bank-account.ts
  class ValueError (line 1) | class ValueError extends Error {
    method constructor (line 2) | constructor() {
  class BankAccount (line 7) | class BankAccount {
    method constructor (line 11) | constructor() {
    method open (line 16) | open(): void {
    method close (line 21) | close(): void {
    method deposit (line 27) | deposit(amount: number): void {
    method withdraw (line 32) | withdraw(amount: number): void {
    method balance (line 38) | get balance(): number {

FILE: exercises/practice/bank-account/bank-account.ts
  class ValueError (line 6) | class ValueError extends Error {
    method constructor (line 7) | constructor() {
  class BankAccount (line 12) | class BankAccount {
    method constructor (line 13) | constructor() {
    method open (line 17) | open(): unknown {
    method close (line 21) | close(): unknown {
    method deposit (line 25) | deposit(_argument: unknown): unknown {
    method withdraw (line 29) | withdraw(_argument: unknown): unknown {
    method balance (line 33) | get balance(): unknown {

FILE: exercises/practice/beer-song/.meta/proof.ci.ts
  function pluralize (line 1) | function pluralize(input: number): string {
  function verse (line 9) | function verse(input: number): string {
  function sing (line 26) | function sing(end: number = 99, start: number = 0): string {

FILE: exercises/practice/beer-song/beer-song.ts
  function verse (line 1) | function verse(index: unknown): unknown {
  function sing (line 5) | function sing(

FILE: exercises/practice/binary-search-tree/.meta/proof.ci.ts
  type BinarySearchTreeMaybe (line 1) | type BinarySearchTreeMaybe = BinarySearchTree | undefined
  type EachFn (line 2) | type EachFn = (data: number) => void
  class BinarySearchTree (line 4) | class BinarySearchTree {
    method constructor (line 9) | constructor(data: number) {
    method insert (line 13) | public insert(value: number): this {
    method each (line 25) | public each(fn: EachFn): void {
    method data (line 31) | public get data(): number {
    method left (line 35) | public get left(): BinarySearchTreeMaybe {
    method right (line 39) | public get right(): BinarySearchTreeMaybe {

FILE: exercises/practice/binary-search-tree/binary-search-tree.test.ts
  function recordAllData (line 4) | function recordAllData(bst: BinarySearchTree): unknown[] {

FILE: exercises/practice/binary-search-tree/binary-search-tree.ts
  class BinarySearchTree (line 1) | class BinarySearchTree {
    method constructor (line 2) | constructor(data: unknown) {
    method data (line 6) | public get data(): unknown {
    method right (line 10) | public get right(): BinarySearchTree | undefined {
    method left (line 14) | public get left(): BinarySearchTree | undefined {
    method insert (line 18) | public insert(item: unknown): unknown {
    method each (line 22) | public each(callback: (data: unknown) => unknown): unknown {

FILE: exercises/practice/binary-search/.meta/proof.ci.ts
  function find (line 1) | function find(array: number[], element: number): number | never {

FILE: exercises/practice/binary-search/binary-search.ts
  function find (line 1) | function find(haystack: unknown, needle: unknown): number | never {

FILE: exercises/practice/bob/.meta/proof.ci.ts
  function isYelling (line 1) | function isYelling(message: string): boolean {
  function isQuestion (line 5) | function isQuestion(message: string): boolean {
  function isSilence (line 9) | function isSilence(message: string): boolean {
  function hey (line 13) | function hey(message: string): string {

FILE: exercises/practice/bob/bob.ts
  function hey (line 1) | function hey(message: unknown): unknown {

FILE: exercises/practice/bottle-song/.meta/proof.ci.ts
  constant NUMBERS (line 1) | const NUMBERS = [

FILE: exercises/practice/bowling/.meta/proof.ci.ts
  type Frame (line 1) | type Frame = 'X' | 'S' | number | undefined
  class Bowling (line 3) | class Bowling {
    method constructor (line 13) | constructor() {
    method initializeFrame (line 24) | private initializeFrame(): void {
    method incrementFrame (line 30) | private incrementFrame(): void {
    method incrementScore (line 34) | private incrementScore(pins: number): void {
    method scoreStrike (line 39) | private scoreStrike(): void {
    method scoreFirstRoll (line 46) | private scoreFirstRoll(pins: number): void {
    method scoreSpare (line 53) | private scoreSpare(pins: number): void {
    method scoreOpenFrame (line 59) | private scoreOpenFrame(pins: number): void {
    method applySpareBonus (line 66) | private applySpareBonus(pins: number): void {
    method applyStrikeBonus (line 73) | private applyStrikeBonus(pins: number): void {
    method isGameOver (line 91) | private isGameOver(): boolean {
    method roll (line 131) | public roll(pins: number): void {
    method score (line 163) | public score(): number {

FILE: exercises/practice/bowling/bowling.ts
  class Bowling (line 1) | class Bowling {
    method roll (line 2) | public roll(pins: unknown): unknown {
    method score (line 6) | public score(): unknown {

FILE: exercises/practice/circular-buffer/.meta/proof.ci.ts
  type Buffer (line 1) | interface Buffer<T> {
  class BufferFullError (line 7) | class BufferFullError extends Error {
    method constructor (line 8) | constructor() {
  class BufferEmptyError (line 13) | class BufferEmptyError extends Error {
    method constructor (line 14) | constructor() {
  class CircularBuffer (line 19) | class CircularBuffer<T> implements Buffer<T> {
    method constructor (line 23) | constructor(capacity: number) {
    method read (line 27) | public read(): T | undefined {
    method write (line 34) | public write(value: T): void {
    method forceWrite (line 41) | public forceWrite(value: T): void {
    method clear (line 48) | public clear(): void {

FILE: exercises/practice/circular-buffer/circular-buffer.ts
  class CircularBuffer (line 1) | class CircularBuffer<T> {
    method constructor (line 2) | constructor(initial: unknown) {
    method write (line 6) | write(value: unknown): unknown {
    method read (line 10) | read(): unknown {
    method forceWrite (line 14) | forceWrite(value: unknown): unknown {
    method clear (line 18) | clear(): unknown {
  class BufferFullError (line 23) | class BufferFullError extends Error {
    method constructor (line 24) | constructor() {
  class BufferEmptyError (line 30) | class BufferEmptyError extends Error {
    method constructor (line 31) | constructor() {

FILE: exercises/practice/clock/.meta/proof.ci.ts
  class Clock (line 1) | class Clock {
    method constructor (line 5) | constructor(hour: number, minute: number = 0) {
    method reset (line 11) | private reset(): void {
    method getHour (line 16) | public getHour(): number {
    method getMinute (line 20) | public getMinute(): number {
    method toString (line 24) | public toString(): string {
    method formatNumber (line 28) | private formatNumber(numberToFormat: number): string {
    method plus (line 33) | public plus(minutes: number): Clock {
    method minus (line 38) | public minus(minutes: number): Clock {
    method equals (line 43) | public equals(clock: Clock): boolean {
    method adjustTime (line 47) | private adjustTime(delta: number): void {

FILE: exercises/practice/clock/clock.ts
  class Clock (line 1) | class Clock {
    method constructor (line 2) | constructor(hour: unknown, minute?: unknown) {
    method toString (line 6) | public toString(): unknown {
    method plus (line 10) | public plus(minutes: unknown): Clock {
    method minus (line 14) | public minus(minutes: unknown): Clock {
    method equals (line 18) | public equals(other: unknown): unknown {

FILE: exercises/practice/collatz-conjecture/.meta/proof.ci.ts
  function steps (line 1) | function steps(n: number): number {
  function calculateStepsRecursively (line 8) | function calculateStepsRecursively(n: number, count: number): number {

FILE: exercises/practice/collatz-conjecture/collatz-conjecture.ts
  function steps (line 1) | function steps(count: unknown): unknown {

FILE: exercises/practice/complex-numbers/.meta/proof.ci.ts
  class ComplexNumber (line 1) | class ComplexNumber {
    method constructor (line 5) | constructor(real: number, imag: number) {
    method add (line 10) | public add(other: ComplexNumber): ComplexNumber {
    method sub (line 14) | public sub(other: ComplexNumber): ComplexNumber {
    method mul (line 18) | public mul(other: ComplexNumber): ComplexNumber {
    method div (line 25) | public div(other: ComplexNumber): ComplexNumber {
    method abs (line 34) | public get abs(): number {
    method conj (line 38) | public get conj(): ComplexNumber {
    method exp (line 42) | public get exp(): ComplexNumber {

FILE: exercises/practice/complex-numbers/complex-numbers.ts
  class ComplexNumber (line 1) | class ComplexNumber {
    method constructor (line 2) | constructor(real: unknown, imaginary: unknown) {
    method real (line 6) | public get real(): number {
    method imag (line 10) | public get imag(): number {
    method add (line 14) | public add(other: unknown): unknown {
    method sub (line 18) | public sub(other: unknown): unknown {
    method div (line 22) | public div(other: unknown): unknown {
    method mul (line 26) | public mul(other: unknown): unknown {
    method abs (line 30) | public get abs(): unknown {
    method conj (line 34) | public get conj(): unknown {
    method exp (line 38) | public get exp(): ComplexNumber {

FILE: exercises/practice/connect/.meta/proof.ci.ts
  class Board (line 5) | class Board {
    method constructor (line 8) | constructor(board: string[]) {
    method winner (line 12) | public winner(): '' | 'X' | 'O' {
    method checkWin (line 22) | private checkWin(player: 'X' | 'O'): boolean {
    method search (line 32) | private search(
    method neighbors (line 57) | private neighbors(pos: {
    method startPositions (line 73) | private startPositions(XorO: 'X' | 'O'): Array<{ x: number; y: number ...
    method winningSpot (line 79) | private winningSpot(pos: { x: number; y: number }, XorO: 'X' | 'O'): b...
    method matches (line 85) | private matches(pos: { x: number; y: number }, XorO: 'X' | 'O'): boole...

FILE: exercises/practice/connect/connect.ts
  class Board (line 1) | class Board {
    method constructor (line 2) | constructor(board: unknown) {
    method winner (line 6) | public winner(): unknown {

FILE: exercises/practice/crypto-square/.meta/proof.ci.ts
  class Crypto (line 1) | class Crypto {
    method constructor (line 2) | constructor(private readonly input: string) {}
    method plaintext (line 4) | private get plaintext(): string {
    method ciphertext (line 8) | public get ciphertext(): string {
    method size (line 22) | public get size(): number {
    method ciphertextSegments (line 27) | private ciphertextSegments(): string[] {
    method plaintextSegments (line 56) | private plaintextSegments(): RegExpMatchArray {

FILE: exercises/practice/crypto-square/crypto-square.ts
  class Crypto (line 1) | class Crypto {
    method constructor (line 2) | constructor(plainText: unknown) {
    method ciphertext (line 6) | get ciphertext(): unknown {

FILE: exercises/practice/custom-set/.meta/proof.ci.ts
  class CustomSet (line 1) | class CustomSet<T> {
    method constructor (line 4) | constructor(data: T[] = []) {
    method add (line 11) | public add(el: T): this {
    method delete (line 16) | public delete(el: T): this {
    method size (line 21) | public size(): number {
    method empty (line 25) | public empty(): boolean {
    method contains (line 29) | public contains(el: T): boolean {
    method eql (line 33) | public eql(other: CustomSet<T>): boolean {
    method difference (line 45) | public difference(other: CustomSet<T>): CustomSet<T> {
    method disjoint (line 55) | public disjoint(other: CustomSet<T>): boolean {
    method intersection (line 59) | public intersection(other: CustomSet<T>): CustomSet<T> {
    method union (line 63) | public union(other: CustomSet<T>): CustomSet<T> {
    method subset (line 74) | public subset(other: CustomSet<T>): boolean {
    method toList (line 78) | public toList(): T[] {

FILE: exercises/practice/custom-set/custom-set.ts
  class CustomSet (line 1) | class CustomSet {
    method constructor (line 2) | constructor(initial?: unknown) {
    method empty (line 6) | empty(): unknown {
    method contains (line 10) | contains(element: unknown): unknown {
    method add (line 14) | add(element: unknown): CustomSet {
    method subset (line 18) | subset(other: unknown): CustomSet {
    method disjoint (line 22) | disjoint(other: unknown): CustomSet {
    method eql (line 26) | eql(other: unknown): unknown {
    method union (line 30) | union(other: unknown): CustomSet {
    method intersection (line 34) | intersection(other: unknown): CustomSet {
    method difference (line 38) | difference(other: unknown): CustomSet {

FILE: exercises/practice/darts/.meta/proof.ci.ts
  function score (line 1) | function score(x: number, y: number): number {

FILE: exercises/practice/darts/darts.ts
  function score (line 1) | function score(x: unknown, y: unknown): unknown {

FILE: exercises/practice/diamond/.meta/proof.ci.ts
  function makeDiamond (line 1) | function makeDiamond(input: string): string {
  function getAlphaString (line 14) | function getAlphaString(index: number): string {
  function getLine (line 23) | function getLine(inputIx: number, index: number): string {
  function padString (line 29) | function padString(str: string, times: number): string {

FILE: exercises/practice/diamond/diamond.test.ts
  function diamondify (line 4) | function diamondify(parts: TemplateStringsArray): string {

FILE: exercises/practice/diamond/diamond.ts
  function makeDiamond (line 1) | function makeDiamond(character: unknown): unknown {

FILE: exercises/practice/difference-of-squares/.meta/proof.ci.ts
  class Squares (line 1) | class Squares {
    method constructor (line 6) | constructor(int: number) {
    method _squareOfSum (line 12) | private _squareOfSum(int: number): number {
    method _sumOfSquares (line 24) | private _sumOfSquares(int: number): number {
    method _difference (line 36) | private _difference(): number {

FILE: exercises/practice/difference-of-squares/difference-of-squares.ts
  class Squares (line 1) | class Squares {
    method constructor (line 2) | constructor(count: unknown) {
    method sumOfSquares (line 6) | get sumOfSquares(): unknown {
    method squareOfSum (line 10) | get squareOfSum(): unknown {
    method difference (line 14) | get difference(): unknown {

FILE: exercises/practice/diffie-hellman/.meta/proof.ci.ts
  constant PRIMES (line 3) | const PRIMES = [
  class DiffieHellman (line 81) | class DiffieHellman {
    method constructor (line 82) | constructor(
    method getPublicKey (line 91) | public getPublicKey(privateKey: number): number {
    method getSecret (line 100) | public getSecret(theirPublicKey: number, ourPrivateKey: number): number {
    method validateInitialArguments (line 104) | private static validateInitialArguments(p: number, g: number): boolean {

FILE: exercises/practice/diffie-hellman/diffie-hellman.ts
  class DiffieHellman (line 1) | class DiffieHellman {
    method constructor (line 2) | constructor(p: unknown, g: unknown) {
    method getPublicKey (line 6) | public getPublicKey(privateKey: unknown): unknown {
    method getSecret (line 10) | public getSecret(theirPublicKey: unknown, myPrivateKey: unknown): unkn...

FILE: exercises/practice/dnd-character/.meta/proof.ci.ts
  class DnDCharacter (line 1) | class DnDCharacter {
    method constructor (line 11) | constructor() {
    method generateAbilityScore (line 22) | public static generateAbilityScore(): number {
    method getModifierFor (line 29) | public static getModifierFor(abilityValue: number): number {
    method rollDice (line 33) | private static rollDice(quantity: number): number[] {
    method rollDie (line 37) | private static rollDie(): number {

FILE: exercises/practice/dnd-character/dnd-character.ts
  class DnDCharacter (line 1) | class DnDCharacter {
    method generateAbilityScore (line 2) | public static generateAbilityScore(): number {
    method getModifierFor (line 6) | public static getModifierFor(abilityValue: number): number {

FILE: exercises/practice/etl/.meta/proof.ci.ts
  function transform (line 1) | function transform(input: { [key: string]: string[] }): {

FILE: exercises/practice/etl/etl.ts
  function transform (line 1) | function transform(/* Parameters go here */) {

FILE: exercises/practice/flatten-array/.meta/proof.ci.ts
  function flatten (line 1) | function flatten<A, T extends Array<A | A[]>>(arr: T): A[] {

FILE: exercises/practice/flatten-array/flatten-array.ts
  function flatten (line 1) | function flatten(/* Parameters go here */) {

FILE: exercises/practice/flower-field/.meta/proof.ci.ts
  constant FLOWER (line 1) | const FLOWER = '*'
  constant DELTAS (line 3) | const DELTAS = [
  function annotate (line 14) | function annotate(rows: string[]): string[] {
  function cellToFlowerOrCount (line 28) | function cellToFlowerOrCount(
  function countAdjacentFlowers (line 40) | function countAdjacentFlowers(board: string[][], x: number, y: number): ...
  function stringify (line 46) | function stringify(board: string[][]): string[] {
  function noDataPresent (line 50) | function noDataPresent(rows: string[]): boolean {
  function adjacentSquareIsOnBoard (line 54) | function adjacentSquareIsOnBoard(
  function adjacentSquareHasFlower (line 62) | function adjacentSquareHasFlower(

FILE: exercises/practice/flower-field/flower-field.ts
  function annotate (line 1) | function annotate(field: unknown): unknown {

FILE: exercises/practice/food-chain/.meta/proof.ci.ts
  function verses (line 12) | function verses(start = 1, end = 8): string {
  function verse (line 27) | function verse(num: number): string {

FILE: exercises/practice/food-chain/food-chain.ts
  function verse (line 1) | function verse(/* Parameters go here */) {
  function verses (line 5) | function verses(/* Parameters go here */) {

FILE: exercises/practice/game-of-life/.meta/proof.ci.ts
  class GameOfLife (line 1) | class GameOfLife {
    method constructor (line 2) | constructor(private matrix: number[][]) {}
    method tick (line 4) | public tick(): void {
    method state (line 45) | public state(): number[][] {

FILE: exercises/practice/game-of-life/game-of-life.ts
  class GameOfLife (line 1) | class GameOfLife {
    method constructor (line 2) | constructor(matrix: unknown) {
    method tick (line 6) | public tick(): unknown {
    method state (line 10) | public state(): unknown {

FILE: exercises/practice/gigasecond/.meta/proof.ci.ts
  class Gigasecond (line 3) | class Gigasecond {
    method constructor (line 4) | constructor(private readonly currentDate: Readonly<Date>) {}
    method date (line 6) | public date(): Date {

FILE: exercises/practice/gigasecond/gigasecond.ts
  class Gigasecond (line 1) | class Gigasecond {
    method date (line 2) | public date(/* Parameters go here */) {

FILE: exercises/practice/grade-school/.meta/proof.ci.ts
  type Student (line 1) | type Student = string
  type Grade (line 2) | type Grade = number
  type StudentRooster (line 3) | type StudentRooster = Record<string, Student[]>
  type StudentGrades (line 4) | type StudentGrades = Map<Student, Grade>
  class GradeSchool (line 5) | class GradeSchool {
    method constructor (line 8) | constructor() {
    method add (line 12) | public add(student: Student, level: Grade): void {
    method grade (line 16) | public grade(level: Grade): Student[] {
    method roster (line 23) | public roster(): StudentRooster {

FILE: exercises/practice/grade-school/grade-school.ts
  class GradeSchool (line 1) | class GradeSchool {
    method roster (line 2) | roster() {
    method add (line 6) | add() {
    method grade (line 10) | grade() {

FILE: exercises/practice/grains/.meta/proof.ci.ts
  function square (line 1) | function square(n: number): bigint {
  function total (line 9) | function total(): bigint {

FILE: exercises/practice/hamming/.meta/proof.ci.ts
  function compute (line 1) | function compute(left: string, right: string): number {

FILE: exercises/practice/hamming/hamming.ts
  function compute (line 1) | function compute(left: unknown, right: unknown): unknown {

FILE: exercises/practice/hello-world/.meta/proof.ci.ts
  function hello (line 1) | function hello(): string {

FILE: exercises/practice/hello-world/hello-world.ts
  function hello (line 1) | function hello(): string {

FILE: exercises/practice/house/.meta/proof.ci.ts
  constant OBJECTS (line 1) | const OBJECTS = [
  constant ACTIONS (line 16) | const ACTIONS = [
  function verse (line 31) | function verse(verseNumber: number): string[] {
  function verses (line 54) | function verses(start: number, end: number): string[] {

FILE: exercises/practice/house/house.ts
  function verse (line 1) | function verse(/* parameters go here */): unknown {
  function verses (line 5) | function verses(/* parameters go here */): unknown {

FILE: exercises/practice/isbn-verifier/.meta/proof.ci.ts
  function isValid (line 1) | function isValid(input: string): boolean {

FILE: exercises/practice/isbn-verifier/isbn-verifier.ts
  function isValid (line 1) | function isValid(isbn: unknown): unknown {

FILE: exercises/practice/isogram/.meta/proof.ci.ts
  function isIsogram (line 1) | function isIsogram(phrase: string): boolean {
  function isLetter (line 19) | function isLetter(letter: string): boolean {

FILE: exercises/practice/isogram/isogram.ts
  function isIsogram (line 1) | function isIsogram(/* parameters go here */): unknown {

FILE: exercises/practice/kindergarten-garden/.meta/proof.ci.ts
  constant DEFAULT_STUDENTS (line 1) | const DEFAULT_STUDENTS: Student[] = [
  constant PLANT_CODES (line 16) | const PLANT_CODES = {
  type Student (line 23) | type Student = string
  type Plant (line 24) | type Plant = (typeof PLANT_CODES)[keyof typeof PLANT_CODES]
  type Plants (line 25) | type Plants = Plant[]
  type Pots (line 26) | type Pots = Plants[]
  function getPlants (line 28) | function getPlants(pots: Pots, index: number): Plants {
  function parse (line 40) | function parse(diagram: string): Pots {
  class Garden (line 49) | class Garden {
    method constructor (line 52) | constructor(
    method plants (line 65) | public plants(student: Student): Plants {

FILE: exercises/practice/kindergarten-garden/kindergarten-garden.ts
  constant DEFAULT_STUDENTS (line 6) | const DEFAULT_STUDENTS: Student[] = [
  constant PLANT_CODES (line 21) | const PLANT_CODES = {
  type Student (line 28) | type Student = string
  type Plant (line 29) | type Plant = (typeof PLANT_CODES)[keyof typeof PLANT_CODES]
  type Plants (line 30) | type Plants = Plant[]
  type Pots (line 31) | type Pots = Plants[]
  class Garden (line 33) | class Garden {
    method constructor (line 34) | constructor(diagram: string, students = DEFAULT_STUDENTS) {
    method plants (line 38) | public plants(student: Student): Plants {

FILE: exercises/practice/knapsack/.meta/proof.ci.ts
  type Item (line 1) | type Item = {
  function maximumValue (line 6) | function maximumValue({
  function solve (line 20) | function solve(
  function memoizedMax (line 34) | function memoizedMax(
  function calculateMax (line 56) | function calculateMax(
  function valueOfItemIfFits (line 78) | function valueOfItemIfFits(

FILE: exercises/practice/knapsack/knapsack.ts
  type Item (line 1) | type Item = {
  function maximumValue (line 6) | function maximumValue({

FILE: exercises/practice/largest-series-product/.meta/proof.ci.ts
  function largestProduct (line 1) | function largestProduct(digits: string, seriesLength: number): number {

FILE: exercises/practice/leap/.meta/proof.ci.ts
  function isLeap (line 1) | function isLeap(year: number): boolean {

FILE: exercises/practice/leap/leap.ts
  function isLeap (line 1) | function isLeap() {

FILE: exercises/practice/line-up/line-up.ts
  function format (line 1) | function format(name: unknown, number: unknown): unknown {

FILE: exercises/practice/linked-list/.meta/proof.ci.ts
  class Node (line 1) | class Node<T> {
    method constructor (line 6) | constructor(value: T) {
    method getNext (line 10) | public getNext(): Node<T> | undefined {
    method setNext (line 14) | public setNext(newNext: Node<T> | undefined): void {
    method getPrev (line 18) | public getPrev(): Node<T> | undefined {
    method setPrev (line 22) | public setPrev(newPrev: Node<T> | undefined): void {
    method getValue (line 26) | public getValue(): T {
  class LinkedList (line 31) | class LinkedList<T> {
    method pop (line 35) | public pop(): T | undefined {
    method push (line 51) | public push(value: T): void {
    method shift (line 63) | public shift(): T | undefined {
    method unshift (line 79) | public unshift(value: T): void {
    method count (line 91) | public count(): number {
    method delete (line 102) | public delete(value: T): void {

FILE: exercises/practice/linked-list/linked-list.ts
  class LinkedList (line 1) | class LinkedList<TElement> {
    method push (line 2) | public push(element: unknown) {
    method pop (line 6) | public pop(): unknown {
    method shift (line 10) | public shift(): unknown {
    method unshift (line 14) | public unshift(element: unknown) {
    method delete (line 18) | public delete(element: unknown) {
    method count (line 22) | public count(): unknown {

FILE: exercises/practice/list-ops/.meta/proof.ci.ts
  method value (line 2) | get value() {
  method next (line 5) | get next() {
  method get (line 9) | get() {
  method push (line 13) | push<T>(item: T): Cons<T> {
  method length (line 17) | length() {
  method append (line 20) | append<T>(other: Cons<T>): Cons<T> {
  method concatenate (line 23) | concatenate(): Cons<undefined> {
  method forEach (line 26) | forEach(): void {
  method foldl (line 29) | foldl<TValue = unknown, TReturn = unknown>(
  method foldr (line 35) | foldr<TValue = unknown, TReturn = unknown>(
  method filter (line 41) | filter(): Cons<undefined> {
  method reverse (line 44) | reverse(): Cons<undefined> {
  method map (line 47) | map<TReturn>(): Cons<TReturn> {
  class Cons (line 51) | class Cons<T> {
    method constructor (line 52) | constructor(
    method get (line 57) | public get(i: number): T | undefined {
    method push (line 61) | public push(item: T): this {
    method length (line 66) | public length(): number {
    method append (line 70) | public append(other: Cons<T>): Cons<T> {
    method concatenate (line 74) | public concatenate(others: Cons<Cons<T>>): Cons<T> {
    method foldl (line 85) | public foldl<TReturn = unknown>(
    method forEach (line 92) | public forEach(callback: (value: T) => void): void {
    method foldr (line 103) | public foldr<TReturn = unknown>(
    method filter (line 116) | public filter(predicate: (value: T) => boolean): Cons<T> {
    method map (line 123) | public map<TReturn = unknown>(
    method reverse (line 132) | public reverse(): Cons<T> {
  class List (line 136) | class List {
    method create (line 137) | public static create<T>(...values: T[]): Cons<T> {

FILE: exercises/practice/list-ops/list-ops.test.ts
  type JestUtils (line 5) | type JestUtils = {
  type AsymmetricMatchers (line 54) | interface AsymmetricMatchers {
  type Matchers (line 57) | interface Matchers<R> {

FILE: exercises/practice/list-ops/list-ops.ts
  class List (line 1) | class List {
    method create (line 2) | public static create(...values: unknown[]): unknown {

FILE: exercises/practice/luhn/.meta/proof.ci.ts
  function valid (line 1) | function valid(value: string): boolean {

FILE: exercises/practice/luhn/luhn.ts
  function valid (line 1) | function valid(digitString: unknown): unknown {

FILE: exercises/practice/matching-brackets/.meta/proof.ci.ts
  type LeftBracket (line 1) | type LeftBracket = '(' | '[' | '{'
  type RightBracket (line 2) | type RightBracket = ')' | ']' | '}'
  type AnyBracket (line 3) | type AnyBracket = LeftBracket | RightBracket
  function bracketsAreMatching (line 5) | function bracketsAreMatching(
  function isPaired (line 16) | function isPaired(input: string): boolean {

FILE: exercises/practice/matching-brackets/matching-brackets.ts
  function isPaired (line 1) | function isPaired(input: unknown): unknown {

FILE: exercises/practice/matrix/.meta/proof.ci.ts
  class Matrix (line 1) | class Matrix {
    method constructor (line 6) | constructor(description: string) {
    method parseMatrix (line 11) | private parseMatrix(): void {
    method parseRows (line 16) | private parseRows(): void {
    method parseColumns (line 24) | private parseColumns(): void {

FILE: exercises/practice/matrix/matrix.ts
  class Matrix (line 1) | class Matrix {
    method constructor (line 2) | constructor() {
    method rows (line 6) | get rows(): unknown {
    method columns (line 10) | get columns(): unknown {

FILE: exercises/practice/minesweeper/.meta/proof.ci.ts
  constant MINE (line 1) | const MINE = '*'
  constant DELTAS (line 3) | const DELTAS = [
  function annotate (line 14) | function annotate(rows: string[]): string[] {
  function cellToMineOrCount (line 28) | function cellToMineOrCount(
  function countAdjacentMines (line 40) | function countAdjacentMines(board: string[][], x: number, y: number): nu...
  function stringify (line 46) | function stringify(board: string[][]): string[] {
  function noDataPresent (line 50) | function noDataPresent(rows: string[]): boolean {
  function adjacentSquareIsOnBoard (line 54) | function adjacentSquareIsOnBoard(
  function adjacentSquareHasMine (line 62) | function adjacentSquareHasMine(

FILE: exercises/practice/minesweeper/minesweeper.ts
  function annotate (line 1) | function annotate(field: unknown): unknown {

FILE: exercises/practice/nth-prime/.meta/proof.ci.ts
  function nth (line 18) | function nth(nthPrime: number): number {

FILE: exercises/practice/nth-prime/nth-prime.ts
  function nth (line 1) | function nth() {

FILE: exercises/practice/nucleotide-count/.meta/proof.ci.ts
  type Counts (line 1) | type Counts = Record<'A' | 'C' | 'G' | 'T', number>
  function nucleotideCounts (line 3) | function nucleotideCounts(strand: string): Counts {

FILE: exercises/practice/nucleotide-count/nucleotide-count.ts
  function nucleotideCounts (line 1) | function nucleotideCounts(/* Parameters go here */) {

FILE: exercises/practice/ocr-numbers/.meta/proof.ci.ts
  type Patterns (line 1) | interface Patterns {
  constant PATTERNS (line 5) | const PATTERNS: Patterns = {
  type Digit (line 18) | type Digit = number | '?'

FILE: exercises/practice/ocr-numbers/ocr-numbers.ts
  function convert (line 1) | function convert(/* Parameters go here */) {

FILE: exercises/practice/palindrome-products/.meta/proof.ci.ts
  type Input (line 1) | interface Input {
  type Factors (line 6) | type Factors = [number, number][]
  type PalindromeShape (line 7) | interface PalindromeShape {
  class Palindrome (line 14) | class Palindrome implements PalindromeShape {
    method constructor (line 18) | constructor(factor1: number, factor2: number) {
    method withFactors (line 23) | public withFactors(factors: Factors[number]): this {
    method valid (line 30) | public valid(): boolean {
    method merge (line 35) | public merge(other: Palindrome): this {
  class Palindromes (line 44) | class Palindromes {
    method constructor (line 45) | constructor(
    method largest (line 50) | public get largest(): PalindromeShape {
    method smallest (line 72) | public get smallest(): PalindromeShape {
  function generate (line 87) | function generate(params: Input): Palindromes {

FILE: exercises/practice/palindrome-products/palindrome-products.test.ts
  type Factors (line 148) | type Factors = ReturnType<typeof generate>['smallest']['factors']
  function sortFactors (line 149) | function sortFactors(factors: Factors): Factors {

FILE: exercises/practice/palindrome-products/palindrome-products.ts
  type Input (line 1) | interface Input {
  function generate (line 6) | function generate(params: Input): unknown {

FILE: exercises/practice/pangram/.meta/proof.ci.ts
  function isPangram (line 5) | function isPangram(value: string): boolean {

FILE: exercises/practice/pangram/pangram.ts
  function isPangram (line 1) | function isPangram() {

FILE: exercises/practice/pascals-triangle/.meta/proof.ci.ts
  class Triangle (line 1) | class Triangle {
    method constructor (line 5) | constructor(rows: number) {
    method newRow (line 10) | private newRow(prevRow: number[]): number[] {
    method fillRows (line 21) | private fillRows(rows: number): number[][] {

FILE: exercises/practice/pascals-triangle/pascals-triangle.ts
  class Triangle (line 1) | class Triangle {}

FILE: exercises/practice/perfect-numbers/.meta/proof.ci.ts
  function classify (line 1) | function classify(n: number): string {
  function getDivisors (line 32) | function getDivisors(n: number): number[] {

FILE: exercises/practice/perfect-numbers/perfect-numbers.ts
  function classify (line 1) | function classify() {

FILE: exercises/practice/phone-number/phone-number.ts
  function clean (line 1) | function clean() {

FILE: exercises/practice/pig-latin/.meta/proof.ci.ts
  function translate (line 1) | function translate(phrase: string): string {

FILE: exercises/practice/pig-latin/pig-latin.ts
  function translate (line 1) | function translate() {

FILE: exercises/practice/prime-factors/.meta/proof.ci.ts
  function calculatePrimeFactors (line 1) | function calculatePrimeFactors(num: number): number[] {

FILE: exercises/practice/prime-factors/prime-factors.ts
  function calculatePrimeFactors (line 1) | function calculatePrimeFactors() {

FILE: exercises/practice/prism/.meta/proof.ci.ts
  type Point (line 1) | type Point = {
  type Prism (line 7) | type Prism = Point & {

FILE: exercises/practice/prism/prism.ts
  function findSequence (line 1) | function findSequence(start: unknown, prisms: unknown): unknown {

FILE: exercises/practice/protein-translation/.meta/proof.ci.ts
  constant ACID_PROTEIN_MAP (line 1) | const ACID_PROTEIN_MAP = {
  type Codon (line 21) | type Codon = keyof typeof ACID_PROTEIN_MAP
  type Protein (line 22) | type Protein = (typeof ACID_PROTEIN_MAP)[Codon]

FILE: exercises/practice/protein-translation/protein-translation.ts
  function translate (line 1) | function translate() {

FILE: exercises/practice/proverb/proverb.ts
  function proverb (line 1) | function proverb() {

FILE: exercises/practice/pythagorean-triplet/.meta/proof.ci.ts
  type Options (line 1) | type Options = {
  type TripletArray (line 7) | type TripletArray = [number, number, number]
  class Triplet (line 9) | class Triplet {
    method constructor (line 10) | constructor(
    method toArray (line 16) | public toArray(): TripletArray {
    method pythagorean (line 20) | public get pythagorean(): boolean {
    method sum (line 24) | public get sum(): number {
  function triplets (line 29) | function triplets({ minFactor, maxFactor, sum }: Options): Triplet[] {

FILE: exercises/practice/pythagorean-triplet/pythagorean-triplet.test.ts
  type Triplet (line 4) | type Triplet = [number, number, number]
  function tripletsWithSum (line 6) | function tripletsWithSum(sum: number, options = {}): Triplet[] {

FILE: exercises/practice/pythagorean-triplet/pythagorean-triplet.ts
  type Options (line 1) | type Options = {
  function triplets (line 7) | function triplets({}: Options): Triplet[] {
  class Triplet (line 11) | class Triplet {
    method constructor (line 12) | constructor() {
    method toArray (line 16) | toArray(): [number, number, number] {

FILE: exercises/practice/queen-attack/.meta/proof.ci.ts
  constant STARTING (line 3) | const STARTING: Positions = { black: [0, 3], white: [7, 3] } as const
  type Position (line 5) | type Position = readonly [number, number]
  type Board (line 6) | type Board = string[]
  type Positions (line 8) | type Positions = {
  function invalidPosition (line 13) | function invalidPosition({ white, black }: Positions): boolean {
  function samePosition (line 25) | function samePosition({ white, black }: Positions): boolean {
  function constructBoard (line 29) | function constructBoard(): Board {
  function placePieces (line 33) | function placePieces(self: QueenAttack): void {
  class QueenAttack (line 42) | class QueenAttack {
    method constructor (line 47) | constructor(params: Partial<Positions> = {}) {
    method canAttack (line 66) | public get canAttack(): boolean {
    method toString (line 79) | public toString(): string {

FILE: exercises/practice/queen-attack/queen-attack.ts
  type Position (line 1) | type Position = readonly [number, number]
  type Positions (line 3) | type Positions = {
  class QueenAttack (line 7) | class QueenAttack {
    method constructor (line 13) | constructor({}: Partial<Positions> = {}) {
    method toString (line 17) | toString() {
    method canAttack (line 21) | get canAttack() {

FILE: exercises/practice/raindrops/.meta/proof.ci.ts
  function convert (line 1) | function convert(drops: number): string {

FILE: exercises/practice/raindrops/raindrops.ts
  function convert (line 1) | function convert() {

FILE: exercises/practice/rational-numbers/.meta/proof.ci.ts
  class Rational (line 1) | class Rational {
    method constructor (line 5) | constructor(numerator: number, denominator: number) {
    method add (line 17) | public add(that: Rational): Rational {
    method sub (line 25) | public sub(that: Rational): Rational {
    method mul (line 33) | public mul(that: Rational): Rational {
    method div (line 40) | public div(that: Rational): Rational {
    method abs (line 47) | public abs(): Rational {
    method exprational (line 51) | public exprational(n: number): Rational {
    method expreal (line 65) | public expreal(base: number): number {
    method reduce (line 72) | public reduce(): this {
    method gcd (line 82) | private gcd(a: number, b: number): number {
    method ensureSignInNumerator (line 93) | private ensureSignInNumerator(): void {

FILE: exercises/practice/rational-numbers/rational-numbers.test.ts
  function assertRational (line 6) | function assertRational(

FILE: exercises/practice/rational-numbers/rational-numbers.ts
  class Rational (line 1) | class Rational {
    method constructor (line 2) | constructor() {
    method add (line 6) | add() {
    method sub (line 10) | sub() {
    method mul (line 14) | mul() {
    method div (line 18) | div() {
    method abs (line 22) | abs() {
    method exprational (line 26) | exprational() {
    method expreal (line 30) | expreal() {
    method reduce (line 34) | reduce() {

FILE: exercises/practice/react/.meta/proof.ci.ts
  type Status (line 10) | enum Status {
  type EqualFn (line 31) | type EqualFn<T> = (lhs: T, rhs: T) => boolean
  type GetterFn (line 32) | type GetterFn<T> = () => T
  type SetterFn (line 33) | type SetterFn<T> = (value: T) => T
  type UnsubscribeFn (line 34) | type UnsubscribeFn = () => void
  type UpdateFn (line 35) | type UpdateFn<T> = (value?: T) => T
  type InputPair (line 37) | type InputPair<T> = [GetterFn<T>, SetterFn<T>]
  type Options (line 39) | type Options = {
  type ObserverR (line 43) | type ObserverR = {
  type ObserverV (line 50) | type ObserverV<T> = {
  type Observer (line 55) | type Observer<T> = ObserverR & ObserverV<T>
  type SubjectR (line 57) | type SubjectR = {
  type SubjectV (line 62) | type SubjectV<T> = {
  type Subject (line 67) | type Subject<T> = SubjectR & SubjectV<T>
  type ComputedR (line 69) | type ComputedR = ObserverR & SubjectR
  type Computed (line 71) | type Computed<T> = ComputedR & ObserverV<T> & SubjectV<T>
  function isObserverRComputedR (line 73) | function isObserverRComputedR(observer: ObserverR): observer is ComputedR {
  function isSubjectComputed (line 78) | function isSubjectComputed<T>(subject: Subject<T>): subject is Computed<...
  function isObserverComputed (line 83) | function isObserverComputed<T>(observer: Observer<T>): observer is Compu...
  function selectEqualFn (line 90) | function selectEqualFn<T>(
  function link (line 105) | function link(subject: SubjectR, observer: ObserverR): void {
  function unsubscribe (line 110) | function unsubscribe(observer: ObserverR): void {
  function makeUnsubscribe (line 116) | function makeUnsubscribe(observer: ObserverR | undefined): UnsubscribeFn {
  function prepareForUpdate (line 126) | function prepareForUpdate(observer: ObserverR): void {
  function markDeep (line 136) | function markDeep(observer: ObserverR): void {
  function markDeepObservers (line 143) | function markDeepObservers(subject: SubjectR): void {
  function runUpdates (line 147) | function runUpdates(prepareUpdates: () => void): void {
  function updateQueued (line 168) | function updateQueued(queued: ObserverR[]): void {
  function updateViaStatus (line 174) | function updateViaStatus<T>(
  function updateDeep (line 196) | function updateDeep<T>(subject: Subject<T>): void {
  function updateDeepStaleSubjects (line 200) | function updateDeepStaleSubjects<T>(observer: Observer<T>): void {
  function updateObserver (line 204) | function updateObserver<T>(observer: Observer<T>): void {
  function readSubject (line 217) | function readSubject<T>(subject: Subject<T>): T {
  function writeSubject (line 229) | function writeSubject<T>(subject: Subject<T>, value: T): T {
  function createInput (line 275) | function createInput<T>(
  function createComputed (line 339) | function createComputed<T>(
  function createCallback (line 383) | function createCallback<T>(updateFn: UpdateFn<T>, value?: T): Unsubscrib...

FILE: exercises/practice/react/react.ts
  type EqualFn (line 27) | type EqualFn<T> = (lhs: T, rhs: T) => boolean
  type GetterFn (line 28) | type GetterFn<T> = () => T
  type SetterFn (line 29) | type SetterFn<T> = (value: T) => T
  type UnsubscribeFn (line 30) | type UnsubscribeFn = () => void
  type UpdateFn (line 31) | type UpdateFn<T> = (value?: T) => T
  type InputPair (line 33) | type InputPair<T> = [GetterFn<T>, SetterFn<T>]
  type Options (line 35) | type Options = {
  type ObserverR (line 39) | type ObserverR = {
  type ObserverV (line 43) | type ObserverV<T> = {
  type Observer (line 48) | type Observer<T> = ObserverR & ObserverV<T>
  type SubjectR (line 50) | type SubjectR = {
  type SubjectV (line 55) | type SubjectV<T> = {
  type Subject (line 60) | type Subject<T> = SubjectR & SubjectV<T>
  function updateObserver (line 65) | function updateObserver<T>(observer: Observer<T>): void {
  function createInput (line 105) | function createInput<T>(
  function createComputed (line 182) | function createComputed<T>(
  function createCallback (line 226) | function createCallback<T>(_updateFn: UpdateFn<T>, _value?: T): Unsubscr...

FILE: exercises/practice/rectangles/.meta/proof.ci.ts
  function count (line 1) | function count(diagram: string[]): number {

FILE: exercises/practice/rectangles/rectangles.ts
  function count (line 1) | function count() {

FILE: exercises/practice/relative-distance/relative-distance.ts
  function degreesOfSeparation (line 1) | function degreesOfSeparation(

FILE: exercises/practice/resistor-color-duo/.meta/proof.ci.ts
  constant COLORS (line 2) | const COLORS = [

FILE: exercises/practice/resistor-color-duo/resistor-color-duo.ts
  function decodedValue (line 1) | function decodedValue() {

FILE: exercises/practice/resistor-color-trio/.meta/proof.ci.ts
  constant COLORS (line 2) | const COLORS = [
  type IUnits (line 18) | interface IUnits {
  constant UNITS (line 24) | const UNITS: IUnits[] = [

FILE: exercises/practice/resistor-color-trio/resistor-color-trio.ts
  function decodedResistorValue (line 1) | function decodedResistorValue() {

FILE: exercises/practice/resistor-color/.meta/proof.ci.ts
  constant COLORS (line 1) | const COLORS = [

FILE: exercises/practice/resistor-color/resistor-color.ts
  constant COLORS (line 5) | const COLORS = undefined

FILE: exercises/practice/reverse-string/.meta/proof.ci.ts
  function reverse (line 1) | function reverse(value: string): string {

FILE: exercises/practice/reverse-string/reverse-string.ts
  function reverse (line 1) | function reverse(/* Parameters go here */) {

FILE: exercises/practice/rna-transcription/.meta/proof.ci.ts
  function toRna (line 1) | function toRna(input: string): string {

FILE: exercises/practice/rna-transcription/rna-transcription.ts
  function toRna (line 1) | function toRna() {

FILE: exercises/practice/robot-name/.meta/proof.ci.ts
  class NameDatabase (line 10) | class NameDatabase {
    method constructor (line 14) | constructor() {
    method releaseNames (line 18) | public releaseNames(): void {
    method allPossibleNames (line 22) | public allPossibleNames(): string[] {
    method fetchNewName (line 34) | public fetchNewName(): string {
  class Robot (line 53) | class Robot {
    method name (line 56) | public get name(): string {
    method constructor (line 60) | constructor() {
    method resetName (line 64) | public resetName(): void {
    method releaseNames (line 68) | public static releaseNames(): void {

FILE: exercises/practice/robot-name/robot-name.test.ts
  constant NAME_RE (line 20) | const NAME_RE = /^[A-Z]{2}\d{3}$/
  constant TOTAL_NUMBER_OF_NAMES (line 21) | const TOTAL_NUMBER_OF_NAMES =

FILE: exercises/practice/robot-name/robot-name.ts
  class Robot (line 1) | class Robot {
    method constructor (line 2) | constructor() {}
    method name (line 4) | public get name(): string {
    method resetName (line 8) | public resetName(): void {
    method releaseNames (line 12) | public static releaseNames(): void {

FILE: exercises/practice/robot-simulator/.meta/proof.ci.ts
  class InvalidInputError (line 1) | class InvalidInputError extends Error {
    method constructor (line 2) | constructor(message: string) {
  type Bearing (line 8) | type Bearing = 'north' | 'south' | 'east' | 'west'
  type Instruction (line 9) | type Instruction = 'turnLeft' | 'turnRight' | 'advance'
  function isValidBearing (line 13) | function isValidBearing(next: string): next is Bearing {
  class Robot (line 16) | class Robot {
    method instructions (line 20) | private static instructions(s: string): Instruction[] {
    method constructor (line 37) | constructor() {
    method direction (line 42) | private set direction(next: string) {
    method advance (line 50) | private advance(): void {
    method turnLeft (line 62) | private turnLeft(): void {
    method turnRight (line 74) | private turnRight(): void {
    method place (line 86) | public place(args: { x: number; y: number; direction: string }): void {
    method evaluate (line 91) | public evaluate(s: string): void {

FILE: exercises/practice/robot-simulator/robot-simulator.test.ts
  function turnRight (line 4) | function turnRight(robot: Robot): void {
  function turnLeft (line 8) | function turnLeft(robot: Robot): void {
  function advance (line 12) | function advance(robot: Robot): void {

FILE: exercises/practice/robot-simulator/robot-simulator.ts
  class InvalidInputError (line 1) | class InvalidInputError extends Error {
    method constructor (line 2) | constructor(message: string) {
  type Direction (line 8) | type Direction = 'north' | 'east' | 'south' | 'west'
  type Coordinates (line 9) | type Coordinates = [number, number]
  class Robot (line 11) | class Robot {
    method bearing (line 12) | get bearing(): Direction {
    method coordinates (line 16) | get coordinates(): Coordinates {
    method place (line 20) | place({}: { x: number; y: number; direction: string }) {
    method evaluate (line 24) | evaluate(instructions: string) {

FILE: exercises/practice/roman-numerals/.meta/proof.ci.ts
  function toRoman (line 1) | function toRoman(number: number): string {

FILE: exercises/practice/rotational-cipher/.meta/proof.ci.ts
  function rotate (line 1) | function rotate(text: string, shiftBy: number): string {

FILE: exercises/practice/rotational-cipher/rotational-cipher.ts
  function rotate (line 1) | function rotate() {

FILE: exercises/practice/run-length-encoding/.meta/proof.ci.ts
  function encode (line 1) | function encode(plaintext: string): string {
  function decode (line 7) | function decode(cypher: string): string {

FILE: exercises/practice/run-length-encoding/run-length-encoding.ts
  function encode (line 1) | function encode() {
  function decode (line 5) | function decode() {

FILE: exercises/practice/saddle-points/.meta/proof.ci.ts
  function saddlePoints (line 1) | function saddlePoints(

FILE: exercises/practice/saddle-points/saddle-points.ts
  function saddlePoints (line 1) | function saddlePoints(/* Parameters go here */) {

FILE: exercises/practice/say/.meta/proof.ci.ts
  function divideNoDecimal (line 36) | function divideNoDecimal(input: number, by: number): number {
  function classifier (line 40) | function classifier(input: number): number {
  function numberGenerator (line 58) | function numberGenerator(input: number): string {
  function zeroTo99 (line 75) | function zeroTo99(input: number): string {
  function sayInEnglish (line 95) | function sayInEnglish(input: number): string {

FILE: exercises/practice/say/say.ts
  function sayInEnglish (line 1) | function sayInEnglish() {

FILE: exercises/practice/scrabble-score/.meta/proof.ci.ts
  type LetterScore (line 1) | interface LetterScore {

FILE: exercises/practice/scrabble-score/scrabble-score.ts
  function score (line 1) | function score() {

FILE: exercises/practice/secret-handshake/.meta/proof.ci.ts
  constant COMMANDS (line 1) | const COMMANDS = ['wink', 'double blink', 'close your eyes', 'jump'] as ...
  type Command (line 2) | type Command = (typeof COMMANDS)[number]
  type Commands (line 3) | type Commands = Command[]

FILE: exercises/practice/secret-handshake/secret-handshake.ts
  function commands (line 1) | function commands() {

FILE: exercises/practice/series/.meta/proof.ci.ts
  class Series (line 1) | class Series {
    method constructor (line 5) | constructor(numberString: string) {
    method getDigits (line 14) | private getDigits(): number[] {
    method slices (line 18) | public slices(sliceSize: number): number[][] {

FILE: exercises/practice/series/series.ts
  class Series (line 1) | class Series {
    method constructor (line 2) | constructor(series: unknown) {
    method slices (line 6) | slices(sliceLength: unknown): unknown {

FILE: exercises/practice/sieve/.meta/proof.ci.ts
  function primes (line 1) | function primes(limit: number): number[] {

FILE: exercises/practice/sieve/sieve.ts
  function primes (line 1) | function primes() {

FILE: exercises/practice/simple-cipher/.meta/proof.ci.ts
  class SimpleCipher (line 1) | class SimpleCipher {
    method constructor (line 4) | constructor(key?: string) {
    method encode (line 18) | public encode(decodedMessage: string): string {
    method decode (line 33) | public decode(encodedMessage: string): string {

FILE: exercises/practice/simple-cipher/simple-cipher.ts
  class SimpleCipher (line 1) | class SimpleCipher {
    method encode (line 2) | encode(/* Parameters go here */) {
    method decode (line 6) | decode(/* Parameters go here */) {

FILE: exercises/practice/space-age/.meta/proof.ci.ts
  constant EARTH_TO_OTHER_PLANETS (line 1) | const EARTH_TO_OTHER_PLANETS = {

FILE: exercises/practice/space-age/space-age.ts
  function age (line 1) | function age(planet: unknown, seconds: unknown): unknown {

FILE: exercises/practice/spiral-matrix/.meta/proof.ci.ts
  function ofSize (line 1) | function ofSize(size: number): number[][] {

FILE: exercises/practice/spiral-matrix/spiral-matrix.ts
  function ofSize (line 1) | function ofSize() {

FILE: exercises/practice/split-second-stopwatch/.meta/proof.ci.ts
  type State (line 1) | type State = 'ready' | 'running' | 'stopped'
  class SplitSecondStopwatch (line 3) | class SplitSecondStopwatch {
    method state (line 9) | public get state(): State {
    method currentLap (line 13) | public get currentLap(): string {
    method total (line 17) | public get total(): string {
    method previousLaps (line 21) | public get previousLaps(): string[] {
    method start (line 25) | public start(): void {
    method stop (line 32) | public stop(): void {
    method lap (line 39) | public lap(): void {
    method reset (line 47) | public reset(): void {
    method advanceTime (line 57) | public advanceTime(duration: string): void {
    method toSeconds (line 65) | private toSeconds(duration: string): number {
    method formatTime (line 70) | private formatTime(seconds: number): string {

FILE: exercises/practice/split-second-stopwatch/split-second-stopwatch.ts
  class SplitSecondStopwatch (line 1) | class SplitSecondStopwatch {
    method constructor (line 2) | constructor() {
    method state (line 6) | public get state(): unknown {
    method currentLap (line 10) | public get currentLap(): unknown {
    method total (line 14) | public get total(): unknown {
    method previousLaps (line 18) | public get previousLaps(): unknown[] {
    method start (line 22) | public start(): unknown {
    method stop (line 26) | public stop(): unknown {
    method lap (line 30) | public lap(): unknown {
    method reset (line 34) | public reset(): unknown {
    method advanceTime (line 38) | public advanceTime(duration: unknown): unknown {

FILE: exercises/practice/square-root/.meta/proof.ci.ts
  function squareRoot (line 1) | function squareRoot(radicand: number): number {

FILE: exercises/practice/square-root/square-root.ts
  function squareRoot (line 1) | function squareRoot(radicand: unknown): unknown {

FILE: exercises/practice/strain/.meta/proof.ci.ts
  type Predicate (line 1) | interface Predicate<T> {
  function keep (line 5) | function keep<T>(array: T[], predicate: Predicate<T>): T[] {
  function discard (line 15) | function discard<T>(array: T[], predicate: Predicate<T>): T[] {

FILE: exercises/practice/strain/strain.ts
  function keep (line 1) | function keep<T>() {
  function discard (line 5) | function discard<T>() {

FILE: exercises/practice/sublist/.meta/proof.ci.ts
  class List (line 1) | class List {
    method constructor (line 4) | constructor(...list: number[]) {
    method compare (line 8) | public compare(other: List): 'sublist' | 'superlist' | 'unequal' | 'eq...
    method lengthDiff (line 21) | private lengthDiff(listOne: List, listTwo: List): string {
    method isSublist (line 25) | private isSublist(listOne: number[], listTwo: number[]): boolean {

FILE: exercises/practice/sublist/sublist.ts
  class List (line 1) | class List {
    method constructor (line 2) | constructor() {
    method compare (line 6) | compare() {

FILE: exercises/practice/sum-of-multiples/sum-of-multiples.ts
  function sum (line 1) | function sum() {

FILE: exercises/practice/tournament/.meta/proof.ci.ts
  class TeamStats (line 1) | class TeamStats {
    method points (line 7) | public get points(): number {
    method constructor (line 11) | constructor(public name: string) {}
    method getStatTableRow (line 13) | public getStatTableRow(): string {
  class Tournament (line 29) | class Tournament {
    method tally (line 35) | public tally(input: string): string {
    method applyResult (line 70) | private applyResult(

FILE: exercises/practice/tournament/tournament.ts
  class Tournament (line 1) | class Tournament {
    method tally (line 3) | public tally(input: string): string {

FILE: exercises/practice/transpose/.meta/proof.ci.ts
  function transpose (line 13) | function transpose(lines: string[]): string[] {

FILE: exercises/practice/transpose/transpose.ts
  function transpose (line 1) | function transpose() {

FILE: exercises/practice/triangle/.meta/proof.ci.ts
  class Triangle (line 1) | class Triangle {
    method constructor (line 4) | constructor(...sides: number[]) {
    method isValid (line 8) | public get isValid(): boolean {
    method isEquilateral (line 16) | public get isEquilateral(): boolean {
    method isIsosceles (line 24) | public get isIsosceles(): boolean {
    method isScalene (line 32) | public get isScalene(): boolean {

FILE: exercises/practice/triangle/triangle.ts
  class Triangle (line 1) | class Triangle {
    method constructor (line 2) | constructor(...sides) {
    method isEquilateral (line 6) | get isEquilateral() {
    method isIsosceles (line 10) | get isIsosceles() {
    method isScalene (line 14) | get isScalene() {

FILE: exercises/practice/twelve-days/.meta/proof.ci.ts
  function recite (line 31) | function recite(startVerse: number, endVerse: number): string {
  function reciteVerse (line 39) | function reciteVerse(verse: number): string {

FILE: exercises/practice/twelve-days/twelve-days.ts
  function recite (line 1) | function recite() {

FILE: exercises/practice/two-bucket/.meta/proof.ci.ts
  class Bucket (line 1) | class Bucket {
    method constructor (line 6) | constructor(name: string, size: number) {
    method available (line 13) | public get available(): number {
    method isFull (line 16) | public get isFull(): boolean {
    method isEmpty (line 19) | public get isEmpty(): boolean {
    method fill (line 23) | public fill(): void {
    method empty (line 26) | public empty(): void {
    method pourInto (line 30) | public pourInto(other: Bucket): void {
  class TwoBucket (line 40) | class TwoBucket {
    method constructor (line 46) | constructor(size1: number, size2: number, goal: number, start: string) {
    method first (line 55) | private get first(): Bucket {
    method second (line 58) | private get second(): Bucket {
    method validate (line 62) | private validate(): void {
    method moves (line 74) | private moves(): number {

FILE: exercises/practice/two-bucket/two-bucket.ts
  class TwoBucket (line 1) | class TwoBucket {
    method constructor (line 2) | constructor() {
    method moves (line 6) | moves() {
    method goalBucket (line 10) | get goalBucket() {
    method otherBucket (line 14) | get otherBucket() {

FILE: exercises/practice/two-fer/.meta/proof.ci.ts
  function twoFer (line 1) | function twoFer(name = 'you'): string {

FILE: exercises/practice/two-fer/two-fer.ts
  function twoFer (line 5) | function twoFer(): string {

FILE: exercises/practice/variable-length-quantity/.meta/proof.ci.ts
  constant LENGTH (line 1) | const LENGTH = 7
  constant CONT_BITS (line 2) | const CONT_BITS = 1 << LENGTH
  constant DATA_BITS (line 3) | const DATA_BITS = CONT_BITS - 1
  function encodeOne (line 5) | function encodeOne(val: number): number[] {
  function decodeOne (line 18) | function decodeOne(buf: number[]): number {
  function encode (line 27) | function encode(data: number[]): number[] {
  function decode (line 36) | function decode(data: number[]): number[] {

FILE: exercises/practice/variable-length-quantity/variable-length-quantity.ts
  function encode (line 1) | function encode() {
  function decode (line 5) | function decode() {

FILE: exercises/practice/word-count/.meta/proof.ci.ts
  function count (line 1) | function count(input: string): Map<string, number> {

FILE: exercises/practice/word-count/word-count.ts
  function count (line 1) | function count() {

FILE: exercises/practice/word-search/.meta/proof.ci.ts
  type Result (line 1) | interface Result {
  class WordSearch (line 6) | class WordSearch {
    method constructor (line 8) | constructor(grid: string[]) {
    method findCoordsWhereLetterMatch (line 11) | private findCoordsWhereLetterMatch(
    method getCoordsOfSurroundingLetters (line 43) | private getCoordsOfSurroundingLetters(
    method getValueFromCoordinate (line 78) | private getValueFromCoordinate(
    method matchingValues (line 87) | private matchingValues(
    method getDirectionFunction (line 95) | private getDirectionFunction(
    method getValidNeighbouringCoordinates (line 105) | private getValidNeighbouringCoordinates(
    method findOne (line 119) | private findOne(word: string, board: string[]): Result {
    method find (line 174) | public find(

FILE: exercises/practice/word-search/word-search.ts
  class WordSearch (line 1) | class WordSearch {
    method constructor (line 2) | constructor() {
    method find (line 6) | public find(words: string[]) {

FILE: exercises/practice/yacht/.meta/proof.ci.ts
  type Category (line 1) | const enum Category {

FILE: exercises/practice/yacht/.yarn/releases/yarn-3.6.4.cjs
  function rfe (line 4) | function rfe(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT...
  function SK (line 4) | function SK(r,e,t){return!r.isSymbolicLink()&&!r.isFile()?!1:rfe(e,t)}
  function vK (line 4) | function vK(r,e,t){QK.stat(r,function(i,n){t(i,i?!1:SK(n,r,e))})}
  function ife (line 4) | function ife(r,e){return SK(QK.statSync(r),r,e)}
  function kK (line 4) | function kK(r,e,t){DK.stat(r,function(i,n){t(i,i?!1:RK(n,e))})}
  function nfe (line 4) | function nfe(r,e){return RK(DK.statSync(r),e)}
  function RK (line 4) | function RK(r,e){return r.isFile()&&sfe(r,e)}
  function sfe (line 4) | function sfe(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:pr...
  function SS (line 4) | function SS(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Pro...
  function ofe (line 4) | function ofe(r,e){try{return lI.sync(r,e||{})}catch(t){if(e&&e.ignoreErr...
  function WK (line 4) | function WK(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.op...
  function ufe (line 4) | function ufe(r){return WK(r)||WK(r,!0)}
  function gfe (line 4) | function gfe(r){return r=r.replace(xS,"^$1"),r}
  function ffe (line 4) | function ffe(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.r...
  function dfe (line 4) | function dfe(r){let t=Buffer.alloc(150),i;try{i=DS.openSync(r,"r"),DS.re...
  function wfe (line 4) | function wfe(r){r.file=iU(r);let e=r.file&&mfe(r.file);return e?(r.args....
  function Bfe (line 4) | function Bfe(r){if(!Efe)return r;let e=wfe(r),t=!Ife.test(e);if(r.option...
  function bfe (line 4) | function bfe(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[]...
  function RS (line 4) | function RS(r,e){return Object.assign(new Error(`${e} ${r.command} ENOEN...
  function Qfe (line 4) | function Qfe(r,e){if(!kS)return;let t=r.emit;r.emit=function(i,n){if(i==...
  function aU (line 4) | function aU(r,e){return kS&&r===1&&!e.file?RS(e.original,"spawn"):null}
  function Sfe (line 4) | function Sfe(r,e){return kS&&r===1&&!e.file?RS(e.original,"spawnSync"):n...
  function uU (line 4) | function uU(r,e,t){let i=FS(r,e,t),n=cU.spawn(i.command,i.args,i.options...
  function vfe (line 4) | function vfe(r,e,t){let i=FS(r,e,t),n=cU.spawnSync(i.command,i.args,i.op...
  function xfe (line 4) | function xfe(r,e){function t(){this.constructor=r}t.prototype=e.prototyp...
  function Zl (line 4) | function Zl(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.lo...
  function i (line 4) | function i(c){return c.charCodeAt(0).toString(16).toUpperCase()}
  function n (line 4) | function n(c){return c.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function s (line 4) | function s(c){return c.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function o (line 4) | function o(c){return t[c.type](c)}
  function a (line 4) | function a(c){var u=new Array(c.length),g,f;for(g=0;g<c.length;g++)u[g]=...
  function l (line 4) | function l(c){return c?'"'+n(c)+'"':"end of input"}
  function Pfe (line 4) | function Pfe(r,e){e=e!==void 0?e:{};var t={},i={Start:SA},n=SA,s=functio...
  function Dfe (line 7) | function Dfe(r,e){function t(){this.constructor=r}t.prototype=e.prototyp...
  function $l (line 7) | function $l(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.lo...
  function i (line 7) | function i(c){return c.charCodeAt(0).toString(16).toUpperCase()}
  function n (line 7) | function n(c){return c.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function s (line 7) | function s(c){return c.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function o (line 7) | function o(c){return t[c.type](c)}
  function a (line 7) | function a(c){var u=new Array(c.length),g,f;for(g=0;g<c.length;g++)u[g]=...
  function l (line 7) | function l(c){return c?'"'+n(c)+'"':"end of input"}
  function kfe (line 7) | function kfe(r,e){e=e!==void 0?e:{};var t={},i={resolution:le},n=le,s="/...
  function mU (line 7) | function mU(r){return typeof r>"u"||r===null}
  function Rfe (line 7) | function Rfe(r){return typeof r=="object"&&r!==null}
  function Ffe (line 7) | function Ffe(r){return Array.isArray(r)?r:mU(r)?[]:[r]}
  function Nfe (line 7) | function Nfe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t...
  function Tfe (line 7) | function Tfe(r,e){var t="",i;for(i=0;i<e;i+=1)t+=r;return t}
  function Lfe (line 7) | function Lfe(r){return r===0&&Number.NEGATIVE_INFINITY===1/r}
  function Vp (line 7) | function Vp(r,e){Error.call(this),this.name="YAMLException",this.reason=...
  function HS (line 7) | function HS(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.li...
  function Kfe (line 11) | function Kfe(r){var e={};return r!==null&&Object.keys(r).forEach(functio...
  function Ufe (line 11) | function Ufe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(Ofe.i...
  function GS (line 11) | function GS(r,e,t){var i=[];return r.include.forEach(function(n){t=GS(n,...
  function Gfe (line 11) | function Gfe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;...
  function Tg (line 11) | function Tg(r){this.include=r.include||[],this.implicit=r.implicit||[],t...
  function zfe (line 11) | function zfe(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~...
  function Vfe (line 11) | function Vfe(){return null}
  function Xfe (line 11) | function Xfe(r){return r===null}
  function _fe (line 11) | function _fe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="...
  function $fe (line 11) | function $fe(r){return r==="true"||r==="True"||r==="TRUE"}
  function ehe (line 11) | function ehe(r){return Object.prototype.toString.call(r)==="[object Bool...
  function ihe (line 11) | function ihe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}
  function nhe (line 11) | function nhe(r){return 48<=r&&r<=55}
  function she (line 11) | function she(r){return 48<=r&&r<=57}
  function ohe (line 11) | function ohe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)ret...
  function ahe (line 11) | function ahe(r){var e=r,t=1,i,n,s=[];return e.indexOf("_")!==-1&&(e=e.re...
  function Ahe (line 11) | function Ahe(r){return Object.prototype.toString.call(r)==="[object Numb...
  function uhe (line 11) | function uhe(r){return!(r===null||!che.test(r)||r[r.length-1]==="_")}
  function ghe (line 11) | function ghe(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=...
  function hhe (line 11) | function hhe(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".na...
  function phe (line 11) | function phe(r){return Object.prototype.toString.call(r)==="[object Numb...
  function Ehe (line 11) | function Ehe(r){return r===null?!1:qU.exec(r)!==null||JU.exec(r)!==null}
  function Ihe (line 11) | function Ihe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=qU.exec(r),e===n...
  function yhe (line 11) | function yhe(r){return r.toISOString()}
  function Bhe (line 11) | function Bhe(r){return r==="<<"||r===null}
  function Qhe (line 12) | function Qhe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=qS;for(t=0...
  function She (line 12) | function She(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=qS,o=0,a...
  function vhe (line 12) | function vhe(r){var e="",t=0,i,n,s=r.length,o=qS;for(i=0;i<s;i++)i%3===0...
  function xhe (line 12) | function xhe(r){return ic&&ic.isBuffer(r)}
  function Rhe (line 12) | function Rhe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a....
  function Fhe (line 12) | function Fhe(r){return r!==null?r:[]}
  function Lhe (line 12) | function Lhe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o...
  function Ohe (line 12) | function Ohe(r){if(r===null)return[];var e,t,i,n,s,o=r;for(s=new Array(o...
  function Uhe (line 12) | function Uhe(r){if(r===null)return!0;var e,t=r;for(e in t)if(Khe.call(t,...
  function Hhe (line 12) | function Hhe(r){return r!==null?r:{}}
  function jhe (line 12) | function jhe(){return!0}
  function qhe (line 12) | function qhe(){}
  function Jhe (line 12) | function Jhe(){return""}
  function Whe (line 12) | function Whe(r){return typeof r>"u"}
  function Vhe (line 12) | function Vhe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)...
  function Xhe (line 12) | function Xhe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&...
  function Zhe (line 12) | function Zhe(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multi...
  function _he (line 12) | function _he(r){return Object.prototype.toString.call(r)==="[object RegE...
  function epe (line 12) | function epe(r){if(r===null)return!1;try{var e="("+r+")",t=mI.parse(e,{r...
  function tpe (line 12) | function tpe(r){var e="("+r+")",t=mI.parse(e,{range:!0}),i=[],n;if(t.typ...
  function rpe (line 12) | function rpe(r){return r.toString()}
  function ipe (line 12) | function ipe(r){return Object.prototype.toString.call(r)==="[object Func...
  function C2 (line 12) | function C2(r){return Object.prototype.toString.call(r)}
  function xo (line 12) | function xo(r){return r===10||r===13}
  function sc (line 12) | function sc(r){return r===9||r===32}
  function fn (line 12) | function fn(r){return r===9||r===32||r===10||r===13}
  function Og (line 12) | function Og(r){return r===44||r===91||r===93||r===123||r===125}
  function cpe (line 12) | function cpe(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-9...
  function upe (line 12) | function upe(r){return r===120?2:r===117?4:r===85?8:0}
  function gpe (line 12) | function gpe(r){return 48<=r&&r<=57?r-48:-1}
  function m2 (line 12) | function m2(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r==...
  function fpe (line 13) | function fpe(r){return r<=65535?String.fromCharCode(r):String.fromCharCo...
  function hpe (line 13) | function hpe(r,e){this.input=r,this.filename=e.filename||null,this.schem...
  function D2 (line 13) | function D2(r,e){return new w2(e,new npe(r.filename,r.input,r.position,r...
  function ft (line 13) | function ft(r,e){throw D2(r,e)}
  function yI (line 13) | function yI(r,e){r.onWarning&&r.onWarning.call(null,D2(r,e))}
  function DA (line 13) | function DA(r,e,t,i){var n,s,o,a;if(e<t){if(a=r.input.slice(e,t),i)for(n...
  function I2 (line 13) | function I2(r,e,t,i){var n,s,o,a;for(Ba.isObject(t)||ft(r,"cannot merge ...
  function Mg (line 13) | function Mg(r,e,t,i,n,s,o,a){var l,c;if(Array.isArray(n))for(n=Array.pro...
  function WS (line 13) | function WS(r){var e;e=r.input.charCodeAt(r.position),e===10?r.position+...
  function zr (line 13) | function zr(r,e,t){for(var i=0,n=r.input.charCodeAt(r.position);n!==0;){...
  function wI (line 13) | function wI(r){var e=r.position,t;return t=r.input.charCodeAt(e),!!((t==...
  function zS (line 13) | function zS(r,e){e===1?r.result+=" ":e>1&&(r.result+=Ba.repeat(`
  function ppe (line 14) | function ppe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.inp...
  function dpe (line 14) | function dpe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)r...
  function Cpe (line 14) | function Cpe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!...
  function mpe (line 14) | function mpe(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,C,y...
  function Epe (line 14) | function Epe(r,e){var t,i,n=JS,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.c...
  function y2 (line 20) | function y2(r,e){var t,i=r.tag,n=r.anchor,s=[],o,a=!1,l;for(r.anchor!==n...
  function Ipe (line 20) | function Ipe(r,e,t){var i,n,s,o,a=r.tag,l=r.anchor,c={},u={},g=null,f=nu...
  function ype (line 20) | function ype(r){var e,t=!1,i=!1,n,s,o;if(o=r.input.charCodeAt(r.position...
  function wpe (line 20) | function wpe(r){var e,t;if(t=r.input.charCodeAt(r.position),t!==38)retur...
  function Bpe (line 20) | function Bpe(r){var e,t,i;if(i=r.input.charCodeAt(r.position),i!==42)ret...
  function Kg (line 20) | function Kg(r,e,t,i,n){var s,o,a,l=1,c=!1,u=!1,g,f,h,p,C;if(r.listener!=...
  function bpe (line 20) | function bpe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.check...
  function k2 (line 20) | function k2(r,e){r=String(r),e=e||{},r.length!==0&&(r.charCodeAt(r.lengt...
  function R2 (line 21) | function R2(r,e,t){e!==null&&typeof e=="object"&&typeof t>"u"&&(t=e,e=nu...
  function F2 (line 21) | function F2(r,e){var t=k2(r,e);if(t.length!==0){if(t.length===1)return t...
  function Qpe (line 21) | function Qpe(r,e,t){return typeof e=="object"&&e!==null&&typeof t>"u"&&(...
  function Spe (line 21) | function Spe(r,e){return F2(r,Ba.extend({schema:B2},e))}
  function Jpe (line 21) | function Jpe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Obje...
  function T2 (line 21) | function T2(r){var e,t,i;if(e=r.toString(16).toUpperCase(),r<=255)t="x",...
  function Wpe (line 21) | function Wpe(r){this.schema=r.schema||vpe,this.indent=Math.max(1,r.inden...
  function L2 (line 21) | function L2(r,e){for(var t=$p.repeat(" ",e),i=0,n=-1,s="",o,a=r.length;i...
  function VS (line 23) | function VS(r,e){return`
  function zpe (line 24) | function zpe(r,e){var t,i,n;for(t=0,i=r.implicitTypes.length;t<i;t+=1)if...
  function ZS (line 24) | function ZS(r){return r===kpe||r===Ppe}
  function Ug (line 24) | function Ug(r){return 32<=r&&r<=126||161<=r&&r<=55295&&r!==8232&&r!==823...
  function Vpe (line 24) | function Vpe(r){return Ug(r)&&!ZS(r)&&r!==65279&&r!==Dpe&&r!==_p}
  function O2 (line 24) | function O2(r,e){return Ug(r)&&r!==65279&&r!==q2&&r!==W2&&r!==z2&&r!==V2...
  function Xpe (line 24) | function Xpe(r){return Ug(r)&&r!==65279&&!ZS(r)&&r!==Mpe&&r!==Hpe&&r!==J...
  function Z2 (line 24) | function Z2(r){var e=/^\n* /;return e.test(r)}
  function Zpe (line 24) | function Zpe(r,e,t,i,n){var s,o,a,l=!1,c=!1,u=i!==-1,g=-1,f=Xpe(r.charCo...
  function _pe (line 24) | function _pe(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r...
  function M2 (line 24) | function M2(r,e){var t=Z2(r)?String(e):"",i=r[r.length-1]===`
  function K2 (line 28) | function K2(r){return r[r.length-1]===`
  function $pe (line 29) | function $pe(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(`
  function U2 (line 32) | function U2(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0...
  function ede (line 35) | function ede(r){for(var e="",t,i,n,s=0;s<r.length;s++){if(t=r.charCodeAt...
  function tde (line 35) | function tde(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s<o;s+=1)oc(...
  function rde (line 35) | function rde(r,e,t,i){var n="",s=r.tag,o,a;for(o=0,a=t.length;o<a;o+=1)o...
  function ide (line 35) | function ide(r,e,t){var i="",n=r.tag,s=Object.keys(t),o,a,l,c,u;for(o=0,...
  function nde (line 35) | function nde(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r...
  function H2 (line 35) | function H2(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTyp...
  function oc (line 35) | function oc(r,e,t,i,n,s){r.tag=null,r.dump=t,H2(r,t,!1)||H2(r,t,!0);var ...
  function sde (line 35) | function sde(r,e){var t=[],i=[],n,s;for(XS(r,t,i),n=0,s=i.length;n<s;n+=...
  function XS (line 35) | function XS(r,e,t){var i,n,s;if(r!==null&&typeof r=="object")if(n=e.inde...
  function rH (line 35) | function rH(r,e){e=e||{};var t=new Wpe(e);return t.noRefs||sde(r,t),oc(t...
  function ode (line 36) | function ode(r,e){return rH(r,$p.extend({schema:xpe},e))}
  function QI (line 36) | function QI(r){return function(){throw new Error("Function "+r+" is depr...
  function Ade (line 36) | function Ade(r,e){function t(){this.constructor=r}t.prototype=e.prototyp...
  function ac (line 36) | function ac(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.lo...
  function i (line 36) | function i(c){return c.charCodeAt(0).toString(16).toUpperCase()}
  function n (line 36) | function n(c){return c.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function s (line 36) | function s(c){return c.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function o (line 36) | function o(c){return t[c.type](c)}
  function a (line 36) | function a(c){var u=new Array(c.length),g,f;for(g=0;g<c.length;g++)u[g]=...
  function l (line 36) | function l(c){return c?'"'+n(c)+'"':"end of input"}
  function lde (line 36) | function lde(r,e){e=e!==void 0?e:{};var t={},i={Start:Hs},n=Hs,s=functio...
  function CH (line 45) | function CH(r){return typeof r=="string"?!!Po[r]:Object.keys(r).every(fu...
  function Qt (line 45) | function Qt({test:r}){return QH(r)()}
  function Vr (line 45) | function Vr(r){return r===null?"null":r===void 0?"undefined":r===""?"an ...
  function RA (line 45) | function RA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void ...
  function cc (line 45) | function cc(r,e){return t=>{let i=r[e];return r[e]=t,cc(r,e).bind(null,i)}}
  function SH (line 45) | function SH(r,e){return t=>{r[e]=t}}
  function kI (line 45) | function kI(r,e,t){return r===1?e:t}
  function pt (line 45) | function pt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."...
  function dde (line 45) | function dde(r){return Qt({test:(e,t)=>e!==r?pt(t,`Expected a literal (g...
  function Zi (line 45) | function Zi(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);re...
  method constructor (line 45) | constructor(e,t){if(t=BCe(t),e instanceof Yn){if(e.loose===!!t.loose&&e....
  method format (line 45) | format(){return this.version=`${this.major}.${this.minor}.${this.patch}`...
  method toString (line 45) | toString(){return this.version}
  method compare (line 45) | compare(e){if(MI("SemVer.compare",this.version,this.options,e),!(e insta...
  method compareMain (line 45) | compareMain(e){return e instanceof Yn||(e=new Yn(e,this.options)),pd(thi...
  method comparePre (line 45) | comparePre(e){if(e instanceof Yn||(e=new Yn(e,this.options)),this.prerel...
  method compareBuild (line 45) | compareBuild(e){e instanceof Yn||(e=new Yn(e,this.options));let t=0;do{l...
  method inc (line 45) | inc(e,t){switch(e){case"premajor":this.prerelease.length=0,this.patch=0,...
  function Ht (line 45) | function Ht(r){var e=this;if(e instanceof Ht||(e=new Ht),e.tail=null,e.h...
  function yme (line 45) | function yme(r,e,t){var i=e===r.head?new fc(t,null,e,r):new fc(t,e,e.nex...
  function wme (line 45) | function wme(r,e){r.tail=new fc(e,r.tail,null,r),r.head||(r.head=r.tail)...
  function Bme (line 45) | function Bme(r,e){r.head=new fc(e,null,r.head,r),r.tail||(r.tail=r.head)...
  function fc (line 45) | function fc(r,e,t,i){if(!(this instanceof fc))return new fc(r,e,t,i);thi...
  method constructor (line 45) | constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(type...
  method max (line 45) | set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a...
  method max (line 45) | get max(){return this[hc]}
  method allowStale (line 45) | set allowStale(e){this[md]=!!e}
  method allowStale (line 45) | get allowStale(){return this[md]}
  method maxAge (line 45) | set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be ...
  method maxAge (line 45) | get maxAge(){return this[pc]}
  method lengthCalculator (line 45) | set lengthCalculator(e){typeof e!="function"&&(e=Ev),e!==this[Wg]&&(this...
  method lengthCalculator (line 45) | get lengthCalculator(){return this[Wg]}
  method length (line 45) | get length(){return this[va]}
  method itemCount (line 45) | get itemCount(){return this[di].length}
  method rforEach (line 45) | rforEach(e,t){t=t||this;for(let i=this[di].tail;i!==null;){let n=i.prev;...
  method forEach (line 45) | forEach(e,t){t=t||this;for(let i=this[di].head;i!==null;){let n=i.next;X...
  method keys (line 45) | keys(){return this[di].toArray().map(e=>e.key)}
  method values (line 45) | values(){return this[di].toArray().map(e=>e.value)}
  method reset (line 45) | reset(){this[Sa]&&this[di]&&this[di].length&&this[di].forEach(e=>this[Sa...
  method dump (line 45) | dump(){return this[di].map(e=>zI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(...
  method dumpLru (line 45) | dumpLru(){return this[di]}
  method set (line 45) | set(e,t,i){if(i=i||this[pc],i&&typeof i!="number")throw new TypeError("m...
  method has (line 45) | has(e){if(!this[Zs].has(e))return!1;let t=this[Zs].get(e).value;return!z...
  method get (line 45) | get(e){return Iv(this,e,!0)}
  method peek (line 45) | peek(e){return Iv(this,e,!1)}
  method pop (line 45) | pop(){let e=this[di].tail;return e?(zg(this,e),e.value):null}
  method del (line 45) | del(e){zg(this,this[Zs].get(e))}
  method load (line 45) | load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let...
  method prune (line 45) | prune(){this[Zs].forEach((e,t)=>Iv(this,t,!1))}
  method constructor (line 45) | constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,...
  method constructor (line 45) | constructor(e,t){if(t=Sme(t),e instanceof dc)return e.loose===!!t.loose&...
  method format (line 45) | format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||"...
  method toString (line 45) | toString(){return this.range}
  method parseRange (line 45) | parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).j...
  method intersects (line 45) | intersects(e,t){if(!(e instanceof dc))throw new TypeError("a Range is re...
  method test (line 45) | test(e){if(!e)return!1;if(typeof e=="string")try{e=new vme(e,this.option...
  method ANY (line 45) | static get ANY(){return Id}
  method constructor (line 45) | constructor(e,t){if(t=Yme(t),e instanceof Vg){if(e.loose===!!t.loose)ret...
  method parse (line 45) | parse(e){let t=this.options.loose?nY[sY.COMPARATORLOOSE]:nY[sY.COMPARATO...
  method toString (line 45) | toString(){return this.value}
  method test (line 45) | test(e){if(Qv("Comparator.test",e,this.options.loose),this.semver===Id||...
  method intersects (line 45) | intersects(e,t){if(!(e instanceof Vg))throw new TypeError("a Comparator ...
  function isEmpty (line 45) | function isEmpty(r){return r&&r.length===0}
  function keys (line 45) | function keys(r){return r==null?[]:Object.keys(r)}
  function values (line 45) | function values(r){for(var e=[],t=Object.keys(r),i=0;i<t.length;i++)e.pu...
  function mapValues (line 45) | function mapValues(r,e){for(var t=[],i=keys(r),n=0;n<i.length;n++){var s...
  function map (line 45) | function map(r,e){for(var t=[],i=0;i<r.length;i++)t.push(e.call(null,r[i...
  function flatten (line 45) | function flatten(r){for(var e=[],t=0;t<r.length;t++){var i=r[t];Array.is...
  function first (line 45) | function first(r){return isEmpty(r)?void 0:r[0]}
  function last (line 45) | function last(r){var e=r&&r.length;return e?r[e-1]:void 0}
  function forEach (line 45) | function forEach(r,e){if(Array.isArray(r))for(var t=0;t<r.length;t++)e.c...
  function isString (line 45) | function isString(r){return typeof r=="string"}
  function isUndefined (line 45) | function isUndefined(r){return r===void 0}
  function isFunction (line 45) | function isFunction(r){return r instanceof Function}
  function drop (line 45) | function drop(r,e){return e===void 0&&(e=1),r.slice(e,r.length)}
  function dropRight (line 45) | function dropRight(r,e){return e===void 0&&(e=1),r.slice(0,r.length-e)}
  function filter (line 45) | function filter(r,e){var t=[];if(Array.isArray(r))for(var i=0;i<r.length...
  function reject (line 45) | function reject(r,e){return filter(r,function(t){return!e(t)})}
  function pick (line 45) | function pick(r,e){for(var t=Object.keys(r),i={},n=0;n<t.length;n++){var...
  function has (line 45) | function has(r,e){return isObject(r)?r.hasOwnProperty(e):!1}
  function contains (line 45) | function contains(r,e){return find(r,function(t){return t===e})!==void 0}
  function cloneArr (line 45) | function cloneArr(r){for(var e=[],t=0;t<r.length;t++)e.push(r[t]);return e}
  function cloneObj (line 45) | function cloneObj(r){var e={};for(var t in r)Object.prototype.hasOwnProp...
  function find (line 45) | function find(r,e){for(var t=0;t<r.length;t++){var i=r[t];if(e.call(null...
  function findAll (line 45) | function findAll(r,e){for(var t=[],i=0;i<r.length;i++){var n=r[i];e.call...
  function reduce (line 45) | function reduce(r,e,t){for(var i=Array.isArray(r),n=i?r:values(r),s=i?[]...
  function compact (line 45) | function compact(r){return reject(r,function(e){return e==null})}
  function uniq (line 45) | function uniq(r,e){e===void 0&&(e=function(i){return i});var t=[];return...
  function partial (line 45) | function partial(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=argum...
  function isArray (line 45) | function isArray(r){return Array.isArray(r)}
  function isRegExp (line 45) | function isRegExp(r){return r instanceof RegExp}
  function isObject (line 45) | function isObject(r){return r instanceof Object}
  function every (line 45) | function every(r,e){for(var t=0;t<r.length;t++)if(!e(r[t],t))return!1;re...
  function difference (line 45) | function difference(r,e){return reject(r,function(t){return contains(e,t...
  function some (line 45) | function some(r,e){for(var t=0;t<r.length;t++)if(e(r[t]))return!0;return!1}
  function indexOf (line 45) | function indexOf(r,e){for(var t=0;t<r.length;t++)if(r[t]===e)return t;re...
  function sortBy (line 45) | function sortBy(r,e){var t=cloneArr(r);return t.sort(function(i,n){retur...
  function zipObject (line 45) | function zipObject(r,e){if(r.length!==e.length)throw Error("can't zipObj...
  function assign (line 45) | function assign(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=argume...
  function assignNoOverwrite (line 45) | function assignNoOverwrite(r){for(var e=[],t=1;t<arguments.length;t++)e[...
  function defaults (line 45) | function defaults(){for(var r=[],e=0;e<arguments.length;e++)r[e]=argumen...
  function groupBy (line 45) | function groupBy(r,e){var t={};return forEach(r,function(i){var n=e(i),s...
  function merge (line 45) | function merge(r,e){for(var t=cloneObj(r),i=keys(e),n=0;n<i.length;n++){...
  function NOOP (line 45) | function NOOP(){}
  function IDENTITY (line 45) | function IDENTITY(r){return r}
  function packArray (line 45) | function packArray(r){for(var e=[],t=0;t<r.length;t++){var i=r[t];e.push...
  function PRINT_ERROR (line 45) | function PRINT_ERROR(r){console&&console.error&&console.error("Error: "+r)}
  function PRINT_WARNING (line 45) | function PRINT_WARNING(r){console&&console.warn&&console.warn("Warning: ...
  function isES2015MapSupported (line 45) | function isES2015MapSupported(){return typeof Map=="function"}
  function peek (line 45) | function peek(r){return r[r.length-1]}
  function timer (line 45) | function timer(r){var e=new Date().getTime(),t=r(),i=new Date().getTime(...
  function toFastProperties (line 45) | function toFastProperties(toBecomeFast){function FakeConstructor(){}Fake...
  function upperFirst (line 45) | function upperFirst(r){if(!r)return r;var e=getCharacterFromCodePointAt(...
  function getCharacterFromCodePointAt (line 45) | function getCharacterFromCodePointAt(r,e){var t=r.substring(e,e+1);retur...
  function r (line 45) | function r(){}
  function n (line 52) | function n(p){return p.charCodeAt(0)}
  function s (line 52) | function s(p,C){p.length!==void 0?p.forEach(function(y){C.push(y)}):C.pu...
  function o (line 52) | function o(p,C){if(p[C]===!0)throw"duplicate flag "+C;p[C]=!0}
  function a (line 52) | function a(p){if(p===void 0)throw Error("Internal Error - Should never g...
  function l (line 52) | function l(){throw Error("Internal Error - Should never get here!")}
  function h (line 53) | function h(){}
  function wEe (line 53) | function wEe(r){var e=r.toString();if(ey.hasOwnProperty(e))return ey[e];...
  function BEe (line 53) | function BEe(){ey={}}
  function i (line 53) | function i(){this.constructor=e}
  function QEe (line 54) | function QEe(r,e){e===void 0&&(e=!1);try{var t=(0,YY.getRegExpAst)(r),i=...
  function iy (line 62) | function iy(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i<r.valu...
  function ry (line 62) | function ry(r,e,t){var i=(0,xa.charCodeToOptimizedIndex)(r);e[i]=i,t===!...
  function SEe (line 62) | function SEe(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==...
  function HY (line 62) | function HY(r,e){return(0,gs.find)(r.value,function(t){if(typeof t=="num...
  function kv (line 62) | function kv(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?...
  function e (line 62) | function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.foun...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function xEe (line 62) | function xEe(r,e){if(e instanceof RegExp){var t=(0,YY.getRegExpAst)(e),i...
  function i (line 62) | function i(){this.constructor=e}
  function PEe (line 62) | function PEe(){Ve.SUPPORT_STICKY=!1}
  function DEe (line 62) | function DEe(){Ve.SUPPORT_STICKY=!0}
  function kEe (line 62) | function kEe(r,e){e=(0,xe.defaults)(e,{useSticky:Ve.SUPPORT_STICKY,debug...
  function REe (line 68) | function REe(r,e){var t=[],i=VY(r);t=t.concat(i.errors);var n=XY(i.valid...
  function FEe (line 68) | function FEe(r){var e=[],t=(0,xe.filter)(r,function(i){return(0,xe.isReg...
  function VY (line 68) | function VY(r){var e=(0,xe.filter)(r,function(n){return!(0,xe.has)(n,ko)...
  function XY (line 68) | function XY(r){var e=(0,xe.filter)(r,function(n){var s=n[ko];return!(0,x...
  function ZY (line 68) | function ZY(r){var e=function(n){JY(s,n);function s(){var o=n!==null&&n....
  function _Y (line 70) | function _Y(r){var e=(0,xe.filter)(r,function(i){var n=i[ko];return n.te...
  function $Y (line 70) | function $Y(r){var e=function(n){JY(s,n);function s(){var o=n!==null&&n....
  function ej (line 72) | function ej(r){var e=(0,xe.filter)(r,function(i){var n=i[ko];return n in...
  function tj (line 72) | function tj(r){var e=[],t=(0,xe.map)(r,function(s){return(0,xe.reduce)(r...
  function rj (line 72) | function rj(r){var e=(0,xe.filter)(r,function(i){if(!(0,xe.has)(i,"GROUP...
  function ij (line 72) | function ij(r,e){var t=(0,xe.filter)(r,function(n){return n.PUSH_MODE!==...
  function nj (line 72) | function nj(r){var e=[],t=(0,xe.reduce)(r,function(i,n,s){var o=n.PATTER...
  function LEe (line 74) | function LEe(r,e){if((0,xe.isRegExp)(e)){var t=e.exec(r);return t!==null...
  function OEe (line 74) | function OEe(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+",...
  function Nv (line 74) | function Nv(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.sour...
  function Tv (line 74) | function Tv(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source...
  function MEe (line 74) | function MEe(r,e,t){var i=[];return(0,xe.has)(r,Ve.DEFAULT_MODE)||i.push...
  function KEe (line 78) | function KEe(r,e,t){var i=[],n=!1,s=(0,xe.compact)((0,xe.flatten)((0,xe....
  function UEe (line 82) | function UEe(r){var e={},t=(0,xe.keys)(r);return(0,xe.forEach)(t,functio...
  function Ov (line 82) | function Ov(r){var e=r.PATTERN;if((0,xe.isRegExp)(e))return!1;if((0,xe.i...
  function sj (line 82) | function sj(r){return(0,xe.isString)(r)&&r.length===1?r.charCodeAt(0):!1}
  function oj (line 82) | function oj(r,e){if((0,xe.has)(r,"LINE_BREAKS"))return!1;if((0,xe.isRegE...
  function aj (line 82) | function aj(r,e){if(e.issue===ir.LexerDefinitionErrorType.IDENTIFY_TERMI...
  function Aj (line 87) | function Aj(r){var e=(0,xe.map)(r,function(t){return(0,xe.isString)(t)&&...
  function Fv (line 87) | function Fv(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}
  function Lv (line 87) | function Lv(r){return r<Ve.minOptimizationVal?r:ny[r]}
  function HEe (line 87) | function HEe(){if((0,xe.isEmpty)(ny)){ny=new Array(65536);for(var r=0;r<...
  function GEe (line 87) | function GEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.is...
  function YEe (line 87) | function YEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}
  function jEe (line 87) | function jEe(r){var e=lj(r);cj(e),gj(e),uj(e),(0,Zr.forEach)(e,function(...
  function lj (line 87) | function lj(r){for(var e=(0,Zr.cloneArr)(r),t=r,i=!0;i;){t=(0,Zr.compact...
  function cj (line 87) | function cj(r){(0,Zr.forEach)(r,function(e){fj(e)||(Nt.tokenIdxToClass[N...
  function uj (line 87) | function uj(r){(0,Zr.forEach)(r,function(e){e.categoryMatches=[],(0,Zr.f...
  function gj (line 87) | function gj(r){(0,Zr.forEach)(r,function(e){Kv([],e)})}
  function Kv (line 87) | function Kv(r,e){(0,Zr.forEach)(r,function(t){e.categoryMatchesMap[t.tok...
  function fj (line 87) | function fj(r){return(0,Zr.has)(r,"tokenTypeIdx")}
  function Mv (line 87) | function Mv(r){return(0,Zr.has)(r,"CATEGORIES")}
  function hj (line 87) | function hj(r){return(0,Zr.has)(r,"categoryMatches")}
  function pj (line 87) | function pj(r){return(0,Zr.has)(r,"categoryMatchesMap")}
  function qEe (line 87) | function qEe(r){return(0,Zr.has)(r,"tokenTypeIdx")}
  function r (line 88) | function r(e,t){var i=this;if(t===void 0&&(t=bd),this.lexerDefinition=e,...
  function oe (line 96) | function oe(){return ue}
  function le (line 96) | function le(pr){var Ii=(0,_s.charCodeToOptimizedIndex)(pr),rs=pe[Ii];ret...
  function fe (line 96) | function fe(pr){ke.push(pr),pe=this.charCodeToPatternIdxToConfig[pr],ue=...
  function _Ee (line 96) | function _Ee(r){return bj(r)?r.LABEL:r.name}
  function $Ee (line 96) | function $Ee(r){return r.name}
  function bj (line 96) | function bj(r){return(0,$s.isString)(r.LABEL)&&r.LABEL!==""}
  function Qj (line 96) | function Qj(r){return tIe(r)}
  function tIe (line 96) | function tIe(r){var e=r.pattern,t={};if(t.name=r.name,(0,$s.isUndefined)...
  function rIe (line 97) | function rIe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,s...
  function iIe (line 97) | function iIe(r,e){return(0,Hv.tokenStructuredMatcher)(r,e)}
  function i (line 97) | function i(){this.constructor=e}
  function r (line 97) | function r(e){this._definition=e}
  function e (line 97) | function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,Ar.assign)(i...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 97) | function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 97) | function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbig...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 97) | function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 97) | function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 97) | function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 97) | function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 97) | function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 97) | function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ign...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function r (line 97) | function r(e){this.idx=1,(0,Ar.assign)(this,(0,Ar.pick)(e,function(t){re...
  function sIe (line 97) | function sIe(r){return(0,Ar.map)(r,Qd)}
  function Qd (line 97) | function Qd(r){function e(s){return(0,Ar.map)(s,Qd)}if(r instanceof Sj){...
  function r (line 97) | function r(){}
  function Tj (line 97) | function Tj(r,e,t){var i=[new En.Option({definition:[new En.Terminal({te...
  function r (line 97) | function r(){}
  function i (line 97) | function i(){this.constructor=e}
  function cIe (line 97) | function cIe(r){return r instanceof br.Alternative||r instanceof br.Opti...
  function Yv (line 97) | function Yv(r,e){e===void 0&&(e=[]);var t=r instanceof br.Option||r inst...
  function uIe (line 97) | function uIe(r){return r instanceof br.Alternation}
  function gIe (line 97) | function gIe(r){if(r instanceof br.NonTerminal)return"SUBRULE";if(r inst...
  function e (line 97) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.sepa...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function fIe (line 97) | function fIe(r){cy.reset(),r.accept(cy);var e=cy.dslMethods;return cy.re...
  function gy (line 97) | function gy(r){if(r instanceof Oj.NonTerminal)return gy(r.referencedRule...
  function Mj (line 97) | function Mj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;...
  function Kj (line 97) | function Kj(r){var e=(0,uy.map)(r.definition,function(t){return gy(t)});...
  function Uj (line 97) | function Uj(r){return[r.terminalType]}
  function i (line 97) | function i(){this.constructor=e}
  function e (line 97) | function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function mIe (line 97) | function mIe(r){var e={};return(0,Hj.forEach)(r,function(t){var i=new Yj...
  function jj (line 97) | function jj(r,e){return r.name+e+Gj.IN}
  function EIe (line 97) | function EIe(r){var e=r.terminalType.name;return e+r.idx+Gj.IN}
  function t (line 103) | function t(u){return u instanceof Wv.Terminal?u.terminalType.name:u inst...
    method constructor (line 215) | constructor(n){super({...n,choices:e})}
    method create (line 215) | static create(n){return Lne(n)}
  function i (line 127) | function i(){this.constructor=e}
  function bIe (line 127) | function bIe(r,e){var t=new zj(r,e);return t.resolveRefs(),t.errors}
  function e (line 127) | function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errM...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function i (line 127) | function i(){this.constructor=e}
  function e (line 127) | function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.p...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTermi...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(){return r!==null&&r.apply(this,arguments)||this}
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(){return r!==null&&r.apply(this,arguments)||this}
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(){return r!==null&&r.apply(this,arguments)||this}
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(){return r!==null&&r.apply(this,arguments)||this}
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function _j (line 127) | function _j(r,e,t){t===void 0&&(t=[]),t=(0,Kt.cloneArr)(t);var i=[],n=0;...
  function kIe (line 127) | function kIe(r,e,t,i){var n="EXIT_NONE_TERMINAL",s=[n],o="EXIT_ALTERNATI...
  function RIe (line 127) | function RIe(r,e,t,i){var n=(0,Kt.cloneArr)(t);n.push(r.name);var s=(0,K...
  function i (line 127) | function i(){this.constructor=e}
  function TIe (line 127) | function TIe(r){if(r instanceof OA.Option)return oi.OPTION;if(r instance...
  function LIe (line 127) | function LIe(r,e,t,i,n,s){var o=iq(r,e,t),a=Xv(o)?hy.tokenStructuredMatc...
  function OIe (line 127) | function OIe(r,e,t,i,n,s){var o=nq(r,e,n,t),a=Xv(o)?hy.tokenStructuredMa...
  function MIe (line 127) | function MIe(r,e,t,i){var n=r.length,s=(0,sr.every)(r,function(l){return...
  function KIe (line 127) | function KIe(r,e,t){var i=(0,sr.every)(r,function(c){return c.length===1...
  function e (line 127) | function e(t,i,n){var s=r.call(this)||this;return s.topProd=t,s.targetOc...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(t,i,n){var s=r.call(this)||this;return s.targetOccurrence=t,s...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function eq (line 127) | function eq(r){for(var e=new Array(r),t=0;t<r;t++)e[t]=[];return e}
  function zv (line 127) | function zv(r){for(var e=[""],t=0;t<r.length;t++){for(var i=r[t],n=[],s=...
  function HIe (line 127) | function HIe(r,e,t){for(var i=0;i<r.length;i++)if(i!==t)for(var n=r[i],s...
  function Vv (line 127) | function Vv(r,e){for(var t=(0,sr.map)(r,function(u){return(0,$j.possible...
  function iq (line 127) | function iq(r,e,t,i){var n=new rq(r,oi.ALTERNATION,i);return e.accept(n)...
  function nq (line 127) | function nq(r,e,t,i){var n=new rq(r,t);e.accept(n);var s=n.result,o=new ...
  function sq (line 127) | function sq(r,e){e:for(var t=0;t<r.length;t++){var i=r[t];if(i.length===...
  function GIe (line 127) | function GIe(r,e){return r.length<e.length&&(0,sr.every)(r,function(t,i)...
  function Xv (line 127) | function Xv(r){return(0,sr.every)(r,function(e){return(0,sr.every)(e,fun...
  function i (line 127) | function i(){this.constructor=e}
  function jIe (line 127) | function jIe(r,e,t,i,n){var s=er.map(r,function(h){return qIe(h,i)}),o=e...
  function qIe (line 127) | function qIe(r,e){var t=new Aq;r.accept(t);var i=t.allProductions,n=er.g...
  function oq (line 127) | function oq(r){return(0,_v.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+aq...
  function aq (line 127) | function aq(r){return r instanceof to.Terminal?r.terminalType.name:r ins...
  function e (line 127) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allP...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function lq (line 127) | function lq(r,e,t,i){var n=[],s=(0,Qr.reduce)(e,function(a,l){return l.n...
  function JIe (line 127) | function JIe(r,e,t){var i=[],n;return er.contains(e,r)||(n="Invalid rule...
  function ex (line 127) | function ex(r,e,t,i){i===void 0&&(i=[]);var n=[],s=Rd(e.definition);if(e...
  function Rd (line 127) | function Rd(r){var e=[];if(er.isEmpty(r))return e;var t=er.first(r);if(t...
  function e (line 127) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alte...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function cq (line 127) | function cq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=er.redu...
  function uq (line 127) | function uq(r,e,t){var i=new tx;r.accept(i);var n=i.alternations;n=(0,Qr...
  function e (line 127) | function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allP...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function fq (line 127) | function fq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=er.redu...
  function hq (line 127) | function hq(r,e,t){var i=[];return(0,Qr.forEach)(r,function(n){var s=new...
  function WIe (line 127) | function WIe(r,e,t,i){var n=[],s=(0,Qr.reduce)(r,function(a,l,c){return ...
  function pq (line 127) | function pq(r,e,t,i){var n=[],s=(0,Qr.reduce)(r,function(o,a,l){var c=(0...
  function zIe (line 127) | function zIe(r,e,t){var i=[],n=(0,Qr.map)(e,function(s){return s.name});...
  function ZIe (line 127) | function ZIe(r){r=(0,ix.defaults)(r,{errMsgProvider:dq.defaultGrammarRes...
  function _Ie (line 127) | function _Ie(r){return r=(0,ix.defaults)(r,{errMsgProvider:dq.defaultGra...
  function i (line 127) | function i(){this.constructor=e}
  function eye (line 127) | function eye(r){return(0,$Ie.contains)(wq,r.name)}
  function e (line 127) | function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.t...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(t,i){var n=r.call(this,t,i)||this;return n.name=yq,n}
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 127) | function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function nx (line 127) | function nx(r){this.name=Ki.IN_RULE_RECOVERY_EXCEPTION,this.message=r}
  function r (line 127) | function r(){}
  function Bq (line 127) | function Bq(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l...
  function lye (line 127) | function lye(r,e,t){return t|e|r}
  function r (line 127) | function r(){}
  function uye (line 127) | function uye(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset...
  function gye (line 127) | function gye(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset...
  function fye (line 127) | function fye(r,e,t){r.children[t]===void 0?r.children[t]=[e]:r.children[...
  function hye (line 127) | function hye(r,e,t){r.children[e]===void 0?r.children[e]=[t]:r.children[...
  function dye (line 127) | function dye(r){return xq(r.constructor)}
  function xq (line 127) | function xq(r){var e=r.name;return e||"anonymous"}
  function Cye (line 127) | function Cye(r,e){var t=Object.getOwnPropertyDescriptor(r,vq);return(0,p...
  function Pq (line 127) | function Pq(r,e){for(var t=(0,ps.keys)(r),i=t.length,n=0;n<i;n++)for(var...
  function mye (line 127) | function mye(r,e){var t=function(){};(0,Nd.defineNameProp)(t,r+"BaseSema...
  function Eye (line 131) | function Eye(r,e,t){var i=function(){};(0,Nd.defineNameProp)(i,r+"BaseSe...
  function Dq (line 131) | function Dq(r,e){var t=kq(r,e),i=Rq(r,e);return t.concat(i)}
  function kq (line 131) | function kq(r,e){var t=(0,ps.map)(e,function(i){if(!(0,ps.isFunction)(r[...
  function Rq (line 131) | function Rq(r,e){var t=[];for(var i in r)(0,ps.isFunction)(r[i])&&!(0,ps...
  function r (line 133) | function r(){}
  function r (line 133) | function r(){}
  function r (line 133) | function r(){}
  function r (line 133) | function r(){}
  function a (line 140) | function a(u){try{if(this.outputCst===!0){t.apply(this,u);var g=this.CST...
  function r (line 140) | function r(){}
  function r (line 140) | function r(){}
  function r (line 142) | function r(){}
  function Ld (line 146) | function Ld(r,e,t,i){i===void 0&&(i=!1),Sy(t);var n=(0,yn.peek)(this.rec...
  function Uye (line 146) | function Uye(r,e){var t=this;Sy(e);var i=(0,yn.peek)(this.recordingProdS...
  function Zq (line 146) | function Zq(r){return r===0?"":""+r}
  function Sy (line 146) | function Sy(r){if(r<0||r>Xq){var e=new Error("Invalid DSL Method idx val...
  function r (line 147) | function r(){}
  function Yye (line 147) | function Yye(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnP...
  function i (line 147) | function i(){this.constructor=e}
  function iwe (line 147) | function iwe(r){return r===void 0&&(r=void 0),function(){return r}}
  function r (line 147) | function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=...
  function e (line 153) | function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function e (line 153) | function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function owe (line 153) | function owe(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"h...
  function uwe (line 181) | function uwe(){console.warn(`The clearCache function was 'soft' removed ...
  function r (line 183) | function r(){throw new Error(`The Parser class has been deprecated, use ...
  class f (line 184) | class f extends hwe{constructor(p){super(u),this.RULE("expression",()=>t...
    method constructor (line 184) | constructor(p){super(u),this.RULE("expression",()=>this.SUBRULE(this.l...
  function dwe (line 184) | function dwe(r,e){return(r[0]-e[0])**2+(r[1]-e[1])**2+(r[2]-e[2])**2}
  function Cwe (line 184) | function Cwe(){let r={},e=Object.keys(Ly);for(let t=e.length,i=0;i<t;i++...
  function mwe (line 184) | function mwe(r){let e=Cwe(),t=[r];for(e[r].distance=0;t.length;){let i=t...
  function Ewe (line 184) | function Ewe(r,e){return function(t){return e(r(t))}}
  function Iwe (line 184) | function Iwe(r,e){let t=[e[r].parent,r],i=Ly[e[r].parent][r],n=e[r].pare...
  function Bwe (line 184) | function Bwe(r){let e=function(...t){let i=t[0];return i==null?i:(i.leng...
  function bwe (line 184) | function bwe(r){let e=function(...t){let i=t[0];if(i==null)return i;i.le...
  function Qwe (line 184) | function Qwe(){let r=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2...
  function px (line 184) | function px(r){return r===0?!1:{level:r,hasBasic:!0,has256:r>=2,has16m:r...
  function dx (line 184) | function dx(r,e){if(KA===0)return 0;if(ds("color=16m")||ds("color=full")...
  function vwe (line 184) | function vwe(r){let e=dx(r,r&&r.isTTY);return px(e)}
  function GJ (line 188) | function GJ(r){let e=r[0]==="u",t=r[1]==="{";return e&&!t&&r.length===5|...
  function Nwe (line 188) | function Nwe(r,e){let t=[],i=e.trim().split(/\s*,\s*/g),n;for(let s of i...
  function Twe (line 188) | function Twe(r){UJ.lastIndex=0;let e=[],t;for(;(t=UJ.exec(r))!==null;){l...
  function HJ (line 188) | function HJ(r,e){let t={};for(let n of e)for(let s of n.styles)t[s[0]]=n...
  method constructor (line 188) | constructor(e){return JJ(e)}
  function My (line 188) | function My(r){return JJ(r)}
  method get (line 188) | get(){let t=Ky(this,yx(e.open,e.close,this._styler),this._isEmpty);retur...
  method get (line 188) | get(){let r=Ky(this,this._styler,!0);return Object.defineProperty(this,"...
  method get (line 188) | get(){let{level:e}=this;return function(...t){let i=yx(Kd.color[qJ[e]][r...
  method get (line 188) | get(){let{level:t}=this;return function(...i){let n=yx(Kd.bgColor[qJ[t]]...
  method get (line 188) | get(){return this._generator.level}
  method set (line 188) | set(r){this._generator.level=r}
  function Gwe (line 189) | function Gwe(r,e,t){let i=Bx(r,e,"-",!1,t)||[],n=Bx(e,r,"",!1,t)||[],s=B...
  function Ywe (line 189) | function Ywe(r,e){let t=1,i=1,n=r3(r,t),s=new Set([e]);for(;r<=n&&n<=e;)...
  function jwe (line 189) | function jwe(r,e,t){if(r===e)return{pattern:r,count:[],digits:0};let i=q...
  function e3 (line 189) | function e3(r,e,t,i){let n=Ywe(r,e),s=[],o=r,a;for(let l=0;l<n.length;l+...
  function Bx (line 189) | function Bx(r,e,t,i,n){let s=[];for(let o of r){let{string:a}=o;!i&&!t3(...
  function qwe (line 189) | function qwe(r,e){let t=[];for(let i=0;i<r.length;i++)t.push([r[i],e[i]]...
  function Jwe (line 189) | function Jwe(r,e){return r>e?1:e>r?-1:0}
  function t3 (line 189) | function t3(r,e,t){return r.some(i=>i[e]===t)}
  function r3 (line 189) | function r3(r,e){return Number(String(r).slice(0,-e)+"9".repeat(e))}
  function i3 (line 189) | function i3(r,e){return r-r%Math.pow(10,e)}
  function n3 (line 189) | function n3(r){let[e=0,t=""]=r;return t||e>1?`{${e+(t?","+t:"")}}`:""}
  function Wwe (line 189) | function Wwe(r,e,t){return`[${r}${e-r===1?"":"-"}${e}]`}
  function s3 (line 189) | function s3(r){return/^-?(0+)\d/.test(r)}
  function zwe (line 189) | function zwe(r,e,t){if(!e.isPadded)return r;let i=Math.abs(e.maxLen-Stri...
  method extglobChars (line 190) | extglobChars(r){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${r....
  method globChars (line 190) | globChars(r){return r===!0?FBe:T3}
  function C0e (line 190) | function C0e(){let r=[],e=!1,t=d0e.call(arguments),i=t[t.length-1];i&&!A...
  function IW (line 190) | function IW(r,e){if(Array.isArray(r))for(let t=0,i=r.length;t<i;t++)r[t]...
  function m0e (line 190) | function m0e(r){return r.reduce((e,t)=>[].concat(e,t),[])}
  function E0e (line 190) | function E0e(r,e){let t=[[]],i=0;for(let n of r)e(n)?(i++,t[i]=[]):t[i]....
  function I0e (line 190) | function I0e(r){return r.code==="ENOENT"}
  method constructor (line 190) | constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),...
  function y0e (line 190) | function y0e(r,e){return new aP(r,e)}
  function Q0e (line 190) | function Q0e(r){return r.replace(/\\/g,"/")}
  function S0e (line 190) | function S0e(r,e){return w0e.resolve(r,e)}
  function v0e (line 190) | function v0e(r){return r.replace(b0e,"\\$2")}
  function x0e (line 190) | function x0e(r){if(r.charAt(0)==="."){let e=r.charAt(1);if(e==="/"||e===...
  function TW (line 190) | function TW(r,e={}){return!LW(r,e)}
  function LW (line 190) | function LW(r,e={}){return!!(e.caseSensitiveMatch===!1||r.includes(G0e)|...
  function z0e (line 190) | function z0e(r){return _y(r)?r.slice(1):r}
  function V0e (line 190) | function V0e(r){return"!"+r}
  function _y (line 190) | function _y(r){return r.startsWith("!")&&r[1]!=="("}
  function OW (line 190) | function OW(r){return!_y(r)}
  function X0e (line 190) | function X0e(r){return r.filter(_y)}
  function Z0e (line 190) | function Z0e(r){return r.filter(OW)}
  function _0e (line 190) | function _0e(r){return U0e(r,{flipBackslashes:!1})}
  function $0e (line 190) | function $0e(r){return r.includes(NW)}
  function MW (line 190) | function MW(r){return r.endsWith("/"+NW)}
  function ebe (line 190) | function ebe(r){let e=K0e.basename(r);return MW(r)||TW(e)}
  function tbe (line 190) | function tbe(r){return r.reduce((e,t)=>e.concat(KW(t)),[])}
  function KW (line 190) | function KW(r){return FW.braces(r,{expand:!0,nodupes:!0})}
  function rbe (line 190) | function rbe(r,e){let t=H0e.scan(r,Object.assign(Object.assign({},e),{pa...
  function UW (line 190) | function UW(r,e){return FW.makeRe(r,e)}
  function ibe (line 190) | function ibe(r,e){return r.map(t=>UW(t,e))}
  function nbe (line 190) | function nbe(r,e){return e.some(t=>t.test(r))}
  function obe (line 190) | function obe(r){let e=sbe(r);return r.forEach(t=>{t.once("error",i=>e.em...
  function GW (line 190) | function GW(r){r.forEach(e=>e.emit("close"))}
  function abe (line 190) | function abe(r){return typeof r=="string"}
  function Abe (line 190) | function Abe(r){return r===""}
  function dbe (line 190) | function dbe(r,e){let t=qW(r),i=JW(r,e.ignore),n=t.filter(l=>bc.pattern....
  function uP (line 190) | function uP(r,e,t){let i=WW(r);return"."in i?[gP(".",r,e,t)]:zW(i,e,t)}
  function qW (line 190) | function qW(r){return bc.pattern.getPositivePatterns(r)}
  function JW (line 190) | function JW(r,e){return bc.pattern.getNegativePatterns(r).concat(e).map(...
  function WW (line 190) | function WW(r){let e={};return r.reduce((t,i)=>{let n=bc.pattern.getBase...
  function zW (line 190) | function zW(r,e,t){return Object.keys(r).map(i=>gP(i,r[i],e,t))}
  function gP (line 190) | function gP(r,e,t,i){return{dynamic:i,positive:e,negative:t,base:r,patte...
  function Cbe (line 190) | function Cbe(r,e,t){e.fs.lstat(r,(i,n)=>{if(i!==null){XW(t,i);return}if(...
  function XW (line 190) | function XW(r,e){r(e)}
  function fP (line 190) | function fP(r,e){r(null,e)}
  function mbe (line 190) | function mbe(r,e){let t=e.fs.lstatSync(r);if(!t.isSymbolicLink()||!e.fol...
  function Ebe (line 190) | function Ebe(r){return r===void 0?UA.FILE_SYSTEM_ADAPTER:Object.assign(O...
  method constructor (line 190) | constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue...
  method _getValue (line 190) | _getValue(e,t){return e!=null?e:t}
  function wbe (line 190) | function wbe(r,e,t){if(typeof e=="function"){t4.read(r,CP(),e);return}t4...
  function Bbe (line 190) | function Bbe(r,e){let t=CP(e);return ybe.read(r,t)}
  function CP (line 190) | function CP(r={}){return r instanceof dP.default?r:new dP.default(r)}
  function bbe (line 190) | function bbe(r,e){var t,i,n,s=!0;Array.isArray(r)?(t=[],i=r.length):(n=O...
  method constructor (line 190) | constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),...
  function Pbe (line 190) | function Pbe(r,e){return new EP(r,e)}
  function kbe (line 190) | function kbe(r,e,t){return r.endsWith(t)?r+e:r+t+e}
  function Nbe (line 190) | function Nbe(r,e,t){if(!e.stats&&Fbe.IS_SUPPORT_READDIR_WITH_FILE_TYPES)...
  function c4 (line 190) | function c4(r,e,t){e.fs.readdir(r,{withFileTypes:!0},(i,n)=>{if(i!==null...
  function Tbe (line 190) | function Tbe(r,e){return t=>{if(!r.dirent.isSymbolicLink()){t(null,r);re...
  function u4 (line 190) | function u4(r,e,t){e.fs.readdir(r,(i,n)=>{if(i!==null){Aw(t,i);return}le...
  function Aw (line 190) | function Aw(r,e){r(e)}
  function wP (line 190) | function wP(r,e){r(null,e)}
  function Mbe (line 190) | function Mbe(r,e){return!e.stats&&Obe.IS_SUPPORT_READDIR_WITH_FILE_TYPES...
  function p4 (line 190) | function p4(r,e){return e.fs.readdirSync(r,{withFileTypes:!0}).map(i=>{l...
  function d4 (line 190) | function d4(r,e){return e.fs.readdirSync(r).map(i=>{let n=h4.joinPathSeg...
  function Kbe (line 190) | function Kbe(r){return r===void 0?jA.FILE_SYSTEM_ADAPTER:Object.assign(O...
  method constructor (line 190) | constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValu...
  method _getValue (line 190) | _getValue(e,t){return e!=null?e:t}
  function jbe (line 190) | function jbe(r,e,t){if(typeof e=="function"){I4.read(r,SP(),e);return}I4...
  function qbe (line 190) | function qbe(r,e){let t=SP(e);return Ybe.read(r,t)}
  function SP (line 190) | function SP(r={}){return r instanceof QP.default?r:new QP.default(r)}
  function Jbe (line 190) | function Jbe(r){var e=new r,t=e;function i(){var s=e;return s.next?e=s.n...
  function B4 (line 190) | function B4(r,e,t){if(typeof r=="function"&&(t=e,e=r,r=null),t<1)throw n...
  function Is (line 190) | function Is(){}
  function zbe (line 190) | function zbe(){this.value=null,this.callback=Is,this.next=null,this.rele...
  function Vbe (line 190) | function Vbe(r,e,t){typeof r=="function"&&(t=e,e=r,r=null);function i(u,...
  function Xbe (line 190) | function Xbe(r,e){return r.errorFilter===null?!0:!r.errorFilter(e)}
  function Zbe (line 190) | function Zbe(r,e){return r===null||r(e)}
  function _be (line 190) | function _be(r,e){return r.split(/[/\\]/).join(e)}
  function $be (line 190) | function $be(r,e,t){return r===""?e:r.endsWith(t)?r+e:r+t+e}
  method constructor (line 190) | constructor(e,t){this._root=e,this._settings=t,this._root=eQe.replacePat...
  method constructor (line 190) | constructor(e,t){super(e,t),this._settings=t,this._scandir=rQe.scandir,t...
  method read (line 190) | read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()...
  method isDestroyed (line 190) | get isDestroyed(){return this._isDestroyed}
  method destroy (line 190) | destroy(){if(this._isDestroyed)throw new Error("The reader is already de...
  method onEntry (line 190) | onEntry(e){this._emitter.on("entry",e)}
  method onError (line 190) | onError(e){this._emitter.once("error",e)}
  method onEnd (line 190) | onEnd(e){this._emitter.once("end",e)}
  method _pushToQueue (line 190) | _pushToQueue(e,t){let i={directory:e,base:t};this._queue.push(i,n=>{n!==...
  method _worker (line 190) | _worker(e,t){this._scandir(e.directory,this._settings.fsScandirSettings,...
  method _handleError (line 190) | _handleError(e){this._isDestroyed||!uw.isFatalError(this._settings,e)||(...
  method _handleEntry (line 190) | _handleEntry(e,t){if(this._isDestroyed||this._isFatalError)return;let i=...
  method _emitEntry (line 190) | _emitEntry(e){this._emitter.emit("entry",e)}
  method constructor (line 190) | constructor(e,t){this._root=e,this._settings=t,this._reader=new sQe.defa...
  method read (line 190) | read(e){this._reader.onError(t=>{oQe(e,t)}),this._reader.onEntry(t=>{thi...
  function oQe (line 190) | function oQe(r,e){r(e)}
  function aQe (line 190) | function aQe(r,e){r(null,e)}
  method constructor (line 190) | constructor(e,t){this._root=e,this._settings=t,this._reader=new lQe.defa...
  method read (line 190) | read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),th...
  method constructor (line 190) | constructor(){super(...arguments),this._scandir=cQe.scandirSync,this._st...
  method read (line 190) | read(){return this._pushToQueue(this._root,this._settings.basePath),this...
  method _pushToQueue (line 190) | _pushToQueue(e,t){this._queue.add({directory:e,base:t})}
  method _handleQueue (line 190) | _handleQueue(){for(let e of this._queue.values())this._handleDirectory(e...
  method _handleDirectory (line 190) | _handleDirectory(e,t){try{let i=this._scandir(e,this._settings.fsScandir...
  method _handleError (line 190) | _handleError(e){if(!!gw.isFatalError(this._settings,e))throw e}
  method _handleEntry (line 190) | _handleEntry(e,t){let i=e.path;t!==void 0&&(e.path=gw.joinPathSegments(t...
  method _pushToStorage (line 190) | _pushToStorage(e){this._storage.add(e)}
  method constructor (line 190) | constructor(e,t){this._root=e,this._settings=t,this._reader=new gQe.defa...
  method read (line 190) | read(){return this._reader.read()}
  method constructor (line 190) | constructor(e={}){this._options=e,this.basePath=this._getValue(this._opt...
  method _getValue (line 190) | _getValue(e,t){return e!=null?e:t}
  function CQe (line 190) | function CQe(r,e,t){if(typeof e=="function"){new D4.default(r,fw()).read...
  function mQe (line 190) | function mQe(r,e){let t=fw(e);return new dQe.default(r,t).read()}
  function EQe (line 190) | function EQe(r,e){let t=fw(e);return new pQe.default(r,t).read()}
  function fw (line 190) | function fw(r={}){return r instanceof jP.default?r:new jP.default(r)}
  method constructor (line 190) | constructor(e){this._settings=e,this._fsStatSettings=new yQe.Settings({f...
  method _getFullEntryPath (line 190) | _getFullEntryPath(e){return IQe.resolve(this._settings.cwd,e)}
  method _makeEntry (line 190) | _makeEntry(e,t){let i={name:t,path:t,dirent:k4.fs.createDirentFromStats(...
  method _isFatalError (line 190) | _isFatalError(e){return!k4.errno.isEnoentCodeError(e)&&!this._settings.s...
  method constructor (line 190) | constructor(){super(...arguments),this._walkStream=bQe.walkStream,this._...
  method dynamic (line 190) | dynamic(e,t){return this._walkStream(e,t)}
  method static (line 190) | static(e,t){let i=e.map(this._getFullEntryPath,this),n=new wQe.PassThrou...
  method _getEntry (line 190) | _getEntry(e,t,i){return this._getStat(e).then(n=>this._makeEntry(n,t)).c...
  method _getStat (line 190) | _getStat(e){return new Promise((t,i)=>{this._stat(e,this._fsStatSettings...
  method constructor (line 190) | constructor(e,t,i){this._patterns=e,this._settings=t,this._micromatchOpt...
  method _fillStorage (line 190) | _fillStorage(){let e=Bf.pattern.expandPatternsWithBraceExpansion(this._p...
  method _getPatternSegments (line 190) | _getPatternSegments(e){return Bf.pattern.getPatternParts(e,this._microma...
  method _splitSegmentsIntoSections (line 190) | _splitSegmentsIntoSections(e){return Bf.array.splitWhen(e,t=>t.dynamic&&...
  method match (line 190) | match(e){let t=e.split("/"),i=t.length,n=this._storage.filter(s=>!s.comp...
  method constructor (line 190) | constructor(e,t){this._settings=e,this._micromatchOptions=t}
  method getFilter (line 190) | getFilter(e,t,i){let n=this._getMatcher(t),s=this._getNegativePatternsRe...
  method _getMatcher (line 190) | _getMatcher(e){return new vQe.default(e,this._settings,this._micromatchO...
  method _getNegativePatternsRe (line 190) | _getNegativePatternsRe(e){let t=e.filter(hw.pattern.isAffectDepthOfReadi...
  method _filter (line 190) | _filter(e,t,i,n){let s=this._getEntryLevel(e,t.path);if(this._isSkippedB...
  method _isSkippedByDeep (line 190) | _isSkippedByDeep(e){return e>=this._settings.deep}
  method _isSkippedSymbolicLink (line 190) | _isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.d...
  method _getEntryLevel (line 190) | _getEntryLevel(e,t){let i=e.split("/").length;return t.split("/").length...
  method _isSkippedByPositivePatterns (line 190) | _isSkippedByPositivePatterns(e,t){return!this._settings.baseNameMatch&&!...
  method _isSkippedByNegativePatterns (line 190) | _isSkippedByNegativePatterns(e,t){return!hw.pattern.matchAny(e,t)}
  method constructor (line 190) | constructor(e,t){this._settings=e,this._micromatchOptions=t,this.index=n...
  method getFilter (line 190) | getFilter(e,t){let i=Zd.pattern.convertPatternsToRe(e,this._micromatchOp...
  method _filter (line 190) | _filter(e,t,i){if(this._settings.unique){if(this._isDuplicateEntry(e))re...
  method _isDuplicateEntry (line 190) | _isDuplicateEntry(e){return this.index.has(e.path)}
  method _createIndexRecord (line 190) | _createIndexRecord(e){this.index.set(e.path,void 0)}
  method _onlyFileFilter (line 190) | _onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}
  method _onlyDirectoryFilter (line 190) | _onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent...
  method _isSkippedByAbsoluteNegativePatterns (line 190) | _isSkippedByAbsoluteNegativePatterns(e,t){if(!this._settings.absolute)re...
  method _isMatchToPatterns (line 190) | _isMatchToPatterns(e,t){let i=Zd.path.removeLeadingDotSegment(e);return ...
  method constructor (line 190) | constructor(e){this._settings=e}
  method getFilter (line 190) | getFilter(){return e=>this._isNonFatalError(e)}
  method _isNonFatalError (line 190) | _isNonFatalError(e){return xQe.errno.isEnoentCodeError(e)||this._setting...
  method constructor (line 190) | constructor(e){this._settings=e}
  method getTransformer (line 190) | getTransformer(){return e=>this._transform(e)}
  method _transform (line 190) | _transform(e){let t=e.path;return this._settings.absolute&&(t=O4.path.ma...
  method constructor (line 190) | constructor(e){this._settings=e,this.errorFilter=new RQe.default(this._s...
  method _getRootDirectory (line 190) | _getRootDirectory(e){return PQe.resolve(this._settings.cwd,e.base)}
  method _getReaderOptions (line 190) | _getReaderOptions(e){let t=e.base==="."?"":e.base;return{basePath:t,path...
  method _getMicromatchOptions (line 190) | _getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._se...
  method constructor (line 190) | constructor(){super(...arguments),this._reader=new NQe.default(this._set...
  method read (line 190) | read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[]...
  method api (line 190) | api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.stati...
  method constructor (line 190) | constructor(){super(...arguments),this._reader=new OQe.default(this._set...
  method read (line 190) | read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=th...
  method api (line 190) | api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.stati...
  method constructor (line 190) | constructor(){super(...arguments),this._walkSync=UQe.walkSync,this._stat...
  method dynamic (line 190) | dynamic(e,t){return this._walkSync(e,t)}
  method static (line 190) | static(e,t){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=t...
  method _getEntry (line 190) | _getEntry(e,t,i){try{let n=this._getStat(e);return this._makeEntry(n,t)}...
  method _getStat (line 190) | _getStat(e){return this._statSync(e,this._fsStatSettings)}
  method constructor (line 190) | constructor(){super(...arguments),this._reader=new GQe.default(this._set...
  method read (line 190) | read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e);retu...
  method api (line 190) | api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.stati...
  method constructor (line 190) | constructor(e={}){this._options=e,this.absolute=this._getValue(this._opt...
  method _getValue (line 190) | _getValue(e,t){return e===void 0?t:e}
  method _getFileSystemMethods (line 190) | _getFileSystemMethods(e={}){return Object.assign(Object.assign({},_d.DEF...
  function wD (line 190) | async function wD(r,e){Qf(r);let t=BD(r,JQe.default,e),i=await Promise.a...
  function e (line 190) | function e(o,a){Qf(o);let l=BD(o,zQe.default,a);return Sc.array.flatten(l)}
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function t (line 190) | function t(o,a){Qf(o);let l=BD(o,WQe.default,a);return Sc.stream.merge(l)}
    method constructor (line 215) | constructor(n){super({...n,choices:e})}
    method create (line 215) | static create(n){return Lne(n)}
  function i (line 190) | function i(o,a){Qf(o);let l=[].concat(o),c=new yD.default(a);return j4.g...
  function n (line 190) | function n(o,a){Qf(o);let l=new yD.default(a);return Sc.pattern.isDynami...
  function s (line 190) | function s(o){return Qf(o),Sc.path.escape(o)}
  function BD (line 190) | function BD(r,e,t){let i=[].concat(r),n=new yD.default(t),s=j4.generate(...
  function Qf (line 190) | function Qf(r){if(![].concat(r).every(i=>Sc.string.isString(i)&&!Sc.stri...
  function bD (line 190) | async function bD(r,e,t){if(typeof t!="string")throw new TypeError(`Expe...
  function QD (line 190) | function QD(r,e,t){if(typeof t!="string")throw new TypeError(`Expected a...
  function $4 (line 190) | function $4(r){return Array.isArray(r)?r:[r]}
  method constructor (line 190) | constructor(e,t,i,n){this.origin=e,this.pattern=t,this.negative=i,this.r...
  method constructor (line 190) | constructor({ignorecase:e=!0}={}){rSe(this,t8,!0),this._rules=[],this._i...
  method _initCache (line 190) | _initCache(){this._ignoreCache=Object.create(null),this._testCache=Objec...
  method _addPattern (line 190) | _addPattern(e){if(e&&e[t8]){this._rules=this._rules.concat(e._rules),thi...
  method add (line 190) | add(e){return this._added=!1,$4(kD(e)?lSe(e):e).forEach(this._addPattern...
  method addPattern (line 190) | addPattern(e){return this.add(e)}
  method _testOne (line 190) | _testOne(e,t){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:...
  method _test (line 190) | _test(e,t,i,n){let s=e&&Ka.convert(e);return Ka(s,e,uSe),this._t(s,t,i,n)}
  method _t (line 190) | _t(e,t,i,n){if(e in t)return t[e];if(n||(n=e.split(xD)),n.pop(),!n.lengt...
  method ignores (line 190) | ignores(e){return this._test(e,this._ignoreCache,!1).ignored}
  method createFilter (line 190) | createFilter(){return e=>!this.ignores(e)}
  method filter (line 190) | filter(e){return $4(e).filter(this.createFilter())}
  method test (line 190) | test(e){return this._test(e,this._testCache,!0)}
  method constructor (line 190) | constructor(){super({objectMode:!0})}
  method constructor (line 190) | constructor(e){super(),this._filter=e}
  method _transform (line 190) | _transform(e,t,i){this._filter(e)&&this.push(e),i()}
  method constructor (line 190) | constructor(){super(),this._pushed=new Set}
  method _transform (line 190) | _transform(e,t,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)...
  function GSe (line 190) | function GSe(r){var e=typeof r;return r!=null&&(e=="object"||e=="functio...
  function XSe (line 190) | function XSe(r){for(var e=r.length;e--&&VSe.test(r.charAt(e)););return e}
  function $Se (line 190) | function $Se(r){return r&&r.slice(0,ZSe(r)+1).replace(_Se,"")}
  function nve (line 190) | function nve(r){var e=rve.call(r,uC),t=r[uC];try{r[uC]=void 0;var i=!0}c...
  function ave (line 190) | function ave(r){return ove.call(r)}
  function gve (line 190) | function gve(r){return r==null?r===void 0?uve:cve:$8&&$8 in Object(r)?Av...
  function fve (line 190) | function fve(r){return r!=null&&typeof r=="object"}
  function Cve (line 190) | function Cve(r){return typeof r=="symbol"||pve(r)&&hve(r)==dve}
  function bve (line 190) | function bve(r){if(typeof r=="number")return r;if(Eve(r))return nz;if(iz...
  function Pve (line 190) | function Pve(r,e,t){var i,n,s,o,a,l,c=0,u=!1,g=!1,f=!0;if(typeof r!="fun...
  function Fve (line 190) | function Fve(r,e,t){var i=!0,n=!0;if(typeof r!="function")throw new Type...
  function Jve (line 190) | function Jve(r){return Iz.includes(r)}
  function zve (line 190) | function zve(r){return Wve.includes(r)}
  function Xve (line 190) | function Xve(r){return Vve.includes(r)}
  function Lf (line 190) | function Lf(r){return e=>typeof e===r}
  function X (line 190) | function X(r){if(r===null)return"null";switch(typeof r){case"undefined":...
  method constructor (line 190) | constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}
  method isCanceled (line 190) | get isCanceled(){return!0}
  method fn (line 190) | static fn(e){return(...t)=>new Of((i,n,s)=>{t.push(s),e(...t).then(i,n)})}
  method constructor (line 190) | constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCancel...
  method then (line 190) | then(e,t){return this._promise.then(e,t)}
  method catch (line 190) | catch(e){return this._promise.catch(e)}
  method finally (line 190) | finally(e){return this._promise.finally(e)}
  method cancel (line 190) | cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandl...
  method isCanceled (line 190) | get isCanceled(){return this._isCanceled}
  method constructor (line 190) | constructor({cache:e=new Map,maxTtl:t=1/0,fallbackDuration:i=3600,errorT...
  method servers (line 190) | set servers(e){this.clear(),this._resolver.setServers(e)}
  method servers (line 190) | get servers(){return this._resolver.getServers()}
  method lookup (line 190) | lookup(e,t,i){if(typeof t=="function"?(i=t,t={}):typeof t=="number"&&(t=...
  method lookupAsync (line 190) | async lookupAsync(e,t={}){typeof t=="number"&&(t={family:t});let i=await...
  method query (line 190) | async query(e){let t=await this._cache.get(e);if(!t){let i=this._pending...
  method _resolve (line 190) | async _resolve(e){let t=async c=>{try{return await c}catch(u){if(u.code=...
  method _lookup (line 190) | async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),ca...
  method _set (line 190) | async _set(e,t,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,t...
  method queryAndCache (line 190) | async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._...
  method _tick (line 190) | _tick(e){let t=this._nextRemovalTime;(!t||e<t)&&(clearTimeout(this._remo...
  method install (line 190) | install(e){if(Pz(e),Mf in e)throw new Error("CacheableLookup has been al...
  method uninstall (line 190) | uninstall(e){if(Pz(e),e[Mf]){if(e[bk]!==this)throw new Error("The agent ...
  method updateInterfaceInfo (line 190) | updateInterfaceInfo(){let{_iface:e}=this;this._iface=Dz(),(e.has4&&!this...
  method clear (line 190) | clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}
  function Oz (line 190) | function Oz(r,e){if(r&&e)return Oz(r)(e);if(typeof r!="function")throw n...
  function Ww (line 190) | function Ww(r){var e=function(){return e.called?e.value:(e.called=!0,e.v...
  function Hz (line 190) | function Hz(r){var e=function(){if(e.called)throw new Error(e.onceError)...
  method constructor (line 190) | constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}
  function Xw (line 190) | async function Xw(r,e){if(!r)return Promise.reject(new Error("Expected a...
  function Lc (line 190) | function Lc(r){let e=parseInt(r,10);return isFinite(e)?e:0}
  function Mxe (line 190) | function Mxe(r){return r?Txe.has(r.status):!0}
  function kk (line 190) | function kk(r){let e={};if(!r)return e;let t=r.trim().split(/\s*,\s*/);f...
  function Kxe (line 190) | function Kxe(r){let e=[];for(let t in r){let i=r[t];e.push(i===!0?t:t+"=...
  method constructor (line 190) | constructor(e,t,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,igno...
  method now (line 190) | now(){return Date.now()}
  method storable (line 190) | storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||thi...
  method _hasExplicitExpiration (line 190) | _hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]|...
  method _assertRequestHasHeaders (line 190) | _assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request heade...
  method satisfiesWithoutRevalidation (line 190) | satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let t=k...
  method _requestMatches (line 190) | _requestMatches(e,t){return(!this._url||this._url===e.url)&&this._host==...
  method _allowsStoringAuthenticated (line 190) | _allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||thi...
  method _varyMatches (line 190) | _varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.v...
  method _copyWithoutHopByHopHeaders (line 190) | _copyWithoutHopByHopHeaders(e){let t={};for(let i in e)Lxe[i]||(t[i]=e[i...
  method responseHeaders (line 190) | responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeader...
  method date (line 190) | date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this...
  method age (line 190) | age(){let e=this._ageValue(),t=(this.now()-this._responseTime)/1e3;retur...
  method _ageValue (line 190) | _ageValue(){return Lc(this._resHeaders.age)}
  method maxAge (line 190) | maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&t...
  method timeToLive (line 190) | timeToLive(){let e=this.maxAge()-this.age(),t=e+Lc(this._rescc["stale-if...
  method stale (line 190) | stale(){return this.maxAge()<=this.age()}
  method _useStaleIfError (line 190) | _useStaleIfError(){return this.maxAge()+Lc(this._rescc["stale-if-error"]...
  method useStaleWhileRevalidate (line 190) | useStaleWhileRevalidate(){return this.maxAge()+Lc(this._rescc["stale-whi...
  method fromObject (line 190) | static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}
  method _fromObject (line 190) | _fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e|...
  method toObject (line 190) | toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._ca...
  method revalidationHeaders (line 190) | revalidationHeaders(e){this._assertRequestHasHeaders(e);let t=this._copy...
  method revalidatedPolicy (line 190) | revalidatedPolicy(e,t){if(this._assertRequestHasHeaders(e),this._useStal...
  method constructor (line 190) | constructor(e,t,i,n){if(typeof e!="number")throw new TypeError("Argument...
  method _read (line 190) | _read(){this.push(this.body),this.push(null)}
  method constructor (line 190) | constructor(e,t){if(super(),this.opts=Object.assign({namespace:"keyv",se...
  method _getKeyPrefix (line 190) | _getKeyPrefix(e){return`${this.opts.namespace}:${e}`}
  method get (line 190) | get(e,t){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.r...
  method set (line 190) | set(e,t,i){e=this._getKeyPrefix(e),typeof i>"u"&&(i=this.opts.ttl),i===0...
  method delete (line 190) | delete(e){e=this._getKeyPrefix(e);let{store:t}=this.opts;return Promise....
  method clear (line 190) | clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear...
  method constructor (line 190) | constructor(e,t){if(typeof e!="function")throw new TypeError("Parameter ...
  method createCacheableRequest (line 190) | createCacheableRequest(e){return(t,i)=>{let n;if(typeof t=="string")n=Lk...
  function ePe (line 190) | function ePe(r){let e={...r};return e.path=`${r.pathname||"/"}${r.search...
  function Lk (line 190) | function Lk(r){return{protocol:r.protocol,auth:r.auth,hostname:r.hostnam...
  method constructor (line 190) | constructor(r){super(r.message),this.name="RequestError",Object.assign(t...
  method constructor (line 190) | constructor(r){super(r.message),this.name="CacheError",Object.assign(thi...
  method get (line 190) | get(){let s=r[n];return typeof s=="function"?s.bind(r):s}
  method set (line 190) | set(s){r[n]=s}
  method transform (line 190) | transform(a,l,c){i=!1,c(null,a)}
  method flush (line 190) | flush(a){a()}
  method destroy (line 190) | destroy(a,l){r.destroy(),l(a)}
  method constructor (line 190) | constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`max...
  method _set (line 190) | _set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){...
  method get (line 190) | get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.ha...
  method set (line 190) | set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}
  method has (line 190) | has(e){return this.cache.has(e)||this.oldCache.has(e)}
  method peek (line 190) | peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.h...
  method delete (line 190) | delete(e){let t=this.cache.delete(e);return t&&this._size--,this.oldCach...
  method clear (line 190) | clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}
  method keys (line 190) | *keys(){for(let[e]of this)yield e}
  method values (line 190) | *values(){for(let[,e]of this)yield e}
  method [Symbol.iterator] (line 190) | *[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.o...
  method size (line 190) | get size(){let e=0;for(let t of this.oldCache.keys())this.cache.has(t)||...
  method constructor (line 190) | constructor({timeout:e=6e4,maxSessions:t=1/0,maxFreeSessions:i=10,maxCac...
  method normalizeOrigin (line 190) | static normalizeOrigin(e,t){return typeof e=="string"&&(e=new URL(e)),t&...
  method normalizeOptions (line 190) | normalizeOptions(e){let t="";if(e)for(let i of lPe)e[i]&&(t+=`:${e[i]}`)...
  method _tryToCreateNewSession (line 190) | _tryToCreateNewSession(e,t){if(!(e in this.queue)||!(t in this.queue[e])...
  method getSession (line 190) | getSession(e,t,i){return new Promise((n,s)=>{Array.isArray(i)?(i=[...i],...
  method request (line 191) | request(e,t,i,n){return new Promise((s,o)=>{this.getSession(e,t,[{reject...
  method createConnection (line 191) | createConnection(e,t){return zo.connect(e,t)}
  method connect (line 191) | static connect(e,t){t.ALPNProtocols=["h2"];let i=e.port||443,n=e.hostnam...
  method closeFreeSessions (line 191) | closeFreeSessions(){for(let e of Object.values(this.sessions))for(let t ...
  method destroy (line 191) | destroy(e){for(let t of Object.values(this.sessions))for(let i of t)i.de...
  method freeSessions (line 191) | get freeSessions(){return m5({agent:this,isFree:!0})}
  method busySessions (line 191) | get busySessions(){return m5({agent:this,isFree:!1})}
  method constructor (line 191) | constructor(e,t){super({highWaterMark:t,autoDestroy:!1}),this.statusCode...
  method _destroy (line 191) | _destroy(e){this.req._request.destroy(e)}
  method setTimeout (line 191) | setTimeout(e,t){return this.req.setTimeout(e,t),this}
  method _dump (line 191) | _dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),t...
  method _read (line 191) | _read(){this.req&&this.req._request.resume()}
  method constructor (line 191) | constructor(...n){super(typeof t=="string"?t:t(n)),this.name=`${super.na...
  method constructor (line 191) | constructor(e,t,i){super({autoDestroy:!1});let n=typeof e=="string"||e i...
  method method (line 191) | get method(){return this[Ui][R5]}
  method method (line 191) | set method(e){e&&(this[Ui][R5]=e.toUpperCase())}
  method path (line 191) | get path(){return this[Ui][F5]}
  method path (line 191) | set path(e){e&&(this[Ui][F5]=e)}
  method _mustNotHaveABody (line 191) | get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"...
  method _write (line 191) | _write(e,t,i){if(this._mustNotHaveABody){i(new Error("The GET, HEAD and ...
  method _final (line 191) | _final(e){if(this.destroyed)return;this.flushHeaders();let t=()=>{if(thi...
  method abort (line 191) | abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=...
  method _destroy (line 191) | _destroy(e,t){this.res&&this.res._dump(),this._request&&this._request.de...
  method flushHeaders (line 191) | async flushHeaders(){if(this[$w]||this.destroyed)return;this[$w]=!0;let ...
  method getHeader (line 191) | getHeader(e){if(typeof e!="string")throw new qk("name","string",e);retur...
  method headersSent (line 191) | get headersSent(){return this[$w]}
  method removeHeader (line 191) | removeHeader(e){if(typeof e!="string")throw new qk("name","string",e);if...
  method setHeader (line 191) | setHeader(e,t){if(this.headersSent)throw new D5("set");if(typeof e!="str...
  method setNoDelay (line 191) | setNoDelay(){}
  method setSocketKeepAlive (line 191) | setSocketKeepAlive(){}
  method setTimeout (line 191) | setTimeout(e,t){let i=()=>this._request.setTimeout(e,t);return this._req...
  method maxHeadersCount (line 191) | get maxHeadersCount(){if(!this.destroyed&&this._request)return this._req...
  method maxHeadersCount (line 191) | set maxHeadersCount(e){}
  function jPe (line 191) | function jPe(r,e,t){let i={};for(let n of t)i[n]=(...s)=>{e.emit(n,...s)...
  method once (line 191) | once(e,t,i){e.once(t,i),r.push({origin:e,event:t,fn:i})}
  method unhandleAll (line 191) | unhandleAll(){for(let e of r){let{origin:t,event:i,fn:n}=e;t.removeListe...
  method constructor (line 191) | constructor(e,t){super(`Timeout awaiting '${t}' for ${e}ms`),this.event=...
  method constructor (line 191) | constructor(){this.weakMap=new WeakMap,this.map=new Map}
  method set (line 191) | set(e,t){typeof e=="object"?this.weakMap.set(e,t):this.map.set(e,t)}
  method get (line 191) | get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}
  method has (line 191) | has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}
  function pDe (line 191) | function pDe(r){for(let e in r){let t=r[e];if(!Ee.default.string(t)&&!Ee...
  function dDe (line 191) | function dDe(r){return Ee.default.object(r)&&!("statusCode"in r)}
  method constructor (line 191) | constructor(e,t,i){var n;if(super(e),Error.captureStackTrace(this,this.c...
  method constructor (line 195) | constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborti...
  method constructor (line 195) | constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})...
  method constructor (line 195) | constructor(e,t){super(e.message,e,t),this.name="CacheError"}
  method constructor (line 195) | constructor(e,t){super(e.message,e,t),this.name="UploadError"}
  method constructor (line 195) | constructor(e,t,i){super(e.message,e,i),this.name="TimeoutError",this.ev...
  method constructor (line 195) | constructor(e,t){super(e.message,e,t),this.name="ReadError"}
  method constructor (line 195) | constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),th...
  method constructor (line 195) | constructor(e,t={},i){super({autoDestroy:!1,highWaterMark:0}),this[Yf]=0...
  method normalizeArguments (line 195) | static normalizeArguments(e,t,i){var n,s,o,a,l;let c=t;if(Ee.default.obj...
  method _lockWrite (line 195) | _lockWrite(){let e=()=>{throw new TypeError("The payload has been alread...
  method _unlockWrite (line 195) | _unlockWrite(){this.write=super.write,this.end=super.end}
  method _finalizeBody (line 195) | async _finalizeBody(){let{options:e}=this,{headers:t}=e,i=!Ee.default.un...
  method _onResponseBase (line 195) | async _onResponseBase(e){let{options:t}=this,{url:i}=t;this[I6]=e,t.deco...
  method _onResponse (line 195) | async _onResponse(e){try{await this._onResponseBase(e)}catch(t){this._be...
  method _onRequest (line 195) | _onRequest(e){let{options:t}=this,{timeout:i,url:n}=t;tDe.default(e),thi...
  method _createCacheableRequest (line 195) | async _createCacheableRequest(e,t){return new Promise((i,n)=>{Object.ass...
  method _makeRequest (line 195) | async _makeRequest(){var e,t,i,n,s;let{options:o}=this,{headers:a}=o;for...
  method _error (line 195) | async _error(e){try{for(let t of this.options.hooks.beforeError)e=await ...
  method _beforeError (line 195) | _beforeError(e){if(this[Jf])return;let{options:t}=this,i=this.retryCount...
  method _read (line 195) | _read(){this[nB]=!0;let e=this[sB];if(e&&!this[Jf]){e.readableLength&&(t...
  method _write (line 195) | _write(e,t,i){let n=()=>{this._writeRequest(e,t,i)};this.requestInitiali...
  method _writeRequest (line 195) | _writeRequest(e,t,i){this[Pi].destroyed||(this._progressCallbacks.push((...
  method _final (line 195) | _final(e){let t=()=>{for(;this._progressCallbacks.length!==0;)this._prog...
  method _destroy (line 195) | _destroy(e,t){var i;this[Jf]=!0,clearTimeout(this[y6]),Pi in this&&(this...
  method _isAboutToError (line 195) | get _isAboutToError(){return this[Jf]}
  method ip (line 195) | get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteA...
  method aborted (line 195) | get aborted(){var e,t,i;return((t=(e=this[Pi])===null||e===void 0?void 0...
  method socket (line 195) | get socket(){var e,t;return(t=(e=this[Pi])===null||e===void 0?void 0:e.s...
  method downloadProgress (line 195) | get downloadProgress(){let e;return this[Gf]?e=this[Yf]/this[Gf]:this[Gf...
  method uploadProgress (line 195) | get uploadProgress(){let e;return this[jf]?e=this[qf]/this[jf]:this[jf]=...
  method timings (line 195) | get timings(){var e;return(e=this[Pi])===null||e===void 0?void 0:e.timings}
  method isFromCache (line 195) | get isFromCache(){return this[m6]}
  method pipe (line 195) | pipe(e,t){if(this[E6])throw new Error("Failed to pipe. The response has ...
  method unpipe (line 195) | unpipe(e){return e instanceof hR.ServerResponse&&this[iB].delete(e),supe...
  method constructor (line 195) | constructor(e,t){let{options:i}=t.request;super(`${e.message} in "${i.ur...
  method constructor (line 195) | constructor(e){super("Promise was canceled",{},e),this.name="CancelError"}
  method isCanceled (line 195) | get isCanceled(){return!0}
  function x6 (line 195) | function x6(r){let e,t,i=new SDe.EventEmitter,n=new xDe((o,a,l)=>{let c=...
  function FDe (line 195) | function FDe(r,...e){let t=(async()=>{if(r instanceof RDe.RequestError)t...
  function k6 (line 195) | function k6(r){for(let e of Object.values(r))(D6.default.plainObject(e)|...
  function VDe (line 195) | function VDe(r){var e=new qa(r);return e.request=SR.request,e}
  function XDe (line 195) | function XDe(r){var e=new qa(r);return e.request=SR.request,e.createSock...
  function ZDe (line 195) | function ZDe(r){var e=new qa(r);return e.request=H6.request,e}
  function _De (line 195) | function _De(r){var e=new qa(r);return e.request=H6.request,e.createSock...
  function qa (line 195) | function qa(r){var e=this;e.options=r||{},e.proxyOptions=e.options.proxy...
  function l (line 195) | function l(){s.emit("free",a,o)}
  function c (line 195) | function c(u){s.removeSocket(a),a.removeListener("free",l),a.removeListe...
  function a (line 195) | function a(g){g.upgrade=!0}
  function l (line 195) | function l(g,f,h){process.nextTick(function(){c(g,f,h)})}
  function c (line 195) | function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.sta...
  function u (line 195) | function u(g){o.removeAllListeners(),$A(`tunneling socket could not be e...
  function G6 (line 196) | function G6(r,e){var t=this;qa.prototype.createSocket.call(t,r,function(...
  function Y6 (line 196) | function Y6(r,e,t){return typeof r=="string"?{host:r,port:e,localAddress...
  function vR (line 196) | function vR(r){for(var e=1,t=arguments.length;e<t;++e){var i=arguments[e...
  function h (line 196) | function h(d){return t.locateFile?t.locateFile(d,f):f+d}
  function H (line 196) | function H(d,E){return E||(E=T),Math.ceil(d/E)*E}
  function _ (line 196) | function _(d,E,I){switch(E=E||"i8",E.charAt(E.length-1)==="*"&&(E="i32")...
  function re (line 196) | function re(d,E){d||wr("Assertion failed: "+E)}
  function O (line 196) | function O(d){var E=t["_"+d];return re(E,"Cannot call unknown function "...
  function F (line 196) | function F(d,E,I,k,L){var Z={string:function(it){var Et=0;if(it!=null&&i...
  function ue (line 196) | function ue(d,E,I,k){I=I||[];var L=I.every(function(te){return te==="num...
  function ke (line 196) | function ke(d,E,I){for(var k=E+I,L=E;d[L]&&!(L>=k);)++L;if(L-E>16&&d.sub...
  function Fe (line 196) | function Fe(d,E){return d?ke(Y,d,E):""}
  function Ne (line 196) | function Ne(d,E,I,k){if(!(k>0))return 0;for(var L=I,Z=I+k-1,te=0;te<d.le...
  function oe (line 196) | function oe(d,E,I){return Ne(d,Y,E,I)}
  function le (line 196) | function le(d){for(var E=0,I=0;I<d.length;++I){var k=d.charCodeAt(I);k>=...
  function Be (line 196) | function Be(d){var E=le(d)+1,I=dt(E);return I&&Ne(d,ne,I,E),I}
  function fe (line 196) | function fe(d,E){ne.set(d,E)}
  function ae (line 196) | function ae(d,E){return d%E>0&&(d+=E-d%E),d}
  function Or (line 196) | function Or(d){qe=d,t.HEAP8=ne=new Int8Array(d),t.HEAP16=he=new Int16Arr...
  function pr (line 196) | function pr(){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t....
  function Ii (line 196) | function Ii(){Ks=!0,!t.noFSInit&&!S.init.initialized&&S.init(),ns.init()...
  function rs (line 196) | function rs(){if(t.postRun)for(typeof t.postRun=="function"&&(t.postRun=...
  function fa (line 196) | function fa(d){hr.unshift(d)}
  function dA (line 196) | function dA(d){fi.unshift(d)}
  function cg (line 196) | function cg(d){ni.unshift(d)}
  function wp (line 196) | function wp(d){return d}
  function mA (line 196) | function mA(d){is++,t.monitorRunDependencies&&t.monitorRunDependencies(is)}
  function EA (line 196) | function EA(d){if(is--,t.monitorRunDependencies&&t.monitorRunDependencie...
  function wr (line 196) | function wr(d){t.onAbort&&t.onAbort(d),d+="",D(d),Ae=!0,ge=1,d="abort("+...
  function ug (line 196) | function ug(d){return d.startsWith(Tl)}
  function gg (line 196) | function gg(d){try{if(d==yo&&V)return new Uint8Array(V);var E=Ca(d);if(E...
  function Bp (line 196) | function Bp(d,E){var I,k,L;try{L=gg(d),k=new WebAssembly.Module(L),I=new...
  function bp (line 196) | function bp(){var d={a:ma};function E(L,Z){var te=L.exports;t.asm=te,A=t...
  function wo (line 196) | function wo(d){for(;d.length>0;){var E=d.shift();if(typeof E=="function"...
  function Fn (line 196) | function Fn(d,E){var I=new Date(de[d>>2]*1e3);de[E>>2]=I.getUTCSeconds()...
  function fg (line 196) | function fg(d,E){return Fn(d,E)}
  function Ll (line 196) | function Ll(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=...
  function I (line 196) | function I(Je){for(var nt=0;nt<Je.length&&Je[nt]==="";nt++);for(var wt=J...
  function ss (line 198) | function ss(d){for(var E=H(d,65536),I=dt(E);d<E;)ne[I+d++]=0;return I}
  function L (line 198) | function L(te){return S.syncFSRequests--,E(te)}
  function Z (line 198) | function Z(te){if(te)return Z.errored?void 0:(Z.errored=!0,L(te));++k>=I...
  function Z (line 198) | function Z(){this.lengthKnown=!1,this.chunks=[]}
  function lt (line 198) | function lt(it){function Et(On){Je&&Je(),we||S.createDataFile(d,E,On,k,L...
  function lt (line 198) | function lt(){nt==0?E():I()}
  function lt (line 198) | function lt(){nt==0?E():I()}
  function hg (line 198) | function hg(d,E){try{return d=Lt.getStr(d),S.chmod(d,E),0}catch(I){retur...
  function Ol (line 198) | function Ol(d){return de[Ft()>>2]=d,d}
  function Qp (line 198) | function Qp(d,E,I){Lt.varargs=I;try{var k=Lt.getStreamFromFD(d);switch(E...
  function Sp (line 198) | function Sp(d,E){try{var I=Lt.getStreamFromFD(d);return Lt.doStat(S.stat...
  function vp (line 198) | function vp(d,E,I){Lt.varargs=I;try{var k=Lt.getStreamFromFD(d);switch(E...
  function xp (line 198) | function xp(d,E,I){Lt.varargs=I;try{var k=Lt.getStr(d),L=I?Lt.get():0,Z=...
  function Pp (line 198) | function Pp(d,E){try{return d=Lt.getStr(d),E=Lt.getStr(E),S.rename(d,E),...
  function G (line 198) | function G(d){try{return d=Lt.getStr(d),S.rmdir(d),0}catch(E){return(typ...
  function yt (line 198) | function yt(d,E){try{return d=Lt.getStr(d),Lt.doStat(S.stat,d,E)}catch(I...
  function IA (line 198) | function IA(d){try{return d=Lt.getStr(d),S.unlink(d),0}catch(E){return(t...
  function zi (line 198) | function zi(d,E,I){Y.copyWithin(d,E,E+I)}
  function Ml (line 198) | function Ml(d){try{return A.grow(d-qe.byteLength+65535>>>16),Or(A.buffer...
  function Xe (line 198) | function Xe(d){var E=Y.length;d=d>>>0;var I=2147483648;if(d>I)return!1;f...
  function pa (line 198) | function pa(d){try{var E=Lt.getStreamFromFD(d);return S.close(E),0}catch...
  function pg (line 198) | function pg(d,E){try{var I=Lt.getStreamFromFD(d),k=I.tty?2:S.isDir(I.mod...
  function OE (line 198) | function OE(d,E,I,k){try{var L=Lt.getStreamFromFD(d),Z=Lt.doReadv(L,E,I)...
  function Dp (line 198) | function Dp(d,E,I,k,L){try{var Z=Lt.getStreamFromFD(d),te=4294967296,we=...
  function ME (line 198) | function ME(d,E,I,k){try{var L=Lt.getStreamFromFD(d),Z=Lt.doWritev(L,E,I...
  function ar (line 198) | function ar(d){$(d)}
  function Tn (line 198) | function Tn(d){var E=Date.now()/1e3|0;return d&&(de[d>>2]=E),E}
  function Kl (line 198) | function Kl(){if(Kl.called)return;Kl.called=!0;var d=new Date().getFullY...
  function kp (line 198) | function kp(d){Kl();var E=Date.UTC(de[d+20>>2]+1900,de[d+16>>2],de[d+12>...
  function yA (line 198) | function yA(d,E,I){var k=I>0?I:le(d)+1,L=new Array(k),Z=Ne(d,L,0,L.lengt...
  function mg (line 198) | function mg(d){if(typeof g=="boolean"&&g){var E;try{E=Buffer.from(d,"bas...
  function Ca (line 198) | function Ca(d){if(!!ug(d))return mg(d.slice(Tl.length))}
  function QA (line 198) | function QA(d){if(d=d||a,is>0||(pr(),is>0))return;function E(){Me||(Me=!...
  function dke (line 198) | function dke(r,e){for(var t=-1,i=r==null?0:r.length,n=Array(i);++t<i;)n[...
  function RV (line 198) | function RV(r){if(typeof r=="string")return r;if(Eke(r))return mke(r,RV)...
  function Bke (line 198) | function Bke(r){return r==null?"":wke(r)}
  function bke (line 198) | function bke(r,e,t){var i=-1,n=r.length;e<0&&(e=-e>n?0:n+e),t=t>n?n:t,t<...
  function Ske (line 198) | function Ske(r,e,t){var i=r.length;return t=t===void 0?i:t,!e&&t>=i?r:Qk...
  function Tke (line 198) | function Tke(r){return Nke.test(r)}
  function Lke (line 198) | function Lke(r){return r.split("")}
  function Vke (line 198) | function Vke(r){return r.match(zke)||[]}
  function $ke (line 198) | function $ke(r){return Zke(r)?_ke(r):Xke(r)}
  function nRe (line 198) | function nRe(r){return function(e){e=iRe(e);var t=tRe(e)?rRe(e):void 0,i...
  function lRe (line 198) | function lRe(r){return ARe(aRe(r).toLowerCase())}
  function cRe (line 198) | function cRe(){var r=0,e=1,t=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=1...
  function gRe (line 198) | function gRe(){if(kB)return kB;if(typeof Intl.Segmenter<"u"){let r=new I...
  method constructor (line 198) | constructor(e,t,i){this.src=e,this.dest=t,this.opts=i,this.ondrain=()=>e...
  method unpipe (line 198) | unpipe(){this.dest.removeListener("drain",this.ondrain)}
  method proxyErrors (line 198) | proxyErrors(){}
  method end (line 198) | end(){this.unpipe(),this.opts.end&&this.dest.end()}
  method unpipe (line 198) | unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}
  method constructor (line 198) | constructor(e,t,i){super(e,t,i),this.proxyErrors=n=>t.emit("error",n),e....
  method constructor (line 198) | constructor(e){super(),this[UB]=!1,this[TC]=!1,this.pipes=[],this.buffer...
  method bufferLength (line 198) | get bufferLength(){return this[Ci]}
  method encoding (line 198) | get encoding(){return this[xn]}
  method encoding (line 198) | set encoding(e){if(this[Hi])throw new Error("cannot set encoding in obje...
  method setEncoding (line 198) | setEncoding(e){this.encoding=e}
  method objectMode (line 198) | get objectMode(){return this[Hi]}
  method objectMode (line 198) | set objectMode(e){this[Hi]=this[Hi]||!!e}
  method async (line 198) | get async(){return this[Xa]}
  method async (line 198) | set async(e){this[Xa]=this[Xa]||!!e}
  method write (line 198) | write(e,t,i){if(this[Wa])throw new Error("write after end");if(this[Gi])...
  method read (line 198) | read(e){if(this[Gi])return null;if(this[Ci]===0||e===0||e>this[Ci])retur...
  method [Q9] (line 198) | [Q9](e,t){return e===t.length||e===null?this[ZR]():(this.buffer[0]=t.sli...
  method end (line 198) | end(e,t,i){return typeof e=="function"&&(i=e,e=null),typeof t=="function...
  method [Zf] (line 198) | [Zf](){this[Gi]||(this[TC]=!1,this[UB]=!0,this.emit("resume"),this.buffe...
  method resume (line 198) | resume(){return this[Zf]()}
  method pause (line 198) | pause(){this[UB]=!1,this[TC]=!0}
  method destroyed (line 198) | get destroyed(){return this[Gi]}
  method flowing (line 198) | get flowing(){return this[UB]}
  method paused (line 198) | get paused(){return this[TC]}
  method [XR] (line 198) | [XR](e){this[Hi]?this[Ci]+=1:this[Ci]+=e.length,this.buffer.push(e)}
  method [ZR] (line 198) | [ZR](){return this.buffer.length&&(this[Hi]?this[Ci]-=1:this[Ci]-=this.b...
  method [KB] (line 198) | [KB](e){do;while(this[S9](this[ZR]()));!e&&!this.buffer.length&&!this[Wa...
  method [S9] (line 198) | [S9](e){return e?(this.emit("data",e),this.flowing):!1}
  method pipe (line 198) | pipe(e,t){if(this[Gi])return;let i=this[rl];return t=t||{},e===w9.stdout...
  method unpipe (line 198) | unpipe(e){let t=this.pipes.find(i=>i.dest===e);t&&(this.pipes.splice(thi...
  method addListener (line 198) | addListener(e,t){return this.on(e,t)}
  method on (line 198) | on(e,t){let i=super.on(e,t);return e==="data"&&!this.pipes.length&&!this...
  method emittedEnd (line 198) | get emittedEnd(){return this[rl]}
  method [za] (line 198) | [za](){!this[OB]&&!this[rl]&&!this[Gi]&&this.buffer.length===0&&this[Wa]...
  method emit (line 198) | emit(e,t,...i){if(e!=="error"&&e!=="close"&&e!==Gi&&this[Gi])return;if(e...
  method [_R] (line 198) | [_R](e){for(let i of this.pipes)i.dest.write(e)===!1&&this.pause();let t...
  method [v9] (line 198) | [v9](){this[rl]||(this[rl]=!0,this.readable=!1,this[Xa]?LC(()=>this[$R](...
  method [$R] (line 198) | [$R](){if(this[Va]){let t=this[Va].end();if(t){for(let i of this.pipes)i...
  method collect (line 198) | collect(){let e=[];this[Hi]||(e.dataLength=0);let t=this.promise();retur...
  method concat (line 198) | concat(){return this[Hi]?Promise.reject(new Error("cannot concat in obje...
  method promise (line 198) | promise(){return new Promise((e,t)=>{this.on(Gi,()=>t(new Error("stream ...
  method [SRe] (line 198) | [SRe](){return{next:()=>{let t=this.read();if(t!==null)return Promise.re...
  method [vRe] (line 198) | [vRe](){return{next:()=>{let t=this.read();return{value:t,done:t===null}}}}
  method destroy (line 198) | destroy(e){return this[Gi]?(e?this.emit("error",e):this.emit(Gi),this):(...
  method isStream (line 198) | static isStream(e){return!!e&&(e instanceof P9||e instanceof B9||e insta...
  method constructor (line 198) | constructor(e){super("zlib: "+e.message),this.code=e.code,this.errno=e.e...
  method name (line 198) | get name(){return"ZlibError"}
  method constructor (line 198) | constructor(e,t){if(!e||typeof e!="object")throw new TypeError("invalid ...
  method close (line 198) | close(){this[cr]&&(this[cr].close(),this[cr]=null,this.emit("close"))}
  method reset (line 198) | reset(){if(!this[$f])return sF(this[cr],"zlib binding closed"),this[cr]....
  method flush (line 198) | flush(e){this.ended||(typeof e!="number"&&(e=this[pF]),this.write(Object...
  method end (line 198) | end(e,t,i){return e&&this.write(e,t),this.flush(this[N9]),this[iF]=!0,su...
  method ended (line 198) | get ended(){return this[iF]}
  method write (line 198) | write(e,t,i){if(typeof t=="function"&&(i=t,t="utf8"),typeof e=="string"&...
  method [Hc] (line 198) | [Hc](e){return super.write(e)}
  method constructor (line 198) | constructor(e,t){e=e||{},e.flush=e.flush||Uc.Z_NO_FLUSH,e.finishFlush=e....
  method params (line 198) | params(e,t){if(!this[$f]){if(!this[cr])throw new Error("cannot switch pa...
  method constructor (line 198) | constructor(e){super(e,"Deflate")}
  method constructor (line 198) | constructor(e){super(e,"Inflate")}
  method constructor (line 198) | constructor(e){super(e,"Gzip"),this[nF]=e&&!!e.portable}
  method [Hc] (line 198) | [Hc](e){return this[nF]?(this[nF]=!1,e[9]=255,super[Hc](e)):super[Hc](e)}
  method constructor (line 198) | constructor(e){super(e,"Gunzip")}
  method constructor (line 198) | constructor(e){super(e,"DeflateRaw")}
  method constructor (line 198) | constructor(e){super(e,"InflateRaw")}
  method constructor (line 198) | constructor(e){super(e,"Unzip")}
  method constructor (line 198) | constructor(e,t){e=e||{},e.flush=e.flush||Uc.BROTLI_OPERATION_PROCESS,e....
  method constructor (line 198) | constructor(e){super(e,"BrotliCompress")}
  method constructor (line 198) | constructor(e){super(e,"BrotliDecompress")}
  method constructor (line 198) | constructor(){throw new Error("Brotli is not supported in this version o...
  method constructor (line 198) | constructor(e,t,i){switch(super(),this.pause(),this.extended=t,this.glob...
  method write (line 198) | write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing m...
  method [mF] (line 198) | [mF](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i==="path")&&(...
  method constructor (line 198) | constructor(e,t,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!...
  method decode (line 198) | decode(e,t,i,n){if(t||(t=0),!e||!(e.length>=t+512))throw new Error("need...
  method [yF] (line 198) | [yF](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i==="path")&&(...
  method encode (line 198) | encode(e,t){if(e||(e=this.block=Buffer.alloc(512),t=0),t||(t=0),!(e.leng...
  method set (line 198) | set(e){for(let t in e)e[t]!==null&&e[t]!==void 0&&(this[t]=e[t])}
  method type (line 198) | get type(){return IF.name.get(this[Zn])||this[Zn]}
  method typeKey (line 198) | get typeKey(){return this[Zn]}
  method type (line 198) | set type(e){IF.code.has(e)?this[Zn]=IF.code.get(e):this[Zn]=e}
  method constructor (line 198) | constructor(e,t){this.atime=e.atime||null,this.charset=e.charset||null,t...
  method encode (line 198) | encode(){let e=this.encodeBody();if(e==="")return null;let t=Buffer.byte...
  method encodeBody (line 198) | encodeBody(){return this.encodeField("path")+this.encodeField("ctime")+t...
  method encodeField (line 198) | encodeField(e){if(this[e]===null||this[e]===void 0)return"";let t=this[e...
  method warn (line 200) | warn(e,t,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),...
  method constructor (line 200) | constructor(e,t){if(t=t||{},super(t),typeof e!="string")throw new TypeEr...
  method emit (line 200) | emit(e,...t){return e==="error"&&(this[i7]=!0),super.emit(e,...t)}
  method [DF] (line 200) | [DF](){Zo.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);t...
  method [ZB] (line 200) | [ZB](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.s...
  method [$9] (line 200) | [$9](){switch(this.type){case"File":return this[e7]();case"Directory":re...
  method [_B] (line 200) | [_B](e){return c7(e,this.type==="Directory",this.portable)}
  method [_o] (line 200) | [_o](e){return a7(e,this.prefix)}
  method [KC] (line 200) | [KC](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.he...
  method [t7] (line 200) | [t7](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,thi...
  method [PF] (line 200) | [PF](){Zo.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e...
  method [RF] (line 200) | [RF](e){this.linkpath=Xo(e),this[KC](),this.end()}
  method [r7] (line 200) | [r7](e){this.type="Link",this.linkpath=Xo(_9.relative(this.cwd,e)),this....
  method [e7] (line 200) | [e7](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(th...
  method [FF] (line 200) | [FF](){Zo.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e...
  method [NF] (line 200) | [NF](e){if(this.fd=e,this[i7])return this[ol]();this.blockLen=512*Math.c...
  method [XB] (line 200) | [XB](){let{fd:e,buf:t,offset:i,length:n,pos:s}=this;Zo.read(e,t,i,n,s,(o...
  method [ol] (line 200) | [ol](e){Zo.close(this.fd,e)}
  method [kF] (line 200) | [kF](e){if(e<=0&&this.remain>0){let n=new Error("encountered unexpected ...
  method [TF] (line 200) | [TF](e){this.once("drain",e)}
  method write (line 200) | write(e){if(this.blockRemain<e.length){let t=new Error("writing more dat...
  method [xF] (line 200) | [xF](){if(!this.remain)return this.blockRemain&&super.write(Buffer.alloc...
  method [DF] (line 200) | [DF](){this[ZB](Zo.lstatSync(this.absolute))}
  method [PF] (line 200) | [PF](){this[RF](Zo.readlinkSync(this.absolute))}
  method [FF] (line 200) | [FF](){this[NF](Zo.openSync(this.absolute,"r"))}
  method [XB] (line 200) | [XB](){let e=!0;try{let{fd:t,buf:i,offset:n,length:s,pos:o}=this,a=Zo.re...
  method [TF] (line 200) | [TF](e){e()}
  method [ol] (line 200) | [ol](e){Zo.closeSync(this.fd),e()}
  method constructor (line 200) | constructor(e,t){t=t||{},super(t),this.preservePaths=!!t.preservePaths,t...
  method [_o] (line 200) | [_o](e){return a7(e,this.prefix)}
  method [_B] (line 200) | [_B](e){return c7(e,this.type==="Directory",this.portable)}
  method write (line 200) | write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing m...
  method end (line 200) | end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain...
  method constructor (line 200) | constructor(e,t){this.path=e||"./",this.absolute=t,this.entry=null,this....
  method constructor (line 200) | constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e....
  method [C7] (line 200) | [C7](e){return super.write(e)}
  method add (line 200) | add(e){return this.write(e),this}
  method end (line 200) | end(e){return e&&this.write(e),this[e0]=!0,this[jc](),this}
  method write (line 200) | write(e){if(this[e0])throw new Error("write after end");return e instanc...
  method [h7] (line 200) | [h7](e){let t=HF(d7.resolve(this.cwd,e.path));if(!this.filter(e.path,e))...
  method [i0] (line 200) | [i0](e){let t=HF(d7.resolve(this.cwd,e));this[$o].push(new o0(e,t)),this...
  method [GF] (line 200) | [GF](e){e.pending=!0,this[ea]+=1;let t=this.follow?"stat":"lstat";a0[t](...
  method [r0] (line 200) | [r0](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t...
  method [YF] (line 200) | [YF](e){e.pending=!0,this[ea]+=1,a0.readdir(e.absolute,(t,i)=>{if(e.pend...
  method [n0] (line 200) | [n0](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[jc]()}
  method [jc] (line 200) | [jc](){if(!this[t0]){this[t0]=!0;for(let e=this[$o].head;e!==null&&this[...
  method [sh] (line 200) | get[sh](){return this[$o]&&this[$o].head&&this[$o].head.value}
  method [MF] (line 200) | [MF](e){this[$o].shift(),this[ea]-=1,this[jc]()}
  method [f7] (line 200) | [f7](e){if(!e.pending){if(e.entry){e===this[sh]&&!e.piped&&this[s0](e);r...
  method [KF] (line 200) | [KF](e){return{onwarn:(t,i,n)=>this.warn(t,i,n),noPax:this.noPax,cwd:thi...
  method [p7] (line 200) | [p7](e){this[ea]+=1;try{return new this[jF](e.path,this[KF](e)).on("end"...
  method [UF] (line 200) | [UF](){this[sh]&&this[sh].entry&&this[sh].entry.resume()}
  method [s0] (line 200) | [s0](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=e.path,o=s==="...
  method pause (line 200) | pause(){return this.zip&&this.zip.pause(),super.pause()}
  method constructor (line 200) | constructor(e){super(e),this[jF]=fFe}
  method pause (line 200) | pause(){}
  method resume (line 200) | resume(){}
  method [GF] (line 200) | [GF](e){let t=this.follow?"statSync":"lstatSync";this[r0](e,a0[t](e.abso...
  method [YF] (line 200) | [YF](e,t){this[n0](e,a0.readdirSync(e.absolute))}
  method [s0] (line 200) | [s0](e){let t=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=...
  method constructor (line 200) | constructor(e,t){if(t=t||{},super(t),this.readable=!0,this.writable=!1,t...
  method fd (line 200) | get fd(){return this[rr]}
  method path (line 200) | get path(){return this[_a]}
  method write (line 200) | write(){throw new TypeError("this is a readable stream")}
  method end (line 200) | end(){throw new TypeError("this is a readable stream")}
  method [ll] (line 200) | [ll](){Pn.open(this[_a],"r",(e,t)=>this[gh](e,t))}
  method [gh] (line 200) | [gh](e,t){e?this[lh](e):(this[rr]=t,this.emit("open",t),this[Ah]())}
  method [_F] (line 200) | [_F](){return Buffer.allocUnsafe(Math.min(this[I7],this[c0]))}
  method [Ah] (line 200) | [Ah](){if(!this[al]){this[al]=!0;let e=this[_F]();if(e.length===0)return...
  method [VF] (line 200) | [VF](e,t,i){this[al]=!1,e?this[lh](e):this[ZF](t,i)&&this[Ah]()}
  method [lo] (line 200) | [lo](){if(this[uh]&&typeof this[rr]=="number"){let e=this[rr];this[rr]=n...
  method [lh] (line 200) | [lh](e){this[al]=!0,this[lo](),this.emit("error",e)}
  method [ZF] (line 200) | [ZF](e,t){let i=!1;return this[c0]-=e,e>0&&(i=super.write(e<t.length?t.s...
  method emit (line 200) | emit(e,t){switch(e){case"prefinish":case"finish":break;case"drain":typeo...
  method [ll] (line 200) | [ll](){let e=!0;try{this[gh](null,Pn.openSync(this[_a],"r")),e=!1}finall...
  method [Ah] (line 200) | [Ah](){let e=!0;try{if(!this[al]){this[al]=!0;do{let t=this[_F](),i=t.le...
  method [lo] (line 200) | [lo](){if(this[uh]&&typeof this[rr]=="number"){let e=this[rr];this[rr]=n...
  method constructor (line 200) | constructor(e,t){t=t||{},super(t),this.readable=!1,this.writable=!0,this...
  method emit (line 200) | emit(e,t){if(e==="error"){if(this[ch])return;this[ch]=!0}return super.em...
  method fd (line 200) | get fd(){return this[rr]}
  method path (line 200) | get path(){return this[_a]}
  method [lh] (line 200) | [lh](e){this[lo](),this[oh]=!0,this.emit("error",e)}
  method [ll] (line 200) | [ll](){Pn.open(this[_a],this[Al],this[f0],(e,t)=>this[gh](e,t))}
  method [gh] (line 200) | [gh](e,t){this[g0]&&this[Al]==="r+"&&e&&e.code==="ENOENT"?(this[Al]="w",...
  method end (line 200) | end(e,t){return e&&this.write(e,t),this[UC]=!0,!this[oh]&&!this[ta].leng...
  method write (line 200) | write(e,t){return typeof e=="string"&&(e=Buffer.from(e,t)),this[UC]?(thi...
  method [u0] (line 200) | [u0](e){Pn.write(this[rr],e,0,e.length,this[qc],(t,i)=>this[ah](t,i))}
  method [ah] (line 200) | [ah](e,t){e?this[lh](e):(this[qc]!==null&&(this[qc]+=t),this[ta].length?...
  method [zF] (line 200) | [zF](){if(this[ta].length===0)this[UC]&&this[ah](null,0);else if(this[ta...
  method [lo] (line 200) | [lo](){if(this[uh]&&typeof this[rr]=="number"){let e=this[rr];this[rr]=n...
  method [ll] (line 200) | [ll](){let e;if(this[g0]&&this[Al]==="r+")try{e=Pn.openSync(this[_a],thi...
  method [lo] (line 200) | [lo](){if(this[uh]&&typeof this[rr]=="number"){let e=this[rr];this[rr]=n...
  method [u0] (line 200) | [u0](e){let t=!0;try{this[ah](null,Pn.writeSync(this[rr],e,0,e.length,th...
  method constructor (line 200) | constructor(e){e=e||{},super(e),this.file=e.file||"",this[Vc]=null,this....
  method [v7] (line 200) | [v7](e,t){this[Vc]===null&&(this[Vc]=!1);let i;try{i=new IFe(e,t,this[Ps...
  method [B7] (line 200) | [B7](e){let t=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this...
  method [rN] (line 200) | [rN](){do;while(this[B7](this[eA].shift()));if(!this[eA].length){let e=t...
  method [iN] (line 200) | [iN](e,t){let i=this[Jc],n=i.blockRemain,s=n>=e.length&&t===0?e:e.slice(...
  method [S7] (line 200) | [S7](e,t){let i=this[Jc],n=this[iN](e,t);return this[Jc]||this[b7](i),n}
  method [zc] (line 200) | [zc](e,t,i){!this[eA].length&&!this[$a]?this.emit(e,t,i):this[eA].push([...
  method [b7] (line 200) | [b7](e){switch(this[zc]("meta",this[cl]),e.type){case"ExtendedHeader":ca...
  method abort (line 200) | abort(e){this[ul]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recov...
  method write (line 200) | write(e){if(this[ul])return;if(this[Dn]===null&&e){if(this[Er]&&(e=Buffe...
  method [nN] (line 200) | [nN](e){e&&!this[ul]&&(this[Er]=this[Er]?Buffer.concat([this[Er],e]):e)}
  method [sN] (line 200) | [sN](){if(this[Wc]&&!this[Q7]&&!this[ul]&&!this[m0]){this[Q7]=!0;let e=t...
  method [d0] (line 200) | [d0](e){if(this[m0])this[nN](e);else if(!e&&!this[Er])this[sN]();else{if...
  method [C0] (line 200) | [C0](e){let t=0,i=e.length;for(;t+512<=i&&!this[ul]&&!this[y0];)switch(t...
  method end (line 200) | end(e){this[ul]||(this[Dn]?this[Dn].end(e):(this[Wc]=!0,this.write(e)))}
  method constructor (line 200) | constructor(e,t){super("Cannot extract through symbolic link"),this.path...
  method name (line 200) | get name(){return"SylinkError"}
  method constructor (line 200) | constructor(e,t){super(t+": Cannot cd into '"+e+"'"),this.path=e,this.co...
  method name (line 200) | get name(){return"CwdError"}
  method constructor (line 200) | constructor(e){if(e||(e={}),e.ondone=t=>{this[mN]=!0,this[EN]()},super(e...
  method warn (line 200) | warn(e,t,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recove...
  method [EN] (line 200) | [EN](){this[mN]&&this[k0]===0&&(this.emit("prefinish"),this.emit("finish...
  method [jX] (line 200) | [jX](e){if(this.strip){let t=$n(e.path).split("/");if(t.length<this.stri...
  method [KX] (line 200) | [KX](e){if(!this[jX](e))return e.resume();switch(RNe.equal(typeof e.abso...
  method [Yi] (line 200) | [Yi](e,t){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY...
  method [fl] (line 200) | [fl](e,t,i){zX($n(e),{uid:this.uid,gid:this.gid,processUid:this.processU...
  method [qC] (line 200) | [qC](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="numb...
  method [JC] (line 200) | [JC](e){return JX(this.uid,e.uid,this.processUid)}
  method [WC] (line 200) | [WC](e){return JX(this.gid,e.gid,this.processGid)}
  method [wN] (line 200) | [wN](e,t){let i=e.mode&4095||this.fmode,n=new NNe.WriteStream(e.absolute...
  method [BN] (line 200) | [BN](e,t){let i=e.mode&4095||this.dmode;this[fl](e.absolute,i,n=>{if(n){...
  method [YX] (line 200) | [YX](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported ...
  method [HX] (line 200) | [HX](e,t){this[N0](e,e.linkpath,"symlink",t)}
  method [GX] (line 200) | [GX](e,t){let i=$n(tA.resolve(this.cwd,e.linkpath));this[N0](e,i,"link",t)}
  method [qX] (line 200) | [qX](){this[k0]++}
  method [mh] (line 200) | [mh](){this[k0]--,this[EN]()}
  method [bN] (line 200) | [bN](e){this[mh](),e.resume()}
  method [yN] (line 200) | [yN](e,t){return e.type==="File"&&!this.unlink&&t.isFile()&&t.nlink<=1&&...
  method [IN] (line 200) | [IN](e){this[qX]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.re...
  method [F0] (line 200) | [F0](e){e.type==="SymbolicLink"?YNe(this.dirCache):e.type!=="Directory"&...
  method [UX] (line 200) | [UX](e,t){this[F0](e);let i=a=>{this[F0](e),t(a)},n=()=>{this[fl](this.c...
  method [Rs] (line 200) | [Rs](e,t,i){if(e){this[Yi](e,t),i();return}switch(t.type){case"File":cas...
  method [N0] (line 200) | [N0](e,t,i,n){jt[i](t,e.absolute,s=>{s?this[Yi](s,e):(this[mh](),e.resum...
  method [Rs] (line 200) | [Rs](e,t){return super[Rs](e,t,()=>{})}
  method [IN] (line 200) | [IN](e){if(this[F0](e),!this[zC]){let s=this[fl](this.cwd,this.dmode);if...
  method [wN] (line 200) | [wN](e,t){let i=e.mode&4095||this.fmode,n=a=>{let l;try{jt.closeSync(s)}...
  method [BN] (line 200) | [BN](e,t){let i=e.mode&4095||this.dmode,n=this[fl](e.absolute,i);if(n){t...
  method [fl] (line 200) | [fl](e,t){try{return zX.sync($n(e),{uid:this.uid,gid:this.gid,processUid...
  method [N0] (line 200) | [N0](e,t,i,n){try{jt[i+"Sync"](t,e.absolute),n(),e.resume()}catch(s){ret...
  function r (line 200) | function r(n,s){var o=s?"\u2514":"\u251C";return n?o+="\u2500 ":o+="\u25...
  function e (line 200) | function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof ...
    method constructor (line 215) | constructor(i){super(i)}
    method submit (line 215) | async submit(){this.value=await r.call(this,this.values,this.state),su...
    method create (line 215) | static create(i){return Nne(i)}
  function t (line 200) | function t(n,s,o,a,l,c,u){var g="",f=0,h,p,C=a.slice(0);if(C.push([s,o])...
    method constructor (line 215) | constructor(n){super({...n,choices:e})}
    method create (line 215) | static create(n){return Lne(n)}
  function CTe (line 201) | function CTe(r,e){if(fTe(r))return!1;var t=typeof r;return t=="number"||...
  function bTe (line 201) | function bTe(r){if(!ETe(r))return!1;var e=mTe(r);return e==yTe||e==wTe||...
  function vTe (line 201) | function vTe(r){return!!vZ&&vZ in r}
  function DTe (line 201) | function DTe(r){if(r!=null){try{return PTe.call(r)}catch{}try{return r+"...
  function GTe (line 201) | function GTe(r){if(!FTe(r)||RTe(r))return!1;var e=kTe(r)?HTe:LTe;return ...
  function YTe (line 201) | function YTe(r,e){return r==null?void 0:r[e]}
  function JTe (line 201) | function JTe(r,e){var t=qTe(r,e);return jTe(t)?t:void 0}
  function VTe (line 201) | function VTe(){this.__data__=OZ?OZ(null):{},this.size=0}
  function XTe (line 201) | function XTe(r){var e=this.has(r)&&delete this.__data__[r];return this.s...
  function tLe (line 201) | function tLe(r){var e=this.__data__;if(ZTe){var t=e[r];return t===_Te?vo...
  function sLe (line 201) | function sLe(r){var e=this.__data__;return rLe?e[r]!==void 0:nLe.call(e,r)}
  function ALe (line 201) | function ALe(r,e){var t=this.__data__;return this.size+=this.has(r)?0:1,...
  function Eh (line 201) | function Eh(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e<t;){va...
  function hLe (line 201) | function hLe(){this.__data__=[],this.size=0}
  function pLe (line 201) | function pLe(r,e){return r===e||r!==r&&e!==e}
  function CLe (line 201) | function CLe(r,e){for(var t=r.length;t--;)if(dLe(r[t][0],e))return t;ret...
  function yLe (line 201) | function yLe(r){var e=this.__data__,t=mLe(e,r);if(t<0)return!1;var i=e.l...
  function BLe (line 201) | function BLe(r){var e=this.__data__,t=wLe(e,r);return t<0?void 0:e[t][1]}
  function QLe (line 201) | function QLe(r){return bLe(this.__data__,r)>-1}
  function vLe (line 201) | function vLe(r,e){var t=this.__data__,i=SLe(t,r);return i<0?(++this.size...
  function yh (line 201) | function yh(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e<t;){va...
  function MLe (line 201) | function MLe(){this.size=0,this.__data__={hash:new c_,map:new(OLe||LLe),...
  function KLe (line 201) | function KLe(r){var e=typeof r;return e=="string"||e=="number"||e=="symb...
  function HLe (line 201) | function HLe(r,e){var t=r.__data__;return ULe(e)?t[typeof e=="string"?"s...
  function YLe (line 201) | function YLe(r){var e=GLe(this,r).delete(r);return this.size-=e?1:0,e}
  function qLe (line 201) | function qLe(r){return jLe(this,r).get(r)}
  function WLe (line 201) | function WLe(r){return JLe(this,r).has(r)}
  function VLe (line 201) | function VLe(r,e){var t=zLe(this,r),i=t.size;return t.set(r,e),this.size...
  function wh (line 201) | function wh(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e<t;){va...
  function KN (line 201) | function KN(r,e){if(typeof r!="function"||e!=null&&typeof e!="function")...
  function nOe (line 201) | function nOe(r){var e=rOe(r,function(i){return t.size===iOe&&t.clear(),i...
  function fOe (line 201) | function fOe(r,e){return lOe(r)?r:cOe(r,e)?[r]:uOe(gOe(r))}
  function dOe (line 201) | function dOe(r){if(typeof r=="string"||hOe(r))return r;var e=r+"";return...
  function EOe (line 201) | function EOe(r,e){e=COe(e,r);for(var t=0,i=e.length;r!=null&&t<i;)r=r[mO...
  function wOe (line 201) | function wOe(r,e,t){e=="__proto__"&&L_?L_(r,e,{configurable:!0,enumerabl...
  function vOe (line 201) | function vOe(r,e,t){var i=r[e];(!(SOe.call(r,e)&&bOe(i,t))||t===void 0&&...
  function DOe (line 201) | function DOe(r,e){var t=typeof r;return e=e==null?xOe:e,!!e&&(t=="number...
  function TOe (line 201) | function TOe(r,e,t,i){if(!U_(r))return r;e=ROe(e,r);for(var n=-1,s=e.len...
  function KOe (line 201) | function KOe(r,e,t){for(var i=-1,n=e.length,s={};++i<n;){var o=e[i],a=LO...
  function UOe (line 201) | function UOe(r,e){return r!=null&&e in Object(r)}
  function jOe (line 201) | function jOe(r){return GOe(r)&&HOe(r)==YOe}
  function XOe (line 201) | function XOe(r){return typeof r=="number"&&r>-1&&r%1==0&&r<=VOe}
  function iMe (line 201) | function iMe(r,e,t){e=ZOe(e,r);for(var i=-1,n=e.length,s=!1;++i<n;){var ...
  function oMe (line 201) | function oMe(r,e){return r!=null&&sMe(r,e,nMe)}
  function lMe (line 201) | function lMe(r,e){return aMe(r,e,function(t,i){return AMe(r,i)})}
  function cMe (line 201) | function cMe(r,e){for(var t=-1,i=e.length,n=r.length;++t<i;)r[n+t]=e[t];...
  function fMe (line 201) | function fMe(r){return gMe(r)||uMe(r)||!!(n$&&r&&r[n$])}
  function a$ (line 201) | function a$(r,e,t,i,n){var s=-1,o=r.length;for(t||(t=pMe),n||(n=[]);++s<...
  function CMe (line 201) | function CMe(r){var e=r==null?0:r.length;return e?dMe(r,1):[]}
  function mMe (line 201) | function mMe(r,e,t){switch(t.length){case 0:return r.call(e);case 1:retu...
  function IMe (line 201) | function IMe(r,e,t){return e=h$(e===void 0?r.length-1:e,0),function(){fo...
  function yMe (line 201) | function yMe(r){return function(){return r}}
  function wMe (line 201) | function wMe(r){return r}
  function PMe (line 201) | function PMe(r){var e=0,t=0;return function(){var i=xMe(),n=vMe-(i-t);if...
  function LMe (line 201) | function LMe(r){return TMe(NMe(r,void 0,FMe),r+"")}
  function L$ (line 201) | function L$(r,e,t){if(!r||typeof r!="object"||typeof r=="function")retur...
  function O$ (line 201) | function O$(r){return L$(r,[],[])}
  function $Me (line 201) | function $Me(r){return r!=+r?"NaN":r===0&&1/r<0?"-0":""+r}
  function U$ (line 201) | function U$(r,e=!1){if(r==null||r===!0||r===!1)return""+r;let t=typeof r...
  function e1e (line 201) | function e1e(r,e){let t=U$(r,e);return t!==null?t:JSON.stringify(r,funct...
  function t1e (line 201) | function t1e(r){return r&&r.__esModule?r:{default:r}}
  function s1e (line 201) | function s1e(r,e){return r!=null&&n1e.call(r,e)}
  function A1e (line 201) | function A1e(r,e){return r!=null&&a1e(r,e,o1e)}
  function _$ (line 201) | function _$(r){return r&&r.__esModule?r:{default:r}}
  method constructor (line 201) | constructor(e,t){if(this.refs=e,this.refs=e,typeof t=="function"){this.f...
  method resolve (line 201) | resolve(e,t){let i=this.refs.map(s=>s.getValue(t==null?void 0:t.value,t=...
  function f1e (line 201) | function f1e(r){return r==null?[]:[].concat(r)}
  function eee (line 201) | function eee(r){return r&&r.__esModule?r:{default:r}}
  function nT (line 201) | function nT(){return nT=Object.assign||function(r){for(var e=1;e<argumen...
  method formatError (line 201) | static formatError(e,t){let i=t.label||t.path||"this";return i!==t.path&...
  method isError (line 201) | static isError(e){return e&&e.name==="ValidationError"}
  method constructor (line 201) | constructor(e,t,i,n){super(),this.name="ValidationError",this.value=t,th...
  function C1e (line 201) | function C1e(r){return r&&r.__esModule?r:{default:r}}
  function E1e (line 201) | function E1e(r,e){let{endEarly:t,tests:i,args:n,value:s,errors:o,sort:a,...
  function I1e (line 201) | function I1e(r){return function(e,t,i){for(var n=-1,s=Object(e),o=i(e),a...
  function B1e (line 201) | function B1e(r,e){for(var t=-1,i=Array(r);++t<r;)i[t]=e(t);return i}
  function b1e (line 201) | function b1e(){return!1}
  function iKe (line 201) | function iKe(r){return R1e(r)&&k1e(r.length)&&!!Ir[D1e(r)]}
  function nKe (line 201) | function nKe(r){return function(e){return r(e)}}
  function EKe (line 201) | function EKe(r,e){var t=fKe(r),i=!t&&gKe(r),n=!t&&!i&&hKe(r),s=!t&&!i&&!...
  function yKe (line 201) | function yKe(r){var e=r&&r.constructor,t=typeof e=="function"&&e.prototy...
  function wKe (line 201) | function wKe(r,e){return function(t){return r(e(t))}}
  function PKe (line 201) | function PKe(r){if(!QKe(r))return SKe(r);var e=[];for(var t in Object(r)...
  function RKe (line 201) | function RKe(r){return r!=null&&kKe(r.length)&&!DKe(r)}
  function LKe (line 201) | function LKe(r){return TKe(r)?FKe(r):NKe(r)}
  function KKe (line 201) | function KKe(r,e){return r&&OKe(r,e,MKe)}
  function HKe (line 201) | function HKe(){this.__data__=new UKe,this.size=0}
  function GKe (line 201) | function GKe(r){var e=this.__data__,t=e.delete(r);return this.size=e.siz...
  function YKe (line 201) | function YKe(r){return this.__data__.get(r)}
  function jKe (line 201) | function jKe(r){return this.__data__.has(r)}
  function VKe (line 201) | function VKe(r,e){var t=this.__data__;if(t instanceof qKe){var i=t.__dat...
 
Condensed preview — 1803 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,518K chars).
[
  {
    "path": ".appends/.github/labels.yml",
    "chars": 2789,
    "preview": "# ----------------------------------------------------------------------------------------- #\n# These are the repository"
  },
  {
    "path": ".dependabot/config.yml",
    "chars": 178,
    "preview": "version: 1\nupdate_configs:\n  - package_manager: 'javascript'\n    directory: '/'\n    update_schedule: 'live'\n    allowed_"
  },
  {
    "path": ".gitattributes",
    "chars": 19,
    "preview": "* text=auto eol=lf\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 251,
    "preview": "# Code owners\n.github/CODEOWNERS      @exercism/maintainers-admin\n\n# Changes to `fetch-configlet` should be made in the "
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 707,
    "preview": "version: 2\n\nupdates:\n  # Keep dependencies for GitHub Actions up-to-date\n  - package-ecosystem: 'github-actions'\n    dir"
  },
  {
    "path": ".github/labels.yml",
    "chars": 8261,
    "preview": "# --------------------------------------------------------------- #\n# This is an auto-generated file - Do not manually e"
  },
  {
    "path": ".github/workflows/action-format.yml",
    "chars": 4689,
    "preview": "name: 'typescript / format'\n\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  format:\n    name: 'Format code'\n    runs"
  },
  {
    "path": ".github/workflows/action-sync.yml",
    "chars": 4424,
    "preview": "name: 'typescript / sync'\n\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  format:\n    name: 'Sync all exercises'\n   "
  },
  {
    "path": ".github/workflows/ci.js.yml",
    "chars": 2887,
    "preview": "# This workflow will do a clean install of node dependencies and run tests across different versions of node\n# For more "
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 2267,
    "preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
  },
  {
    "path": ".github/workflows/configlet.yml",
    "chars": 215,
    "preview": "name: Configlet\n\non:\n  pull_request:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\npermissions:\n  contents: r"
  },
  {
    "path": ".github/workflows/no-important-files-changed.yml",
    "chars": 634,
    "preview": "name: No important files changed\n\non:\n  pull_request_target:\n    types: [opened]\n    branches: [main]\n    paths:\n      -"
  },
  {
    "path": ".github/workflows/pause-community-contributions.yml",
    "chars": 600,
    "preview": "name: Pause Community Contributions\n\non:\n  issues:\n    types:\n      - opened\n  pull_request_target:\n    types:\n      - o"
  },
  {
    "path": ".github/workflows/ping-cross-track-maintainers-team.yml",
    "chars": 424,
    "preview": "name: Ping cross-track maintainers team\n\non:\n  pull_request_target:\n    types:\n      - opened\n\npermissions:\n  pull-reque"
  },
  {
    "path": ".github/workflows/pr.ci.js.yml",
    "chars": 4082,
    "preview": "# This workflow will do a clean install of node dependencies and run tests across different versions of node\n# For more "
  },
  {
    "path": ".github/workflows/run-configlet-sync.yml",
    "chars": 192,
    "preview": "name: Run Configlet Sync\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 0 15 * *'\n\njobs:\n  call-gha-workflow:\n    "
  },
  {
    "path": ".github/workflows/sync-labels.yml",
    "chars": 333,
    "preview": "name: Tools\n\non:\n  push:\n    branches:\n      - main\n    paths:\n      - .github/labels.yml\n      - .github/workflows/sync"
  },
  {
    "path": ".github/workflows/verify-code-formatting.yml",
    "chars": 319,
    "preview": "name: typescript / format\n\non:\n  push:\n  pull_request:\n  workflow_dispatch:\n\njobs:\n  verify:\n    runs-on: ubuntu-24.04\n "
  },
  {
    "path": ".gitignore",
    "chars": 766,
    "preview": "*.swp\n.DS_Store\n.idea\nnpm-debug.log\nbuild\nbabel-output\nlintreport.json\ndebug.log\n\n# Binaries downloaded by binary downlo"
  },
  {
    "path": ".prettierignore",
    "chars": 557,
    "preview": "/.github/labels.yml\n/.github/workflows/sync-labels.yml\n/.github/workflows/no-important-files-changed.yml\nexercises/**/RE"
  },
  {
    "path": ".prettierrc",
    "chars": 154,
    "preview": "{\n  \"trailingComma\": \"es5\",\n  \"tabWidth\": 2,\n  \"semi\": false,\n  \"singleQuote\": true,\n  \"arrowParens\": \"always\",\n  \"print"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 118,
    "preview": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 310,
    "preview": "{\n  \"cSpell.words\": [\n    \"exercism\"\n  ],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  },\n  \"esli"
  },
  {
    "path": ".yarn/sdks/eslint/bin/eslint.js",
    "chars": 862,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/eslint/lib/api.js",
    "chars": 820,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/eslint/lib/unsupported-api.js",
    "chars": 883,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/eslint/package.json",
    "chars": 287,
    "preview": "{\n  \"name\": \"eslint\",\n  \"version\": \"9.8.0-sdk\",\n  \"main\": \"./lib/api.js\",\n  \"type\": \"commonjs\",\n  \"bin\": {\n    \"eslint\":"
  },
  {
    "path": ".yarn/sdks/integrations.yml",
    "chars": 115,
    "preview": "# This file is automatically generated by @yarnpkg/sdks.\n# Manual changes might be lost!\n\nintegrations:\n  - vscode\n"
  },
  {
    "path": ".yarn/sdks/prettier/bin/prettier.cjs",
    "chars": 877,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/prettier/index.cjs",
    "chars": 823,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/prettier/package.json",
    "chars": 129,
    "preview": "{\n  \"name\": \"prettier\",\n  \"version\": \"3.3.3-sdk\",\n  \"main\": \"./index.cjs\",\n  \"type\": \"commonjs\",\n  \"bin\": \"./bin/prettie"
  },
  {
    "path": ".yarn/sdks/typescript/bin/tsc",
    "chars": 856,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/typescript/bin/tsserver",
    "chars": 871,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/typescript/lib/tsc.js",
    "chars": 865,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/typescript/lib/tsserver.js",
    "chars": 9363,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/typescript/lib/tsserverlibrary.js",
    "chars": 9384,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/typescript/lib/typescript.js",
    "chars": 832,
    "preview": "#!/usr/bin/env node\n\nconst {existsSync} = require(`fs`);\nconst {createRequire, register} = require(`module`);\nconst {res"
  },
  {
    "path": ".yarn/sdks/typescript/package.json",
    "chars": 181,
    "preview": "{\n  \"name\": \"typescript\",\n  \"version\": \"5.5.4-sdk\",\n  \"main\": \"./lib/typescript.js\",\n  \"type\": \"commonjs\",\n  \"bin\": {\n  "
  },
  {
    "path": ".yarnrc.yml",
    "chars": 49,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 4341,
    "preview": "# Code of Conduct\n\n## Introduction\n\nExercism is a platform centered around empathetic conversation.\nWe have a low tolera"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 17798,
    "preview": "# Contributing\n\nThis is the TypeScript track, one of the many tracks on [exercism][web-exercism]. It holds all the _exer"
  },
  {
    "path": "LICENSE",
    "chars": 1065,
    "preview": "MIT License\n\nCopyright (c) 2021 Exercism\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\no"
  },
  {
    "path": "README.md",
    "chars": 3475,
    "preview": "# Exercism TypeScript Track\n\n[![configlet](https://github.com/exercism/typescript/actions/workflows/configlet.yml/badge."
  },
  {
    "path": "TAGS.md",
    "chars": 5001,
    "preview": "# Tags\n\nThis document aims to provide reasoning why `config.json` contains the `\"tags\"` it contains.\n\nIt uses as a basis"
  },
  {
    "path": "babel.config.cjs",
    "chars": 185,
    "preview": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/b"
  },
  {
    "path": "bin/check-formatting.sh",
    "chars": 2351,
    "preview": "#!/usr/bin/env bash\n\nset -uo pipefail\n\nif [ -z \"${EXERCISM_PRETTIER_VERSION:-}\" ]; then\n  echo \"[format] pulling prettie"
  },
  {
    "path": "bin/fetch-configlet",
    "chars": 2349,
    "preview": "#!/usr/bin/env bash\n\n# This file is a copy of the\n# https://github.com/exercism/configlet/blob/main/scripts/fetch-config"
  },
  {
    "path": "bin/fetch-configlet.ps1",
    "chars": 1857,
    "preview": "# This file is a copy of the\n# https://github.com/exercism/configlet/blob/main/scripts/fetch-configlet.ps1 file.\n# Pleas"
  },
  {
    "path": "bin/format.sh",
    "chars": 2360,
    "preview": "#!/usr/bin/env bash\n\nset -uo pipefail\n\nif [ -z \"${EXERCISM_PRETTIER_VERSION:-}\" ]; then\n  echo \"[format] pulling prettie"
  },
  {
    "path": "bin/generate-config-tree",
    "chars": 865,
    "preview": "#!/usr/bin/env node\n\nconst { exercises } = require('../config.json')\nconst TAG_CORE = '__core'\nconst TAG_BONUS = '__bonu"
  },
  {
    "path": "bin/md5-hash",
    "chars": 500,
    "preview": "#!/bin/bash\n#\n# Calculates the MD5 hash of a given file. It uses hashing utilities powered by\n# operating systems, but w"
  },
  {
    "path": "bin/print-config-tree",
    "chars": 810,
    "preview": "#!/usr/bin/env node\n\nconst actions = require('./generate-config-tree')\n\nconst { tree, TAG_BONUS, TAG_CORE } = actions\nco"
  },
  {
    "path": "common/.vscode/extensions.json",
    "chars": 118,
    "preview": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "common/.vscode/settings.json",
    "chars": 106,
    "preview": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "common/.yarnrc.yml",
    "chars": 49,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "common/babel.config.cjs",
    "chars": 185,
    "preview": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/b"
  },
  {
    "path": "common/eslint.config.mjs",
    "chars": 596,
    "preview": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport ma"
  },
  {
    "path": "common/jest.config.cjs",
    "chars": 465,
    "preview": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**"
  },
  {
    "path": "common/keep.ts",
    "chars": 68,
    "preview": "// This exists to keep tsconfig.json in this folder happy\nexport {}\n"
  },
  {
    "path": "common/package.json",
    "chars": 1267,
    "preview": "{\n  \"name\": \"@exercism/typescript\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n  \"autho"
  },
  {
    "path": "common/test-runner.mjs",
    "chars": 3042,
    "preview": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exerci"
  },
  {
    "path": "common/tsconfig.json",
    "chars": 1351,
    "preview": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the ne"
  },
  {
    "path": "concepts/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "concepts/basics/.meta/config.json",
    "chars": 224,
    "preview": "{\n  \"blurb\": \"Basics contains the minimal knowledge required to get started in TypeScript: function declarations, variab"
  },
  {
    "path": "concepts/basics/about.md",
    "chars": 10475,
    "preview": "# About\n\nTypeScript is JavaScript with syntax for types, making it a a strongly typed programming language, supporting o"
  },
  {
    "path": "concepts/basics/introduction.md",
    "chars": 6005,
    "preview": "# Introduction\n\nTypeScript is JavaScript with syntax for types, making it a a strongly typed programming language, suppo"
  },
  {
    "path": "concepts/basics/links.json",
    "chars": 1661,
    "preview": "[\n  {\n    \"url\": \"https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html\",\n    \"description\": \"TypeSc"
  },
  {
    "path": "config.json",
    "chars": 39968,
    "preview": "{\n  \"language\": \"TypeScript\",\n  \"slug\": \"typescript\",\n  \"active\": true,\n  \"status\": {\n    \"concept_exercises\": false,\n  "
  },
  {
    "path": "docs/ABOUT.md",
    "chars": 1640,
    "preview": "# About\n\n[TypeScript](https://www.typescriptlang.org/) (TS) is a superset of JavaScript (JS), created at Microsoft\nin re"
  },
  {
    "path": "docs/INSTALLATION.md",
    "chars": 3018,
    "preview": "# Installation\n\nYou need [NodeJS LTS](https://nodejs.org/en).\n\n> 💡 This track likely works with older stable versions, a"
  },
  {
    "path": "docs/LEARNING.md",
    "chars": 566,
    "preview": "# Learning\n\nIf you want to learn Typescript, check out the following resources.\n\n- [TS Tutorial](https://www.typescriptl"
  },
  {
    "path": "docs/RESOURCES.md",
    "chars": 1847,
    "preview": "# Resources\n\n## Recommended References\n\n- [TypeScript QuickStart](https://www.typescriptlang.org/docs/handbook/release-n"
  },
  {
    "path": "docs/SNIPPET.txt",
    "chars": 103,
    "preview": "\nexport class HelloWorld {\n  static hello(name = 'World'): string {\n    return `Hello, ${name}!`\n  }\n}\n"
  },
  {
    "path": "docs/TESTS.md",
    "chars": 1172,
    "preview": "# Tests\n\nBefore trying to execute the tests, ensure the assignment folder is set-up correctly by following the installat"
  },
  {
    "path": "docs/config.json",
    "chars": 1057,
    "preview": "{\n  \"docs\": [\n    {\n      \"uuid\": \"c79ecacf-6b92-4033-9f25-1f86e7299760\",\n      \"slug\": \"installation\",\n      \"path\": \"d"
  },
  {
    "path": "eslint.config.mjs",
    "chars": 863,
    "preview": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport ma"
  },
  {
    "path": "exercises/concept/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "exercises/concept/lasagna/.docs/hints.md",
    "chars": 1498,
    "preview": "# Hints\n\n## 1. Define the expected oven time in minutes\n\n- Define a [constant][constants] which should contain the [`num"
  },
  {
    "path": "exercises/concept/lasagna/.docs/instructions.md",
    "chars": 1856,
    "preview": "# Instructions\n\nLucian's girlfriend is on her way home, and he hasn't cooked their anniversary dinner!\n\nIn this exercise"
  },
  {
    "path": "exercises/concept/lasagna/.docs/introduction.md",
    "chars": 3711,
    "preview": "# Introduction\n\nJavaScript is a dynamic language, supporting object-oriented, imperative, and declarative (e.g. function"
  },
  {
    "path": "exercises/concept/lasagna/.meta/config.json",
    "chars": 633,
    "preview": "{\n  \"authors\": [\"SleeplessByte\"],\n  \"files\": {\n    \"solution\": [\n      \"lasagna.ts\"\n    ],\n    \"test\": [\n      \"__typete"
  },
  {
    "path": "exercises/concept/lasagna/.meta/design.md",
    "chars": 1466,
    "preview": "# Design\n\n## Learning objectives\n\n- Know what a variable is.\n- Know what a constant variable is.\n- Know how to define a "
  },
  {
    "path": "exercises/concept/lasagna/.meta/exemplar.ts",
    "chars": 1247,
    "preview": "/**\n * The amount of minutes the lasagna should be in the oven.\n */\nexport const EXPECTED_MINUTES_IN_OVEN = 40\n\n/**\n * T"
  },
  {
    "path": "exercises/concept/lasagna/.vscode/extensions.json",
    "chars": 118,
    "preview": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/concept/lasagna/.vscode/settings.json",
    "chars": 106,
    "preview": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/concept/lasagna/.yarnrc.yml",
    "chars": 49,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/concept/lasagna/__typetests__/lasagna.tst.ts",
    "chars": 1270,
    "preview": "import { describe, expect, test } from 'tstyche'\nimport {\n  EXPECTED_MINUTES_IN_OVEN,\n  remainingMinutesInOven,\n  prepar"
  },
  {
    "path": "exercises/concept/lasagna/babel.config.cjs",
    "chars": 185,
    "preview": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/b"
  },
  {
    "path": "exercises/concept/lasagna/eslint.config.mjs",
    "chars": 596,
    "preview": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport ma"
  },
  {
    "path": "exercises/concept/lasagna/jest.config.cjs",
    "chars": 465,
    "preview": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**"
  },
  {
    "path": "exercises/concept/lasagna/lasagna.test.ts",
    "chars": 1222,
    "preview": "import { describe, test, expect } from '@jest/globals'\n\nimport {\n  EXPECTED_MINUTES_IN_OVEN,\n  remainingMinutesInOven,\n "
  },
  {
    "path": "exercises/concept/lasagna/lasagna.ts",
    "chars": 2214,
    "preview": "// 👋🏽 Hi there!\n//\n// On the TypeScript track we provide you with stubs. These stubs provide a\n// starting point to solv"
  },
  {
    "path": "exercises/concept/lasagna/package.json",
    "chars": 1234,
    "preview": "{\n  \"name\": \"@exercism/typescript-lasagna\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism concept exercise on lasagna"
  },
  {
    "path": "exercises/concept/lasagna/test-runner.mjs",
    "chars": 3042,
    "preview": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exerci"
  },
  {
    "path": "exercises/concept/lasagna/tsconfig.json",
    "chars": 1351,
    "preview": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the ne"
  },
  {
    "path": "exercises/practice/accumulate/.docs/instructions.md",
    "chars": 694,
    "preview": "# Instructions\n\nImplement the `accumulate` operation, which, given a collection and an\noperation to perform on each elem"
  },
  {
    "path": "exercises/practice/accumulate/.meta/config.json",
    "chars": 916,
    "preview": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"emiller42\",\n    \"lumosmind\",\n    \"masters3d\",\n    \"pkch"
  },
  {
    "path": "exercises/practice/accumulate/.meta/proof.ci.ts",
    "chars": 219,
    "preview": "export function accumulate<T, O>(list: T[], accumulator: (arg: T) => O): O[] {\n  const out = []\n  let idx = -1\n  const e"
  },
  {
    "path": "exercises/practice/accumulate/.vscode/extensions.json",
    "chars": 118,
    "preview": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/.vscode/settings.json",
    "chars": 106,
    "preview": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/accumulate/.yarnrc.yml",
    "chars": 49,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/accumulate/accumulate.test.ts",
    "chars": 1316,
    "preview": "import { describe, it, expect, xit } from '@jest/globals'\nimport { accumulate } from './accumulate.ts'\n\ndescribe('accumu"
  },
  {
    "path": "exercises/practice/accumulate/accumulate.ts",
    "chars": 140,
    "preview": "export function accumulate(list: unknown, accumulator: unknown): never {\n  throw new Error('Remove this line and impleme"
  },
  {
    "path": "exercises/practice/accumulate/babel.config.cjs",
    "chars": 185,
    "preview": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/b"
  },
  {
    "path": "exercises/practice/accumulate/eslint.config.mjs",
    "chars": 596,
    "preview": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport ma"
  },
  {
    "path": "exercises/practice/accumulate/jest.config.cjs",
    "chars": 465,
    "preview": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**"
  },
  {
    "path": "exercises/practice/accumulate/package.json",
    "chars": 1145,
    "preview": "{\n  \"name\": \"@exercism/typescript-accumulate\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript."
  },
  {
    "path": "exercises/practice/accumulate/test-runner.mjs",
    "chars": 3042,
    "preview": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exerci"
  },
  {
    "path": "exercises/practice/accumulate/tsconfig.json",
    "chars": 1351,
    "preview": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the ne"
  },
  {
    "path": "exercises/practice/acronym/.docs/instructions.md",
    "chars": 571,
    "preview": "# Instructions\n\nConvert a phrase to its acronym.\n\nTechies love their TLA (Three Letter Acronyms)!\n\nHelp generate some ja"
  },
  {
    "path": "exercises/practice/acronym/.meta/config.json",
    "chars": 634,
    "preview": "{\n  \"authors\": [],\n  \"contributors\": [\n    \"lilislilit\",\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"sol"
  },
  {
    "path": "exercises/practice/acronym/.meta/proof.ci.ts",
    "chars": 339,
    "preview": "export function parse(phrase: string): string {\n  if (typeof phrase !== 'undefined' && phrase !== undefined) {\n    const"
  },
  {
    "path": "exercises/practice/acronym/.meta/tests.toml",
    "chars": 861,
    "preview": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will no"
  },
  {
    "path": "exercises/practice/acronym/.vscode/extensions.json",
    "chars": 118,
    "preview": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/acronym/.vscode/settings.json",
    "chars": 106,
    "preview": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/acronym/.yarnrc.yml",
    "chars": 49,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/acronym/acronym.test.ts",
    "chars": 830,
    "preview": "import { describe, it, expect, xit } from '@jest/globals'\nimport { parse } from './acronym.ts'\n\ndescribe('Acronym are pr"
  },
  {
    "path": "exercises/practice/acronym/acronym.ts",
    "chars": 117,
    "preview": "export function parse(phrase: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/acronym/babel.config.cjs",
    "chars": 185,
    "preview": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/b"
  },
  {
    "path": "exercises/practice/acronym/eslint.config.mjs",
    "chars": 596,
    "preview": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport ma"
  },
  {
    "path": "exercises/practice/acronym/jest.config.cjs",
    "chars": 465,
    "preview": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**"
  },
  {
    "path": "exercises/practice/acronym/package.json",
    "chars": 1142,
    "preview": "{\n  \"name\": \"@exercism/typescript-acronym\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n"
  },
  {
    "path": "exercises/practice/acronym/test-runner.mjs",
    "chars": 3042,
    "preview": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exerci"
  },
  {
    "path": "exercises/practice/acronym/tsconfig.json",
    "chars": 1351,
    "preview": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the ne"
  },
  {
    "path": "exercises/practice/all-your-base/.docs/instructions.md",
    "chars": 843,
    "preview": "# Instructions\n\nConvert a sequence of digits in one base, representing a number, into a sequence of digits in another ba"
  },
  {
    "path": "exercises/practice/all-your-base/.docs/introduction.md",
    "chars": 519,
    "preview": "# Introduction\n\nYou've just been hired as professor of mathematics.\nYour first week went well, but something is off in y"
  },
  {
    "path": "exercises/practice/all-your-base/.meta/config.json",
    "chars": 621,
    "preview": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \""
  },
  {
    "path": "exercises/practice/all-your-base/.meta/proof.ci.ts",
    "chars": 1329,
    "preview": "const isValidBase = (base: number): boolean => {\n  return !base || base < 2 || Math.floor(base) !== base\n}\n\nconst isInpu"
  },
  {
    "path": "exercises/practice/all-your-base/.meta/tests.toml",
    "chars": 1795,
    "preview": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will no"
  },
  {
    "path": "exercises/practice/all-your-base/.vscode/extensions.json",
    "chars": 118,
    "preview": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/.vscode/settings.json",
    "chars": 106,
    "preview": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/all-your-base/.yarnrc.yml",
    "chars": 49,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/all-your-base/all-your-base.test.ts",
    "chars": 2722,
    "preview": "import { describe, it, expect, xit } from '@jest/globals'\nimport { convert } from './all-your-base.ts'\n\ndescribe('Conver"
  },
  {
    "path": "exercises/practice/all-your-base/all-your-base.ts",
    "chars": 168,
    "preview": "export function convert(\n  digits: unknown,\n  inputBase: unknown,\n  outputBase: unknown\n): unknown {\n  throw new Error('"
  },
  {
    "path": "exercises/practice/all-your-base/babel.config.cjs",
    "chars": 185,
    "preview": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/b"
  },
  {
    "path": "exercises/practice/all-your-base/eslint.config.mjs",
    "chars": 596,
    "preview": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport ma"
  },
  {
    "path": "exercises/practice/all-your-base/jest.config.cjs",
    "chars": 465,
    "preview": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**"
  },
  {
    "path": "exercises/practice/all-your-base/package.json",
    "chars": 1148,
    "preview": "{\n  \"name\": \"@exercism/typescript-all-your-base\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescri"
  },
  {
    "path": "exercises/practice/all-your-base/test-runner.mjs",
    "chars": 3042,
    "preview": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exerci"
  },
  {
    "path": "exercises/practice/all-your-base/tsconfig.json",
    "chars": 1351,
    "preview": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the ne"
  },
  {
    "path": "exercises/practice/allergies/.docs/instructions.md",
    "chars": 991,
    "preview": "# Instructions\n\nGiven a person's allergy score, determine whether or not they're allergic to a given item, and their ful"
  },
  {
    "path": "exercises/practice/allergies/.meta/config.json",
    "chars": 802,
    "preview": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \""
  },
  {
    "path": "exercises/practice/allergies/.meta/proof.ci.ts",
    "chars": 905,
    "preview": "export class Allergies {\n  private allergenIndex: number\n\n  private possibleAllergies = [\n    'eggs',\n    'peanuts',\n   "
  },
  {
    "path": "exercises/practice/allergies/.meta/tests.toml",
    "chars": 6117,
    "preview": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description`"
  },
  {
    "path": "exercises/practice/allergies/.vscode/extensions.json",
    "chars": 118,
    "preview": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/allergies/.vscode/settings.json",
    "chars": 106,
    "preview": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/allergies/.yarnrc.yml",
    "chars": 49,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/allergies/allergies.test.ts",
    "chars": 2913,
    "preview": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Allergies } from './allergies.ts'\n\ndescribe('allergic"
  },
  {
    "path": "exercises/practice/allergies/allergies.ts",
    "chars": 359,
    "preview": "export class Allergies {\n  constructor(allergenIndex: unknown) {\n    throw new Error('Remove this line and implement the"
  },
  {
    "path": "exercises/practice/allergies/babel.config.cjs",
    "chars": 185,
    "preview": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/b"
  },
  {
    "path": "exercises/practice/allergies/eslint.config.mjs",
    "chars": 596,
    "preview": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport ma"
  },
  {
    "path": "exercises/practice/allergies/jest.config.cjs",
    "chars": 465,
    "preview": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**"
  },
  {
    "path": "exercises/practice/allergies/package.json",
    "chars": 1144,
    "preview": "{\n  \"name\": \"@exercism/typescript-allergies\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\""
  },
  {
    "path": "exercises/practice/allergies/test-runner.mjs",
    "chars": 3042,
    "preview": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exerci"
  },
  {
    "path": "exercises/practice/allergies/tsconfig.json",
    "chars": 1351,
    "preview": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the ne"
  },
  {
    "path": "exercises/practice/alphametics/.docs/instructions.md",
    "chars": 659,
    "preview": "# Instructions\n\nGiven an alphametics puzzle, find the correct solution.\n\n[Alphametics][alphametics] is a puzzle where le"
  },
  {
    "path": "exercises/practice/alphametics/.meta/config.json",
    "chars": 584,
    "preview": "{\n  \"authors\": [\n    \"W0lfw00d\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \"sol"
  },
  {
    "path": "exercises/practice/alphametics/.meta/proof.ci.ts",
    "chars": 3011,
    "preview": "export function solve(puzzle: string): undefined | { [key: string]: number } {\n  const parts: string[] = puzzle\n    .spl"
  },
  {
    "path": "exercises/practice/alphametics/.meta/tests.toml",
    "chars": 1067,
    "preview": "# This is an auto-generated file. Regular comments will be removed when this\n# file is regenerated. Regenerating will no"
  },
  {
    "path": "exercises/practice/alphametics/.vscode/extensions.json",
    "chars": 118,
    "preview": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/.vscode/settings.json",
    "chars": 106,
    "preview": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/.yarnrc.yml",
    "chars": 49,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/alphametics/alphametics.test.ts",
    "chars": 1884,
    "preview": "import { describe, it, expect, xit } from '@jest/globals'\nimport { solve } from './alphametics.ts'\n\ndescribe('Solve the "
  },
  {
    "path": "exercises/practice/alphametics/alphametics.ts",
    "chars": 117,
    "preview": "export function solve(puzzle: unknown): unknown {\n  throw new Error('Remove this line and implement the function')\n}\n"
  },
  {
    "path": "exercises/practice/alphametics/babel.config.cjs",
    "chars": 185,
    "preview": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/b"
  },
  {
    "path": "exercises/practice/alphametics/eslint.config.mjs",
    "chars": 596,
    "preview": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport ma"
  },
  {
    "path": "exercises/practice/alphametics/jest.config.cjs",
    "chars": 465,
    "preview": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**"
  },
  {
    "path": "exercises/practice/alphametics/package.json",
    "chars": 1146,
    "preview": "{\n  \"name\": \"@exercism/typescript-alphametics\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript"
  },
  {
    "path": "exercises/practice/alphametics/test-runner.mjs",
    "chars": 3042,
    "preview": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exerci"
  },
  {
    "path": "exercises/practice/alphametics/tsconfig.json",
    "chars": 1351,
    "preview": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the ne"
  },
  {
    "path": "exercises/practice/anagram/.docs/instructions.append.md",
    "chars": 66,
    "preview": "# Instructions Append\n\nThe anagrams can be returned in any order.\n"
  },
  {
    "path": "exercises/practice/anagram/.docs/instructions.md",
    "chars": 888,
    "preview": "# Instructions\n\nGiven a target word and one or more candidate words, your task is to find the candidates that are anagra"
  },
  {
    "path": "exercises/practice/anagram/.docs/introduction.md",
    "chars": 782,
    "preview": "# Introduction\n\nAt a garage sale, you find a lovely vintage typewriter at a bargain price!\nExcitedly, you rush home, ins"
  },
  {
    "path": "exercises/practice/anagram/.meta/config.json",
    "chars": 744,
    "preview": "{\n  \"authors\": [\n    \"masters3d\"\n  ],\n  \"contributors\": [\n    \"CRivasGomez\",\n    \"fredrb\",\n    \"lukaszklis\",\n    \"Sleepl"
  },
  {
    "path": "exercises/practice/anagram/.meta/proof.ci.ts",
    "chars": 528,
    "preview": "function sort(input: string): string {\n  return input.toString().toLowerCase().split('').sort().join('')\n}\n\nexport class"
  },
  {
    "path": "exercises/practice/anagram/.meta/tests.toml",
    "chars": 3066,
    "preview": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description`"
  },
  {
    "path": "exercises/practice/anagram/.vscode/extensions.json",
    "chars": 118,
    "preview": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/anagram/.vscode/settings.json",
    "chars": 106,
    "preview": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/anagram/.yarnrc.yml",
    "chars": 49,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/anagram/anagram.test.ts",
    "chars": 5776,
    "preview": "import { describe, it, expect, xit } from '@jest/globals'\nimport { Anagram } from './anagram.ts'\n\nconst areSetsEqual = <"
  },
  {
    "path": "exercises/practice/anagram/anagram.ts",
    "chars": 254,
    "preview": "export class Anagram {\n  constructor(input: unknown) {\n    throw new Error('Remove this line and implement the function'"
  },
  {
    "path": "exercises/practice/anagram/babel.config.cjs",
    "chars": 185,
    "preview": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/b"
  },
  {
    "path": "exercises/practice/anagram/eslint.config.mjs",
    "chars": 596,
    "preview": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport ma"
  },
  {
    "path": "exercises/practice/anagram/jest.config.cjs",
    "chars": 465,
    "preview": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**"
  },
  {
    "path": "exercises/practice/anagram/package.json",
    "chars": 1142,
    "preview": "{\n  \"name\": \"@exercism/typescript-anagram\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Typescript.\",\n"
  },
  {
    "path": "exercises/practice/anagram/test-runner.mjs",
    "chars": 3042,
    "preview": "#!/usr/bin/env node\n\n/**\n * 👋🏽 Hello there reader,\n *\n * It looks like you are working on this solution using the Exerci"
  },
  {
    "path": "exercises/practice/anagram/tsconfig.json",
    "chars": 1351,
    "preview": "{\n  \"display\": \"Configuration for Exercism TypeScript Exercises\",\n  \"compilerOptions\": {\n    // Allows you to use the ne"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.docs/instructions.md",
    "chars": 599,
    "preview": "# Instructions\n\nAn [Armstrong number][armstrong-number] is a number that is the sum of its own digits each raised to the"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.meta/config.json",
    "chars": 683,
    "preview": "{\n  \"authors\": [\n    \"CRivasGomez\"\n  ],\n  \"contributors\": [\n    \"masters3d\",\n    \"SleeplessByte\"\n  ],\n  \"files\": {\n    \""
  },
  {
    "path": "exercises/practice/armstrong-numbers/.meta/proof.ci.ts",
    "chars": 312,
    "preview": "export function isArmstrongNumber(input: number | bigint): boolean {\n  const digits = String(input).split('')\n  const su"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.meta/tests.toml",
    "chars": 1601,
    "preview": "# This is an auto-generated file.\n#\n# Regenerating this file via `configlet sync` will:\n# - Recreate every `description`"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.vscode/extensions.json",
    "chars": 118,
    "preview": "{\n  \"recommendations\": [\n    \"arcanis.vscode-zipfs\",\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\"\n  ]\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.vscode/settings.json",
    "chars": 106,
    "preview": "{\n  \"cSpell.words\": [\"exercism\"],\n  \"search.exclude\": {\n    \"**/.yarn\": true,\n    \"**/.pnp.*\": true\n  }\n}\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/.yarnrc.yml",
    "chars": 49,
    "preview": "compressionLevel: mixed\n\nenableGlobalCache: true\n"
  },
  {
    "path": "exercises/practice/armstrong-numbers/armstrong-numbers.test.ts",
    "chars": 1435,
    "preview": "import { describe, it, expect, xit } from '@jest/globals'\nimport { isArmstrongNumber } from './armstrong-numbers.ts'\n\nde"
  },
  {
    "path": "exercises/practice/armstrong-numbers/armstrong-numbers.ts",
    "chars": 129,
    "preview": "export function isArmstrongNumber(number: unknown): unknown {\n  throw new Error('Remove this line and implement the func"
  },
  {
    "path": "exercises/practice/armstrong-numbers/babel.config.cjs",
    "chars": 185,
    "preview": "module.exports = {\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  presets: [[require('@exercism/b"
  },
  {
    "path": "exercises/practice/armstrong-numbers/eslint.config.mjs",
    "chars": 596,
    "preview": "// @ts-check\n\nimport tsEslint from 'typescript-eslint'\nimport config from '@exercism/eslint-config-typescript'\nimport ma"
  },
  {
    "path": "exercises/practice/armstrong-numbers/jest.config.cjs",
    "chars": 465,
    "preview": "module.exports = {\n  verbose: true,\n  projects: ['<rootDir>'],\n  testMatch: [\n    '**/__tests__/**/*.[jt]s?(x)',\n    '**"
  },
  {
    "path": "exercises/practice/armstrong-numbers/package.json",
    "chars": 1152,
    "preview": "{\n  \"name\": \"@exercism/typescript-armstrong-numbers\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Exercism exercises in Type"
  }
]

// ... and 1603 more files (download for full content)

About this extraction

This page contains the full source code of the exercism/typescript GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1803 files (4.0 MB), approximately 1.2M tokens, and a symbol index with 4744 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!