diff --git a/web-ide-main/.github/ISSUE_TEMPLATE/bug.yaml b/web-ide-main/.github/ISSUE_TEMPLATE/bug.yaml new file mode 100644 index 0000000..40bfee3 --- /dev/null +++ b/web-ide-main/.github/ISSUE_TEMPLATE/bug.yaml @@ -0,0 +1,69 @@ +name: Bug Report +description: File a bug report +type: "Bug" +body: + - type: markdown + attributes: + value: | + Thank you for taking the time to fill out a bug report on the NAND2Tetris Web IDE or VSCode Extension + - type: dropdown + id: program + attributes: + label: Tool + description: Select the tool about which you wish to report the bug / issue + options: + - Hardware Simulator + - CPU Emulator + - Assembler + - VM Emulator + - Jack Compiler + - General + - type: dropdown + id: interface + attributes: + label: Interface + description: Which NAND2Tetris interface were you using? + options: + - Website (https://nand2tetris.github.io/web-ide) + - VSCode Extension (coming soon, or manually installed) + - type: input + id: contact + attributes: + label: Contact Details + description: How can we get in touch with you if we need more info? + placeholder: ex. email@example.com + validations: + required: false + - type: textarea + id: what-happened + attributes: + label: What happened? + description: Also tell us, what did you expect to happen? + placeholder: Tell us what you see! + value: "A bug happened!" + validations: + required: true + - type: textarea + id: additional-comments + attributes: + label: Additional Comments + description: What else, if anything, would you like to share with us? + placeholder: "Tell us anything!" + validations: + required: false + - type: checkboxes + id: self-fix + attributes: + label: Do you want to try to fix this bug? + description: The IDE is written in TypeScript, and includes React components. Do you want to try to fix the bug yourself (optional question)? If so, you can fork the repo, try to make the fix, and submit a PR. + options: + - label: I want to try to add this feature! + required: false + - type: checkboxes + id: terms + attributes: + label: Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/nand2tetris/web-ide/blob/main/CODE_OF_CONDUCT.md) + options: + - label: I agree to follow this project's Code of Conduct + required: true diff --git a/web-ide-main/.github/ISSUE_TEMPLATE/feature.yaml b/web-ide-main/.github/ISSUE_TEMPLATE/feature.yaml new file mode 100644 index 0000000..4001d69 --- /dev/null +++ b/web-ide-main/.github/ISSUE_TEMPLATE/feature.yaml @@ -0,0 +1,69 @@ +name: Feature Request +description: Request to add or improve a feature +type: "Feature" +body: + - type: markdown + attributes: + value: | + Thank you for taking the time to fill out a feature request on the NAND2Tetris Web IDE or VSCode Extension + - type: dropdown + id: program + attributes: + label: Tool + description: Select the tool for which you wish suggest a feature + options: + - Hardware Simulator + - CPU Emulator + - Assembler + - VM Emulator + - Jack Compiler + - General + - type: dropdown + id: interface + attributes: + label: Interface + description: Which NAND2Tetris interface were you using? + options: + - Website (https://nand2tetris.github.io/web-ide) + - VSCode Extension (coming soon, or manually installed) + - type: input + id: contact + attributes: + label: Contact Details + description: How can we get in touch with you if we need more info? + placeholder: ex. email@example.com + validations: + required: false + - type: textarea + id: what-happened + attributes: + label: What feature are you proposing? + description: Let us know + placeholder: Tell us what you see! + value: "Feature description" + validations: + required: true + - type: textarea + id: additional-comments + attributes: + label: Additional Comments + description: What else, if anything, would you like to share with us? + placeholder: Tell us anything! + validations: + required: false + - type: checkboxes + id: self-fix + attributes: + label: Do you want to try to add this feature? + description: The IDE is written in TypeScript, and includes React components. Do you want to try to implement this feature yourself? If so, you can fork the repo, try to make the fix, and submit a PR. + options: + - label: I want to try to add this feature! + required: false + - type: checkboxes + id: terms + attributes: + label: Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/nand2tetris/web-ide/blob/main/CODE_OF_CONDUCT.md) + options: + - label: I agree to follow this project's Code of Conduct + required: true diff --git a/web-ide-main/.github/workflows/deploy.yaml b/web-ide-main/.github/workflows/deploy.yaml new file mode 100644 index 0000000..b03a095 --- /dev/null +++ b/web-ide-main/.github/workflows/deploy.yaml @@ -0,0 +1,51 @@ +name: Deploy to gh-pages + +on: + workflow_dispatch: + push: + branches: [main] + paths: + - simulator + - web + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js 20 + uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Cache node modules + id: cache-npm + uses: actions/cache@v3 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ hashFiles('**/package-lock.json') }} + + - name: Install + run: npm install + + - name: CD + run: | + git config --global user.name $user_name + git config --global user.email $user_email + git remote set-url origin https://${github_token}@github.com/${repository} + ./stamp.sh + npm run build + npm run -w web deploy + VERSION=$(grep version package.json | awk -F\" '{print $4}') + git tag "$VERSION" main + git push origin "$VERSION" + git push origin main + env: + user_name: "github-actions[bot]" + user_email: "github-actions[bot]@users.noreply.github.com" + github_token: ${{ secrets.ACTIONS_DEPLOY_ACCESS_TOKEN }} + repository: ${{ github.repository }} diff --git a/web-ide-main/.github/workflows/extension.yaml b/web-ide-main/.github/workflows/extension.yaml new file mode 100644 index 0000000..4f8e022 --- /dev/null +++ b/web-ide-main/.github/workflows/extension.yaml @@ -0,0 +1,45 @@ +name: Build vscode extension + +on: + workflow_dispatch: + push: + branches: [main] + paths: + - simulator + - extension + +jobs: + package: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js 20 + uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Cache node modules + id: cache-npm + uses: actions/cache@v3 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ hashFiles('**/package-lock.json') }} + + - name: Install + run: npm install + + - name: CD + run: | + npm run build + npm run -w extension package + + - name: Upload extension + uses: actions/upload-artifact@v3 + with: + name: nand2tetris-vscode + path: | + extension/nand2tetris-vscode-*.vsix diff --git a/web-ide-main/.github/workflows/test.yaml b/web-ide-main/.github/workflows/test.yaml new file mode 100644 index 0000000..a35b08f --- /dev/null +++ b/web-ide-main/.github/workflows/test.yaml @@ -0,0 +1,40 @@ +name: Run Workspace Tests + +on: + pull_request: + branches: ["main", "release/**"] + +jobs: + all: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Use Node.js 20 + uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Cache node modules + id: cache-npm + uses: actions/cache@v3 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ hashFiles('**/package-lock.json') }} + + - if: ${{ steps.cache-npm.outputs.cache-hit == 'false' }} + name: List the state of node modules + continue-on-error: true + run: npm list + + - name: Install + run: npm install + + - name: CI + run: npm run ci + env: + CI: true diff --git a/web-ide-main/.gitignore b/web-ide-main/.gitignore new file mode 100644 index 0000000..0bf2afc --- /dev/null +++ b/web-ide-main/.gitignore @@ -0,0 +1,26 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +node_modules +.pnp +.pnp.js + +# testing +coverage + +# production +build +dist +out +*.tsbuildinfo + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/web-ide-main/.npmrc b/web-ide-main/.npmrc new file mode 100644 index 0000000..f474e5c --- /dev/null +++ b/web-ide-main/.npmrc @@ -0,0 +1,3 @@ +# instruct npm to fail if the versions specified in the "engines" +# section of package.json are not satisfied +engine-strict=true diff --git a/web-ide-main/.prettierconfig.yaml b/web-ide-main/.prettierconfig.yaml new file mode 100644 index 0000000..2558f69 --- /dev/null +++ b/web-ide-main/.prettierconfig.yaml @@ -0,0 +1,24 @@ +arrowParens: "always" # default +bracketSameLine: false # default +bracketSpacing: true # default +embeddedLanguageFormatting: "auto" # default +endOfLine: "auto" # default is "lf" +filepath: "" # default +htmlWhitespaceSensitivity: "css" # default +insertPragma: false # default +# jsxBracketSameLine: false # deprecated +jsxSingleQuote: false # default +parser: "" # default +printWidth: 80 # default +proseWrap: "preserve" # default +quoteProps: "as-needed" # default +# rangeEnd: Infinity # default; "Infinity" can't be read as int +rangeStart: 0 # default +requirePragma: false # default +semi: true # default +singleAttributePerLine: false # default +singleQuote: false # default +tabWidth: 2 # default +trailingComma: "all" # default is "es5" +useTabs: false # default +vueIndentScriptAndStyle: false # default diff --git a/web-ide-main/.prettierignore b/web-ide-main/.prettierignore new file mode 100644 index 0000000..dc3086b --- /dev/null +++ b/web-ide-main/.prettierignore @@ -0,0 +1,3 @@ +projects/src/samples/project_06/04_pong_asm.ts +web/public/pico.min.css +web/src/locales \ No newline at end of file diff --git a/web-ide-main/.vscode/launch.json b/web-ide-main/.vscode/launch.json new file mode 100644 index 0000000..6b93aff --- /dev/null +++ b/web-ide-main/.vscode/launch.json @@ -0,0 +1,39 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug Computron Tests", + "type": "node", + "request": "launch", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/react-scripts", + "args": ["test", "--runInBand", "--no-cache", "--env=jsdom", "${file}"], + "env": { "CI": "true" }, + "cwd": "${workspaceFolder}/simulator", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--disable-extensions", + "--extensionDevelopmentPath=${workspaceFolder}/extension" + ], + "outFiles": ["${workspaceFolder}/extension/build/**/*.js"] + // "preLaunchTask": "${defaultBuildTask}" + }, + { + "name": "Extension Tests", + "type": "extensionHost", + "request": "launch", + "args": [ + "--disable-extensions", + "--extensionDevelopmentPath=${workspaceFolder}/extension", + "--extensionTestsPath=${workspaceFolder}/extension/build/test/suite/index" + ], + "outFiles": ["${workspaceFolder}/extension/build/test/**/*.js"], + "preLaunchTask": "${defaultBuildTask}" + } + ] +} diff --git a/web-ide-main/CODE_OF_CONDUCT.md b/web-ide-main/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..86077f6 --- /dev/null +++ b/web-ide-main/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at davidsouther@gmail.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/web-ide-main/CONTRIBUTING.md b/web-ide-main/CONTRIBUTING.md new file mode 100644 index 0000000..503ab5a --- /dev/null +++ b/web-ide-main/CONTRIBUTING.md @@ -0,0 +1,24 @@ +# Computron 5k Contributions + +- [Deployed Online](https://nand2tetris.github.io/web-ide) +- [Source](https://github.com/nand2tetris/web-ide) +- [Issues](https://github.com/nand2tetris/web-ide/issues) + +## Dependencies and Environment + +The Nand2Tetris Web IDE is developed in the TypeScript programming language and run on the NodeJS platform. Running the IDE and tests locally requires having `node`, `npm`, and `npx`. We recommend installing all three, as well as keeping them updated, by using the [`nvm` tool](https://github.com/nvm-sh/nvm). + +``` +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash +``` + +The source code is version controlled using `git`, which should be installed using the recommended way depending on your operating system. Issues, pull requests, and other project management is conducted on [GitHub](https://github.com/nand2tetris/web-ide). When developing to contribute a feature, we recommend creating a fork, cloning from your fork, creating a new branch with `git switch -c`, pushing that branch to your fork, and creating a pull request from that branch to main. See documentation on GitHub and the internet for more details. + +After cloning the repository, to install all dependencies, `cd` to the downloaded folder and run `npm install`. To update the compiled TypeScript libraries after making any changes in `simulator`, `projects`, or `components`, run `npm run build`. Alternatively, to only build one of those three, run `npm run build -w `. To run all tests, run `npm test`; for tests in just one part of the project, `npm test -w `. After building the libraries, you can run the web IDE with `npm run web`. This will begin the development server on https://localhost:8080. + +## Issues & Pull Requests + +- Send pull requests to the `main` branch. +- Please use the `bug` and `enhancement` tags when creating general issues. +- Issues tagged `good first issue` are expected to be small, focused changes to contained parts of the codebase. +- Many parts of Hack are not yet implemented. If the feature is part of the core hack book, add the issue to the `Book Parity` milestone and either the `HDL`, `CPU`, or `VM` project as appropriate. diff --git a/web-ide-main/LICENSE b/web-ide-main/LICENSE new file mode 100644 index 0000000..d3a73b1 --- /dev/null +++ b/web-ide-main/LICENSE @@ -0,0 +1,12 @@ +MIT License + +Copyright 2022 David Souther et al + +This software is based on Stefano Volpe's 'Nand2Tetris Tools'. Please check [here](https://github.com/foxyseta/nand-ide/blob/master/LICENSE) for further information. +This software is based on Aviv Yaish's 'NAND IDE'. Please check [here](https://github.com/AvivYaish/nand-ide/blob/master/LICENSE) for further information. + +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. diff --git a/web-ide-main/README.md b/web-ide-main/README.md new file mode 100644 index 0000000..e42ceba --- /dev/null +++ b/web-ide-main/README.md @@ -0,0 +1,125 @@ +# Nand2Tetris Software Suite + +A Javascript reimplementation of the software suite described in www.nand2tetris.org and in "The Elements of Computing Systems" by Nisan and Schocken, MIT Press (2nd edition, 2021). The repo also includes the project files described in the website and in the book. + +The goal is to allow students complete the projects using modern, web-based tools, without having to download code to their computers. + +Users can work with the tools via a web IDE, or via a VS Code extension. Both are described below. + +## User Guide + +The user guides for the web IDE are available [here](https://drive.google.com/drive/folders/10hDzWql94MTPIStI3KEx--JYpHTBoeE6) and can also be accessed by clicking "Guide" at the top right of the [published project](https://nand2tetris.github.io/web-ide). + +The user guide for the extension is coming. + +The parts of the user guide that describe the UI may be out of sync with the code since we keep experimenting with differtent UI's. + +### CLI + +Install the CLI tool: + + npm install + npm run build && npm i -g ./cli + +Run the CLI: + + cd nand2tetris/project/01 + nand2tetris grade + nand2tetris run DMux4Way.tst + +Run the CLI with a nand2tetris Java install: + + cd nand2tetris/project/01 + nand2tetris grade --java_ide=${HOME}/nand2tetris + +### Web IDE + +Build the web IDE: + + npm install + npm run build && npm run start + +It will print the URL to the console. Any changes will automatically trigger a rebuild. + +## Architecture + +NAND2Tetris kit is a monorepo with several projects. +`simulator` is the core NAND2Tetris code. +`projects` has copies of project base and test files. +`runner` is a utility to execute chips against a Java ide install, looking for nand2tetris.jar in $NAND2TETRIS_PATH. +`components` are reusable React UI pieces suitable for both web and extension. +`web` is a standalone web IDE. +`extension` is a VSCode extension with editor support. +`cli` is a command line NodeJS program (runnable with `npx`) to grade one or more project folders. + +### Simulator + +Simulator has code to handle running the various emulators, regardless of interface or runtime. +Simulator objects are also independant of language, and serve equally well to running tests as to binding to the DOM or printing to a CLI. +`chip`, `cpu`, and `vm` cover the primary hack languages, with `compare`, `output`, and `tst` handling the common project tooling. + +#### Languages + +Languages are parsed using [Ohm](https://ohmjs.org/), a parser combinator library. +Ohm works well for simple cases, but does not handle error recovery well. +Replacing or augmenting this to handle a number of errors, rather than only the first, is a possible future improvement. + +### Web + +NAND2Tetris Web IDE is a stand-alone single-page app with separate sections for Hack Hardware, CPU, and VM emulators. +It has a unified file system using browser local storage to save users' solutions to project work. +Emulators share simulator code, especially to handle executing tests as well as converting between Javascript 64-bit floating point numbers and Hack 16-bit integers. + +The interface code is in the `pages` and `components` folders. +Generally, a page creates a simulator at the top, some dynamic components in the middle, and a layout of HTML at the bottom. +Pages should use semantic blocks as much as possible, with special attention on using `
` as a "Card". + +#### React + +The user interface is written in React, using functional components and vanilla hooks as much as possible. +Pages are routable things, usually with a store connecting it to the appropriate simulation. +Components are reusable pieces of UI, which take props to update their interface. + +#### RXJS + +Asynchronous one-off behavior in the project can be handled with promises & async/await syntax. +For evented asynchronous behavior, use RXJS observables and subscriptions. + +#### Pico + +Jiffies extends [`PicoCSS`](https://picocss.com), allowing rapid iteration on custom components. +Some ideas have been moved upstream to Pico. +Specific components in the forked Pico include [`inline-buttons`](https://github.com/picocss/pico/issues/182) and a [`property sheet`](https://github.com/picocss/pico/issues/195). + +### Extension + +A VSCode extension with language definitions and editor support. + +- `npm run -w extension package` builds the extension & related views into a stand-along `.vsix` file. +- `Run Extension` launch configuration starts a new VSCode extension host to debug the extension. + +#### Languages + +Language support for `.hdl` & `.tst` uses the language libraries in `simulator`. +Syntax errors are highlighted, with in-editor error diagnostics on the failing token. +Syntax highlighting rules activate for `HDL`, `TST`, `CMP`, `OUT`, `ASM`, `VM`, and `Jack` files. +Snippets are available for `HDL`, `ASM`, `VM`, `Jack`, and `TST` files. + +#### Views + +The extension adds an activity bar container, `NAND2Tetris`. +`NAND2TETRIS: HDL CHIP` opens in the container, and shows a chip panel when the user has opened an HDL file. +The panel attempts to update whenever changing HDL files, or when saving the file. +It does not update if the new HDL does not parse. + +### Jiffies + +Jiffies contains a few utility functions & types. + +- `Result` and `Option` encapsulate "Ok/Err" and "Some/None" variant types. +- `assert`, `assertExists`, and `checkExhaustive` provide strongly-typed, portable assertions. +- `fs`, a thin wrapper around LocalStorage and similar `Record` objects allowing Filesystem like access. + +## Code of Conduct + +This project is governed by its [Code of Conduct](./CODE_OF_CONDUCT.md). diff --git a/web-ide-main/biome.json b/web-ide-main/biome.json new file mode 100644 index 0000000..79ad499 --- /dev/null +++ b/web-ide-main/biome.json @@ -0,0 +1,138 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.1.4/schema.json", + "vcs": { "enabled": false, "clientKind": "git", "useIgnoreFile": false }, + "files": { "ignoreUnknown": false, "includes": ["**/src/**/*.ts"] }, + "formatter": { "enabled": true, "indentStyle": "space" }, + "linter": { + "enabled": true, + "rules": { + "recommended": false, + "complexity": { + "noAdjacentSpacesInRegex": "error", + "noBannedTypes": "error", + "noExtraBooleanCast": "error", + "noUselessCatch": "error", + "noUselessEscapeInRegex": "error", + "noUselessTypeConstraint": "error" + }, + "correctness": { + "noChildrenProp": "error", + "noConstAssign": "error", + "noConstantCondition": "error", + "noEmptyCharacterClassInRegex": "error", + "noEmptyPattern": "error", + "noGlobalObjectCalls": "error", + "noInnerDeclarations": "error", + "noInvalidConstructorSuper": "error", + "noNonoctalDecimalEscape": "error", + "noPrecisionLoss": "error", + "noSelfAssign": "error", + "noSetterReturn": "error", + "noSwitchDeclarations": "error", + "noUndeclaredVariables": "error", + "noUnreachable": "error", + "noUnreachableSuper": "error", + "noUnsafeFinally": "error", + "noUnsafeOptionalChaining": "error", + "noUnusedLabels": "error", + "noUnusedVariables": "error", + "useIsNan": "error", + "useJsxKeyInIterable": "error", + "useValidForDirection": "error", + "useValidTypeof": "error", + "useYield": "error" + }, + "security": { "noDangerouslySetInnerHtmlWithChildren": "error" }, + "style": { + "noInferrableTypes": "error", + "noNamespace": "error", + "noNonNullAssertion": "warn", + "useArrayLiterals": "error", + "useAsConstAssertion": "error" + }, + "suspicious": { + "noAsyncPromiseExecutor": "error", + "noCatchAssign": "error", + "noClassAssign": "error", + "noCommentText": "error", + "noCompareNegZero": "error", + "noControlCharactersInRegex": "error", + "noDebugger": "error", + "noDuplicateCase": "error", + "noDuplicateClassMembers": "error", + "noDuplicateElseIf": "error", + "noDuplicateJsxProps": "error", + "noDuplicateObjectKeys": "error", + "noDuplicateParameters": "error", + "noEmptyBlockStatements": "error", + "noExplicitAny": "warn", + "noExtraNonNullAssertion": "error", + "noFallthroughSwitchClause": "error", + "noFunctionAssign": "error", + "noGlobalAssign": "error", + "noImportAssign": "error", + "noIrregularWhitespace": "error", + "noMisleadingCharacterClass": "error", + "noMisleadingInstantiator": "error", + "noPrototypeBuiltins": "error", + "noRedeclare": "error", + "noShadowRestrictedNames": "error", + "noSparseArray": "error", + "noUnsafeNegation": "error", + "noWith": "error", + "useAdjacentOverloadSignatures": "error", + "useGetterReturn": "error", + "useNamespaceKeyword": "error" + } + } + }, + "javascript": { + "formatter": { "quoteStyle": "double" }, + "globals": [ + "expect", + "it", + "describe", + "beforeEach", + "afterEach", + "test", + "jest", + "acquireVsCodeApi" + ] + }, + "overrides": [ + { + "includes": ["*.ts", "*.tsx", "*.mts", "*.cts"], + "linter": { + "rules": { + "complexity": { "noArguments": "error" }, + "correctness": { + "noConstAssign": "off", + "noGlobalObjectCalls": "off", + "noInvalidConstructorSuper": "off", + "noSetterReturn": "off", + "noUndeclaredVariables": "off", + "noUnreachable": "off", + "noUnreachableSuper": "off", + "useValidTypeof": "off" + }, + "style": { "useConst": "error" }, + "suspicious": { + "noDuplicateClassMembers": "off", + "noDuplicateObjectKeys": "off", + "noDuplicateParameters": "off", + "noFunctionAssign": "off", + "noImportAssign": "off", + "noRedeclare": "off", + "noUnsafeNegation": "off", + "noVar": "error", + "useGetterReturn": "off" + } + } + } + } + ], + "assist": { + "enabled": true, + "actions": { "source": { "organizeImports": "on" } } + } +} diff --git a/web-ide-main/cli/package.json b/web-ide-main/cli/package.json new file mode 100644 index 0000000..b9e8c40 --- /dev/null +++ b/web-ide-main/cli/package.json @@ -0,0 +1,33 @@ +{ + "name": "@nand2tetris/cli", + "description": "NAND2Tetris Command Line tools", + "repository": { + "type": "git", + "url": "git+https://github.com/nand2tetris/web-ide.git" + }, + "author": "David Souther ", + "license": "ISC", + "bugs": { + "url": "https://github.com/nand2tetris/web-ide/issues" + }, + "homepage": "https://github.com/nand2tetris/web-ide", + "main": "dist/index.js", + "type": "module", + "bin": { + "nand2tetris": "dist/index.js" + }, + "scripts": { + "build": "tsc", + "test": "jest" + }, + "devDependencies": { + "@davidsouther/jiffies": "^2.2.5", + "@nand2tetris/runner": "file:../runner", + "@nand2tetris/simulator": "file:../simulator" + }, + "dependencies": { + "@types/node": "^20.14.2", + "@types/yargs": "^17.0.32", + "yargs": "^17.7.2" + } +} \ No newline at end of file diff --git a/web-ide-main/cli/src/grading.ts b/web-ide-main/cli/src/grading.ts new file mode 100644 index 0000000..6220aae --- /dev/null +++ b/web-ide-main/cli/src/grading.ts @@ -0,0 +1,79 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { NodeFileSystemAdapter } from "@davidsouther/jiffies/lib/esm/fs_node.js"; +import type { Assignment } from "@nand2tetris/projects/base.js"; +import { Assignments } from "@nand2tetris/projects/full.js"; +import { JavaRunner } from "@nand2tetris/runner/index.js"; +import { + AssignmentFiles, + hasTest, + runTests, +} from "@nand2tetris/simulator/projects/runner.js"; +import { join, parse } from "path"; + +/** + * Given a FileSystem wrapper, curry a function that loads the necessary files for running an HDL test. + * For grading, tests come from the built-in assignment master test list. + */ +const loadAssignment = (fs: FileSystem) => + async function (file: Assignment): Promise { + const hdl = await fs.readFile(file.base); + const tst = Assignments[ + `${file.name}.tst` as keyof typeof Assignments + ] as string; + const cmp = Assignments[ + `${file.name}.cmp` as keyof typeof Assignments + ] as string; + return { ...file, hdl, tst, cmp }; + }; + +/** + * Run the grader using a NodeJS file system. + * + * Report results using a simple `{Name} passed/failed`, and if given a java_id, the same for shadow mode results. + * + * Returns 1 if at least one test was failed or no tests were found to run. Returns 0 otherwise. + */ +export async function main(folder = process.cwd(), java_ide = "") { + const fs = new FileSystem(new NodeFileSystemAdapter()); + fs.cd(folder); + + const directory = [...(await fs.readdir("."))]; + const runFiles = directory.filter((file) => file.endsWith(".hdl")); + + const files = runFiles + .map((f) => join(folder, f)) + .map(parse) + .filter(hasTest); + + const ideRunner = await JavaRunner.try_init(java_ide); + const tests = await runTests(files, loadAssignment(fs), fs, ideRunner); + + if (!tests.length) { + console.log("No tests have run!"); + return 1; + } + let failsCount = 0; + for (const test of tests) { + if (!test.pass) { + failsCount++; + } + console.log( + `Test ${test.name}: ${test.pass ? `Passed` : `Failed (${test.out})`}`, + ); + if (test.shadow) { + if (test.shadow.code !== 0) { + failsCount++; + } + console.log( + `\tShadow: ${ + test.shadow.code === 0 + ? `Passed` + : `Errored (${test.shadow.stderr.trim()})` + }`, + ); + } else { + console.log("\tNo shadow"); + } + } + return failsCount > 0 ? 1 : 0; +} diff --git a/web-ide-main/cli/src/index.ts b/web-ide-main/cli/src/index.ts new file mode 100644 index 0000000..2ff9e4c --- /dev/null +++ b/web-ide-main/cli/src/index.ts @@ -0,0 +1,173 @@ +#!/usr/bin/env node +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { NodeFileSystemAdapter } from "@davidsouther/jiffies/lib/esm/fs_node.js"; +import { compile } from "@nand2tetris/simulator/jack/compiler.js"; +import * as fsCore from "fs"; +import path, { dirname, parse, resolve } from "path"; +import yargs from "yargs"; +import { hideBin } from "yargs/helpers"; +import { main } from "./grading.js"; +import { testRunner } from "./testrunner.js"; + +yargs(hideBin(process.argv)) + .usage("$0 ") + .command( + "grade [directory]", + "Grade all NAND2Tetris projects in a directory tree.", + (yargs) => + yargs + .positional("directory", { + type: "string", + default: process.cwd(), + describe: "Path to a folder to grade for nand2tetris projects.", + }) + .option("java_ide", { + type: "string", + default: process.env.NAND2TETRIS_PATH, + describe: + "When set, look for the java IDE jars in this path and compare both runs.", + }), + async (argv) => { + console.log("grade", argv.directory, "nand2tetris grader!"); + const exitCodePromise = main(argv.directory, argv.java_ide); + const exitCode = await exitCodePromise; + if (exitCode) { + process.exit(exitCode); + } + }, + ) + .command( + "run ", + "Run a NAND2Tetris file. If the file is .tst, executes the test. If the file is .hdl, starts a terminal session for the chip. If the file is .asm, .hack, .vm, or .jack, loads (possibly after compilation) the file into memory and starts the machine execution.", + (yargs) => + yargs + .positional("file", { + type: "string", + describe: "Path to nand2tetris tst file to execute.", + }) + .option("debug", { + type: "boolean", + default: false, + describe: "Port for the debugger protocol to listen on.", + }) + .option("debug_port", { + type: "number", + default: 6163, + describe: "Port for the debugger protocol to listen on.", + }) + .option("java_ide", { + type: "string", + describe: + "When set, look for the java IDE jars in this path and compare both runs.", + }), + (argv) => { + console.log("nand2tetris command run", argv); + const { name, ext } = parse(argv.file ?? ""); + switch (ext) { + case "": + case ".tst": + console.log("tst"); + testRunner(dirname(resolve(argv.file ?? process.cwd())), name); + break; + case ".hdl": + console.log("hdl"); + break; + default: + console.log("unknown", ext); + break; + } + }, + ) + .command( + "compile [dst]", + "Compile .jack files inside a folder", + (yargs) => + yargs + .positional("src", { + type: "string", + describe: "Path to input folder with jack files", + }) + .option("dst", { + type: "string", + describe: "Path to destination folder", + default: "", + }) + .coerce(["src", "dst"], function (arg) { + return path.resolve(arg) + "/"; + }) + .check((argv, options) => { + const src = argv.src; + const dst = argv.dst; + if (src === undefined) { + throw Error("Please provide input folder path"); + } + + if (dst && !fsCore.lstatSync(dst).isDirectory()) { + throw Error(src + " is not a folder"); + } + if (!fsCore.lstatSync(src).isDirectory()) { + throw Error(src + " is not a folder"); + } + + return true; + }) + .showHelpOnFail(false, "Specify --help for available options"), + async (argv) => { + enum Colors { + Red = "\x1b[31m", + Green = "\x1b[32m", + Reset = "\u001b[0m", + } + const JACK_EXT = ".jack"; + const src = argv.src; + const dst = argv.dst ?? src; + if (src === undefined) { + throw Error("Please provde input folder path"); + } + + if (dst === undefined) { + throw Error("Please provde input folder path"); + } + const fs = new FileSystem(new NodeFileSystemAdapter()); + + const files = await fs.readdir(src); + const jackFiles = files.filter((file) => file.endsWith(JACK_EXT)); + if (jackFiles.length === 0) { + throw Error("No jack files inside a folder"); + } + const nameToContent = {} as Record; + for (const file of jackFiles) { + const filepath = path.join(src, file); + const content = await fs.readFile(filepath); + nameToContent[file.replace(JACK_EXT, "")] = content; + } + let error = false; + for (const [name, compiled] of Object.entries(compile(nameToContent))) { + if (typeof compiled === "string") { + const outputFilename = name + ".vm"; + const outpath = path.join(dst, outputFilename); + await fs.writeFile(outpath, compiled); + } else { + if (!error) { + console.error("Compilation failed\n"); + } + console.error( + Colors.Red + + compiled.message.replace( + /Line\s([\d]+):/g, + name + ".jack:$1" + Colors.Reset, + ), + ); + error = true; + } + } + if (error) { + process.exit(1); + } else { + console.log(Colors.Green + "Compiled files" + Colors.Reset); + } + }, + ) + .help() + .demandCommand(1) + .parse(); diff --git a/web-ide-main/cli/src/testrunner.ts b/web-ide-main/cli/src/testrunner.ts new file mode 100644 index 0000000..ae90566 --- /dev/null +++ b/web-ide-main/cli/src/testrunner.ts @@ -0,0 +1,41 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { NodeFileSystemAdapter } from "@davidsouther/jiffies/lib/esm/fs_node.js"; +import type { Assignment } from "@nand2tetris/projects/base.js"; +import { Assignments } from "@nand2tetris/projects/full.js"; +import { runner } from "@nand2tetris/simulator/projects/runner.js"; +import { parse } from "path"; + +/** + * Load an assignment from the local folder. + * Uses built in assignments when the local tests are missing. + */ +async function loadAssignment(fs: FileSystem, file: Assignment) { + const assignment = Assignments[file.name as keyof typeof Assignments]; + const hdl = await fs.readFile(`${file.name}.hdl`); + const tst = await fs + .readFile(`${file.name}.tst`) + .catch( + () => assignment[`${file.name}.tst` as keyof typeof assignment] as string, + ); + const cmp = await fs + .readFile(`${file.name}.cmp`) + .catch( + () => assignment[`${file.name}.cmp` as keyof typeof assignment] as string, + ); + + return { ...file, hdl, tst, cmp }; +} + +/** + * Run a nand2tetris.tst file. + */ +export async function testRunner(dir: string, file: string) { + const fs = new FileSystem(new NodeFileSystemAdapter()); + fs.cd(dir); + const assignment = await loadAssignment(fs, parse(file)); + const tryRun = runner(fs); + const run = await tryRun(assignment); + console.log(run); +} + +// export async function testDebugger(root: string, name: string, port: number) {} diff --git a/web-ide-main/cli/tsconfig.json b/web-ide-main/cli/tsconfig.json new file mode 100644 index 0000000..86a30ee --- /dev/null +++ b/web-ide-main/cli/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"] +} diff --git a/web-ide-main/components/package.json b/web-ide-main/components/package.json new file mode 100644 index 0000000..e0f7dd2 --- /dev/null +++ b/web-ide-main/components/package.json @@ -0,0 +1,61 @@ +{ + "name": "@nand2tetris/components", + "version": "0.0.0", + "private": true, + "description": "", + "author": "David Souther ", + "license": "ISC", + "homepage": "https://davidsouther.github.io/nand2tetris", + "type": "module", + "exports": { + "./*": "./build/*" + }, + "typesVersions": { + "*": { + "*": [ + "build/*" + ] + } + }, + "dependencies": { + "@vscode/webview-ui-toolkit": "^1.4.0" + }, + "devDependencies": { + "@davidsouther/jiffies": "^2.2.5", + "@monaco-editor/react": "^4.6.0", + "@nand2tetris/projects": "file:../projects", + "@nand2tetris/simulator": "file:../simulator", + "@testing-library/jest-dom": "^6.4.5", + "@testing-library/react": "^16.0.0", + "@types/error-cause": "^1.0.4", + "@types/jest": "^29.5.12", + "@types/node": "^20.14.2", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/vscode": "^1.89.0", + "@types/wicg-file-system-access": "^2023.10.5", + "immer": "^10.1.1", + "make-plural": "^7.4.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.23.1", + "react-scripts": "^5.0.1", + "rxjs": "^7.8.1", + "sass": "^1.77.4", + "source-map-explorer": "^2.5.3" + }, + "scripts": { + "build": "tsc", + "postbuild": "shx rm -rf build/public && shx cp -r src/public/ build/public/", + "test": "react-scripts test" + }, + "jest": { + "moduleNameMapper": { + "^@nand2tetris/([^/]+)/(.*)": "/../node_modules/@nand2tetris/$1/build/$2", + "(.*)\\.js$": "$1" + }, + "transformIgnorePatterns": [ + "node_modules/(?!@davidsouther)" + ] + } +} diff --git a/web-ide-main/components/src/chips/alu.tsx b/web-ide-main/components/src/chips/alu.tsx new file mode 100644 index 0000000..f9bb7b9 --- /dev/null +++ b/web-ide-main/components/src/chips/alu.tsx @@ -0,0 +1,103 @@ +import { + COMMANDS_ALU, + COMMANDS_OP, + Flags, +} from "@nand2tetris/simulator/cpu/alu.js"; + +export const ALUComponent = ({ + A, + op, + D, + out, + flag, +}: { + A: number; + op: COMMANDS_OP; + D: number; + out: number; + flag: keyof typeof Flags; +}) => ( +
+ ALU + + + + + + + + {A} + + + {D} + + + {out} + + + {COMMANDS_ALU.op[op] ?? "(??)"} + + + + + + + + + + + + + + + + + + +
+); diff --git a/web-ide-main/components/src/chips/keyboard.tsx b/web-ide-main/components/src/chips/keyboard.tsx new file mode 100644 index 0000000..cf1d915 --- /dev/null +++ b/web-ide-main/components/src/chips/keyboard.tsx @@ -0,0 +1,155 @@ +import { KeyboardAdapter } from "@nand2tetris/simulator/cpu/memory.js"; +import { useEffect, useRef, useState } from "react"; +import { RegisterComponent } from "./register.js"; + +const KeyMap: Record = { + // Delete: 127, + Enter: 128, + Backspace: 129, + ArrowLeft: 130, + ArrowUp: 131, + ArrowRight: 132, + ArrowDown: 133, + Home: 134, + End: 135, + PageUp: 136, + PageDown: 137, + Insert: 138, + Delete: 139, + Escape: 140, + F1: 141, + F2: 142, + F3: 143, + F4: 144, + F5: 145, + F6: 146, + F7: 147, + F8: 148, + F9: 149, + F10: 150, + F11: 151, + F12: 152, +}; + +const keyDisplays: Record = { + ArrowLeft: "L-arrow", + ArrowUp: "U-arrow", + ArrowRight: "R-arrow", + ArrowDown: "D-arrow", +}; + +function getKeyDisplay(key: string) { + return keyDisplays[key] ?? key; +} + +function keyPressToHackCharacter(keypress: KeyboardEvent): number { + const mapping = KeyMap[keypress.key]; + if (mapping !== undefined) { + return mapping; + } + if (keypress.key.length === 1) { + const code = keypress.key.charCodeAt(0); + if (code >= 32 && code <= 126) { + return code; + } + } + + return 0; +} + +export const Keyboard = ({ + keyboard, + update, +}: { + keyboard: KeyboardAdapter; + update?: () => void; +}) => { + const [enabled, setEnabled] = useState(false); + const [character, setCharacter] = useState(""); + const [bits, setBits] = useState(keyboard.getKey()); + let currentKey = 0; + + const toggleRef = useRef(null); + + const toggleEnabled = () => { + setEnabled(!enabled); + }; + + const onKeyDown = (event: KeyboardEvent) => { + if (!enabled) { + return; + } + + setCharacter(getKeyDisplay(event.key)); + toggleRef.current?.blur(); + const key = keyPressToHackCharacter(event); + if (key) { + event.preventDefault(); + } + if (key === currentKey) { + return; + } + setKey(key); + update?.(); + }; + + const onKeyUp = (event: KeyboardEvent) => { + toggleRef.current?.blur(); + if (!enabled) { + return; + } + + if (keyboard.getKey()) { + event.preventDefault(); + } + + currentKey = 0; + keyboard.clearKey(); + update?.(); + setBits(keyboard.getKey()); + setCharacter(""); + }; + + // note on setCharacter vs setKey: + // setCharacter sets the string value that will be displayed in the component, + // while setKey actually sets and tracks the value that will be stored in the keyboard memory + + const setKey = (key: number) => { + if (key === 0) { + return; + } + keyboard.setKey(key); + setBits(keyboard.getKey()); + currentKey = key; + }; + + useEffect(() => { + window.addEventListener("keydown", onKeyDown); + window.addEventListener("keyup", onKeyUp); + + return () => { + window.removeEventListener("keydown", onKeyDown); + window.removeEventListener("keyup", onKeyUp); + }; + }); + + return ( +
+
+ +
{/* padding */} +
Key: {character}
+
+ +
+
+
+ ); +}; diff --git a/web-ide-main/components/src/chips/memory.test.tsx b/web-ide-main/components/src/chips/memory.test.tsx new file mode 100644 index 0000000..5718c4f --- /dev/null +++ b/web-ide-main/components/src/chips/memory.test.tsx @@ -0,0 +1,38 @@ +import { Memory as MemoryChip } from "@nand2tetris/simulator/cpu/memory.js"; +import { range } from "@davidsouther/jiffies/lib/esm/range.js"; +import { render, screen } from "@testing-library/react"; +import { MemoryBlock, MemoryCell } from "./memory.js"; + +describe("", () => { + describe("", () => { + it("renders a read-only cell", () => { + render(); + + const addr = screen.getByText("16"); + expect(addr).toBeVisible(); + + const cell = screen.getByText("34"); + expect(cell).toBeVisible(); + }); + }); + + describe("", () => { + it.skip("renders a small amount of memory", () => { + const memory = new MemoryChip( + new Int16Array( + range(0, 16).map((i) => (Math.pow(i, 12) ^ 0x9753) & 0xffff) + ).buffer + ); + render(); + + const zero = screen.getByText("0x0000"); + expect(zero).toBeVisible(); + + // const indexes = document.querySelectorAll("code:nth-of-type(even)"); + // expect(indexes.length).toBe(16); + + // const cells = document.querySelectorAll("code:nth-of-type(even)"); + // expect(cells.length).toBe(16); + }); + }); +}); diff --git a/web-ide-main/components/src/chips/memory.tsx b/web-ide-main/components/src/chips/memory.tsx new file mode 100644 index 0000000..ad4d2ab --- /dev/null +++ b/web-ide-main/components/src/chips/memory.tsx @@ -0,0 +1,396 @@ +import { rounded } from "@davidsouther/jiffies/lib/esm/dom/css/border.js"; +import { + forwardRef, + ReactNode, + useCallback, + useContext, + useImperativeHandle, + useMemo, + useState, +} from "react"; + +import { + Format, + FORMATS, + MemoryAdapter, +} from "@nand2tetris/simulator/cpu/memory.js"; +import { loadAsm, loadBlob, loadHack } from "@nand2tetris/simulator/loader.js"; +import { asm } from "@nand2tetris/simulator/util/asm.js"; +import { bin, dec, hex } from "@nand2tetris/simulator/util/twos.js"; + +import { useClockReset } from "../clockface.js"; +import InlineEdit from "../inline_edit.js"; +import { LOADING } from "../messages.js"; +import { useStateInitializer } from "../react.js"; +import { BaseContext } from "../stores/base.context.js"; +import VirtualScroll, { VirtualScrollSettings } from "../virtual_scroll.js"; + +const ITEM_HEIGHT = 34; + +export const MemoryBlock = ({ + memory, + jmp = { value: 0 }, + highlight = -1, + editable = false, + justifyLeft = false, // TODO: handle this in css in the future + count, + maxSize, + offset = 0, + cellLabels, + format = dec, + onChange = () => undefined, + onFocus = () => undefined, +}: { + jmp?: { value: number }; + memory: MemoryAdapter; + highlight?: number; + editable?: boolean; + justifyLeft?: boolean; + count?: number; + offset?: number; + maxSize?: number; + cellLabels?: string[]; + format?: (v: number) => string; + onChange?: (i: number, value: string, previous: number) => void; + onFocus?: (i: number) => void; +}) => { + const settings = useMemo>( + () => ({ + count: Math.min(memory.size, count ?? 25), + maxIndex: maxSize ?? memory.size, + itemHeight: ITEM_HEIGHT, + startIndex: jmp.value, + }), + [memory.size, jmp], + ); + const get = useCallback( + (pos: number, count: number): [number, number][] => + memory + .range(pos + offset, pos + offset + count) + .map((v, i) => [i + pos + offset, v]), + [memory], + ); + + const row = useCallback( + ([i, v]: [number, number]) => ( + label.length)) : 0, + )} + showLabel={cellLabels != undefined} + size={memory.size} + editable={editable} + justifyLeft={justifyLeft} + highlight={i === highlight} + onChange={onChange} + onFocus={onFocus} + /> + ), + [format, editable, highlight, onChange], + ); + + return ( + + settings={settings} + get={get} + row={row} + rowKey={([i]) => i} + /> + ); +}; + +export const MemoryCell = ({ + index, + value, + label, + showLabel = false, + size, + highlight = false, + editable = false, + justifyLeft = false, + onChange = () => undefined, + onFocus = () => undefined, +}: { + index: number; + value: string; + label?: string; + showLabel?: boolean; + size?: number; + highlight?: boolean; + editable?: boolean; + justifyLeft?: boolean; + onChange?: (i: number, value: string, previous: number) => void; + onFocus?: (i: number) => void; +}) => ( +
+ {showLabel && ( + + {label ?? ""} + + )} + + {size + ? dec(index).padStart(Math.ceil(Math.log10(size)), " ") + : dec(index)} + + + {editable ? ( + + onChange(index, newValue, Number(value)) + } + onFocus={() => onFocus(index)} + /> + ) : ( + {value} + )} + +
+); + +export const Memory = forwardRef( + ( + { + name = "Memory", + className, + displayEnabled = true, + highlight = -1, + editable = true, + memory, + format = "dec", + onSetFormat, + excludedFormats = [], + count, + maxSize, + offset, + initialAddr, + cellLabels, + fileSelect, + showClear = true, + onChange = undefined, + onClear = undefined, + loadTooltip = undefined, + }: { + name?: string; + className?: string; + displayEnabled?: boolean; + editable?: boolean; + highlight?: number; + memory: MemoryAdapter; + count?: number; + maxSize?: number; + offset?: number; + initialAddr?: number; + format: Format; + onSetFormat?: (format: Format) => void; + excludedFormats?: Format[]; + cellLabels?: string[]; + fileSelect?: () => Promise<{ name: string; content: string }>; + showClear?: boolean; + onChange?: () => void; + onClear?: () => void; + loadTooltip?: { value: string; placement: string }; + }, + ref, + ) => { + const [fmt, setFormat] = useStateInitializer(format); + const [jmp, setJmp] = useState(""); + const [goto, setGoto] = useState({ value: initialAddr ?? 0 }); + const [highlighted, setHighlighted] = useStateInitializer(highlight); + const [renderKey, setRenderKey] = useState(0); + + const jumpTo = () => { + const value = + !isNaN(parseInt(jmp)) && isFinite(parseInt(jmp)) ? Number(jmp) : 0; + setHighlighted(value); + setGoto({ + value: value, + }); + rerenderMemoryBlock(); + }; + + const doLoad = async () => { + onChange?.(); + if (fileSelect) { + const { name, content } = await fileSelect(); + setStatus(LOADING); + requestAnimationFrame(async () => { + const loader = name.endsWith("hack") + ? loadHack + : name.endsWith("asm") + ? loadAsm + : loadBlob; + requestAnimationFrame(async () => { + try { + const bytes = await loader(content); + memory.loadBytes(bytes); + setStatus(""); + setFormat( + name.endsWith("hack") + ? "bin" + : name.endsWith("asm") + ? "asm" + : fmt, + ); + jumpTo(); + } catch (e) { + setStatus({ + message: `Error loading memory: ${(e as Error).message}`, + severity: "ERROR", + }); + return; + } + }); + }); + } + }; + + const { setStatus } = useContext(BaseContext); + + const rerenderMemoryBlock = () => { + setRenderKey(renderKey + 1); + }; + + useImperativeHandle(ref, () => ({ + rerender: rerenderMemoryBlock, + })); + + const clear = () => { + memory.reset(); + onChange?.(); + onClear?.(); + rerenderMemoryBlock(); + }; + + const doUpdate = (i: number, v: string) => { + memory.update(i, v, fmt ?? "dec"); + onChange?.(); + rerenderMemoryBlock(); + }; + + useClockReset(() => { + setJmp(""); + setGoto({ value: 0 }); + }); + + const doSetFormat = (format: Format) => { + setFormat(format); + onSetFormat?.(format); + }; + + return ( +
+
+
{name}
+
+ {fileSelect && ( + + )} + {showClear && ( + + )} + key === "Enter" && jumpTo()} + onChange={({ target: { value } }) => setJmp(value)} + /> + + +
+
+ {displayEnabled ? ( + doFormat(fmt, v)} + cellLabels={cellLabels} + maxSize={maxSize} + offset={offset} + onChange={doUpdate} + onFocus={(i) => setHighlighted(i)} + /> + ) : ( + "Memory display is disabled" + )} +
+ ); + }, +); +Memory.displayName = "Memory"; + +export default Memory; + +function doFormat(format: Format, v: number): string { + switch (format) { + case "bin": + return bin(v); + case "hex": + return hex(v); + case "asm": + return asm(v); + case "dec": + default: + return dec(v); + } +} diff --git a/web-ide-main/components/src/chips/register.tsx b/web-ide-main/components/src/chips/register.tsx new file mode 100644 index 0000000..c470e32 --- /dev/null +++ b/web-ide-main/components/src/chips/register.tsx @@ -0,0 +1,13 @@ +import { dec } from "@nand2tetris/simulator/util/twos.js"; + +export const RegisterComponent = ({ + name, + bits, +}: { + name: string; + bits: number; +}) => ( +
+ {name}: {dec(bits)} +
+); diff --git a/web-ide-main/components/src/chips/screen.tsx b/web-ide-main/components/src/chips/screen.tsx new file mode 100644 index 0000000..322b86b --- /dev/null +++ b/web-ide-main/components/src/chips/screen.tsx @@ -0,0 +1,153 @@ +import { assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { Memory } from "@nand2tetris/simulator/cpu/memory.js"; +import { useCallback, useRef, useState } from "react"; +import { useClockFrame, useClockReset } from "../clockface.js"; + +const WHITE = "white"; +const BLACK = "black"; +type COLOR = typeof WHITE | typeof BLACK; + +export interface ScreenMemory { + get(idx: number): number; +} + +export function reduceScreen(memory: Memory, offset = 0): ScreenMemory { + return { + get(idx: number): number { + return memory.get(offset + idx); + }, + }; +} + +function get(mem: ScreenMemory, x: number, y: number): COLOR { + const byte = mem.get(32 * y + ((x / 16) | 0)); + const bit = byte & (1 << x % 16); + return bit === 0 ? WHITE : BLACK; +} + +function set(data: Uint8ClampedArray, x: number, y: number, value: COLOR) { + const pixel = (y * 512 + x) * 4; + const color = value === WHITE ? 255 : 0; + data[pixel] = color; + data[pixel + 1] = color; + data[pixel + 2] = color; + data[pixel + 3] = 255; +} + +function drawImage(ctx: CanvasRenderingContext2D, memory: ScreenMemory) { + const image = assertExists( + ctx.getImageData(0, 0, 512, 256), + "Failed to create Context2d", + ); + for (let col = 0; col < 512; col++) { + for (let row = 0; row < 256; row++) { + const color = get(memory, col, row); + set(image.data, col, row, color); + } + } + ctx.putImageData(image, 0, 0); +} + +export type ScreenScales = 0 | 1 | 2; + +export const Screen = ({ + memory, + showScaleControls = false, + scale = 1, + onScale, +}: { + memory: ScreenMemory; + showScaleControls?: boolean; + scale?: ScreenScales; + onScale?: (scale: ScreenScales) => void; +}) => { + const canvas = useRef(); + const [screenScale, setScreenScale] = useState(scale); + + const onScaleCB = (scale: ScreenScales) => { + onScale?.(scale); + setScreenScale(scale); + }; + + const draw = useCallback(() => { + const ctx = + canvas.current?.getContext("2d", { willReadFrequently: true }) ?? + undefined; + + if (ctx) { + drawImage(ctx, memory); + } + }, [memory]); + + const ctxRef = useCallback( + (ref: HTMLCanvasElement | null) => { + canvas.current = ref ?? undefined; + draw(); + }, + [canvas, draw], + ); + + useClockFrame(draw); + useClockReset(() => { + canvas.current + ?.getContext("2d") + ?.clearRect(0, 0, canvas.current.width, canvas.current.height); + }); + + return ( +
+
+
Screen
+ {showScaleControls && ( +
+ + + +
+ )} +
+ {screenScale > 0 && ( +
+
+ +
+
+ )} +
+ ); +}; diff --git a/web-ide-main/components/src/chips/visualizations.test.tsx b/web-ide-main/components/src/chips/visualizations.test.tsx new file mode 100644 index 0000000..e789a20 --- /dev/null +++ b/web-ide-main/components/src/chips/visualizations.test.tsx @@ -0,0 +1,29 @@ +import { ALU } from "@nand2tetris/simulator/chip/builtins/index.js"; +import { Chip } from "@nand2tetris/simulator/chip/chip.js"; +import { render, screen } from "@testing-library/react"; +import { makeVisualization, makeVisualizationsWithId } from "./visualizations"; + +describe("visualizations", () => { + it("returns empty for chips with no parts", () => { + const chip = new Chip([], [], "test"); + + expect(makeVisualization(chip)).toBeUndefined(); + expect(makeVisualizationsWithId({ parts: [chip] })).toEqual([]); + }); + + it("returns vis for builtins", async () => { + const alu = new ALU(); + + const vis = makeVisualizationsWithId({ parts: [alu] }); + expect(vis.length).toBe(1); + render( + <> + {vis.map(([k, v]) => ( +
{v}
+ ))} + , + ); + const rendered = await screen.findAllByText(/ALU/); + expect(rendered).toBeDefined(); + }); +}); diff --git a/web-ide-main/components/src/chips/visualizations.tsx b/web-ide-main/components/src/chips/visualizations.tsx new file mode 100644 index 0000000..7d93993 --- /dev/null +++ b/web-ide-main/components/src/chips/visualizations.tsx @@ -0,0 +1,156 @@ +import { + CPU, + Computer, + Keyboard, + ROM32K, + Screen, +} from "@nand2tetris/simulator/chip/builtins/computer/computer.js"; +import { ALU } from "@nand2tetris/simulator/chip/builtins/index.js"; +import { + PC, + Register, +} from "@nand2tetris/simulator/chip/builtins/sequential/bit.js"; +import { + RAM, + RAM8, +} from "@nand2tetris/simulator/chip/builtins/sequential/ram.js"; +import { Chip, HIGH } from "@nand2tetris/simulator/chip/chip.js"; +import { Flags } from "@nand2tetris/simulator/cpu/alu.js"; +import { decode } from "@nand2tetris/simulator/cpu/cpu.js"; +import { ReactElement } from "react"; +import { NO_SCREEN } from "../stores/chip.store.js"; +import { ALUComponent } from "./alu.js"; +import { Keyboard as KeyboardComponent } from "./keyboard.js"; +import { Memory as MemoryComponent } from "./memory.js"; +import { RegisterComponent } from "./register.js"; +import { Screen as ScreenComponent } from "./screen.js"; + +export function getBuiltinVisualization(part: Chip): ReactElement | undefined { + switch (part.name) { + case "Register": + case "ARegister": + case "DRegister": + case "PC": + case "KEYBOARD": + case "RAM8": + case "RAM64": + case "RAM512": + case "RAM4K": + case "RAM16K": + case "ROM32K": + case "Screen": + case "Memory": + default: + return undefined; + } +} + +function makeMemoryVisualization(chip: RAM) { + return ( + + ); +} + +export function makeVisualization( + chip: Chip, + updateAction?: () => void, + parameters?: Set, +): ReactElement | undefined { + if (chip instanceof ALU) { + return ( + + ); + } + if (chip instanceof Register) { + return ( + + ); + } + if (chip instanceof PC) { + return ; + } + if (chip instanceof Keyboard) { + return ; + } + if (chip instanceof Screen) { + return ; + } + if (chip instanceof RAM) { + return makeMemoryVisualization(chip); + } + if (chip instanceof RAM8) { + return RAM {chip.width}; + } + if (chip instanceof CPU) { + const bits = decode(chip.in("instruction").busVoltage); + return ( + <> + + + + + + ); + } + if (chip instanceof Computer) { + return ( + <> + + + + {!parameters?.has(NO_SCREEN) && ( + + )} + {makeMemoryVisualization(chip.rom)} + {makeMemoryVisualization(chip.ram.ram)} + + ); + } + + const vis = [...chip.parts] + .map((chip) => makeVisualization(chip, updateAction)) + .filter((v) => v !== undefined); + return vis.length > 0 ? <>{vis} : undefined; +} + +export function makeVisualizationsWithId( + chip: { + parts: Chip[]; + }, + updateAction?: () => void, + parameters?: Set, +): [string, ReactElement][] { + return [...chip.parts] + .map((part, i): [string, ReactElement | undefined] => [ + `${part.id}_${i}`, + makeVisualization(part, updateAction, parameters), + ]) + .filter(([_, v]) => v !== undefined) as [string, ReactElement][]; +} diff --git a/web-ide-main/components/src/clockface.tsx b/web-ide-main/components/src/clockface.tsx new file mode 100644 index 0000000..4cf1da2 --- /dev/null +++ b/web-ide-main/components/src/clockface.tsx @@ -0,0 +1,71 @@ +import { useEffect, useMemo, useState } from "react"; + +import { display } from "@davidsouther/jiffies/lib/esm/display.js"; +import { Clock } from "@nand2tetris/simulator/chip/clock.js"; + +export function useClock(actions: { + tick?: () => void; + toggle?: () => void; + reset?: () => void; +}) { + const clock = useMemo(() => Clock.get(), []); + + useEffect(() => { + const subscription = clock.$.subscribe(() => { + actions.tick?.(); + }); + return () => subscription.unsubscribe(); + }, [actions, clock.$]); + + return { + toggle() { + clock.tick(); + actions.toggle?.(); + }, + + reset() { + clock.reset(); + actions.reset?.(); + }, + }; +} + +export function useClockFrame(frameFinished: () => void) { + useEffect(() => { + const subscription = Clock.get().frame$.subscribe(() => { + frameFinished(); + }); + return () => subscription.unsubscribe(); + }, [frameFinished]); +} + +export function useClockReset(reset: () => void) { + useEffect(() => { + const subscription = Clock.get().reset$.subscribe(() => { + reset(); + }); + return () => subscription.unsubscribe(); + }, [reset]); +} + +export function displayClock() { + return display(Clock.get()); +} + +export function useClockface() { + const [clockface, setClockface] = useState(displayClock()); + + useEffect(() => { + const subscription = Clock.get().$.subscribe(() => { + setClockface(displayClock()); + }); + return () => subscription.unsubscribe(); + }, []); + + return clockface; +} + +export const Clockface = () => { + const clockface = useClockface(); + return {clockface}; +}; diff --git a/web-ide-main/components/src/compare.ts b/web-ide-main/components/src/compare.ts new file mode 100644 index 0000000..3b1aee6 --- /dev/null +++ b/web-ide-main/components/src/compare.ts @@ -0,0 +1,210 @@ +import { isErr, Ok } from "@davidsouther/jiffies/lib/esm/result.js"; +import { Span } from "@nand2tetris/simulator/languages/base"; +import { CMP, Cmp } from "@nand2tetris/simulator/languages/cmp.js"; + +interface Diff { + row: number; + col: number; + expected: string; + given: string; +} + +interface DiffLineDisplay { + expectedLine: string; + givenLine: string; + correctCellSpans: Span[]; + incorrectCellSpans: Span[]; +} + +export type DecorationType = + | "correct-line" + | "error-line" + | "correct-cell" + | "error-cell"; + +interface Decoration { + span: Span; + type: DecorationType; +} + +export interface DiffDisplay { + text: string; + failureNum: number; + decorations: Decoration[]; + lineNumbers: string[]; +} + +function getDiffs(cmpData: Cmp, outData: Cmp): Diff[] { + const diffs: Diff[] = []; + + for (let i = 0; i < Math.min(cmpData.length, outData.length); i++) { + const cmpI = cmpData[i] ?? []; + const outI = outData[i] ?? []; + + for (let j = 0; j < Math.max(cmpI.length, outI.length); j++) { + const cmpJ = cmpI[j] ?? ""; + const outJ = outI[j] ?? ""; + if (!(cmpJ?.trim().match(/^\*+$/) !== null || outJ === cmpJ)) { + diffs.push({ row: i, col: j, expected: cmpJ, given: outJ }); + } + } + } + return diffs; +} + +export function compare(cmp: string, out: string) { + const cmpResult = CMP.parse(cmp); + const outResult = CMP.parse(out); + + if (isErr(cmpResult) || isErr(outResult)) { + return false; + } + + const cmpData = Ok(cmpResult); + const outData = Ok(outResult); + + return getDiffs(cmpData, outData).length == 0; +} + +export function generateDiffs(cmp: string, out: string): DiffDisplay { + const cmpResult = CMP.parse(cmp); + const outResult = CMP.parse(out); + + if (isErr(cmpResult) || isErr(outResult)) { + return { + text: "", + failureNum: 0, + decorations: [], + lineNumbers: [], + }; + } + + const cmpData = Ok(cmpResult); + const outData = Ok(outResult); + + const diffs = getDiffs(cmpData, outData); + + const diffsByLine: Diff[][] = new Array(cmpData.length); + for (const diff of diffs) { + const lineDiffs = diffsByLine[diff.row]; + if (lineDiffs) { + lineDiffs.push(diff); + } else { + diffsByLine[diff.row] = [diff]; + } + } + + const lines = out.split("\n"); + const diffLines: DiffLineDisplay[] = new Array(cmpData.length); + for (let i = 0; i < diffsByLine.length; i++) { + if (diffsByLine[i]) { + diffLines[i] = generateDiffLine(lines[i], diffsByLine[i]); + } + } + + const finalLines: string[] = []; + let lineStart = 0; + const decorations: Decoration[] = []; + const lineNumbers: string[] = []; + + for (let i = 0; i < lines.length; i++) { + const diffLine = diffLines[i]; + lineNumbers.push((i + 1).toString()); + if (diffLine) { + lineNumbers.push(""); + finalLines.push(diffLine.givenLine); + decorations.push({ + span: { + start: lineStart, + end: lineStart + diffLine.givenLine.length, + line: finalLines.length, + }, + type: "error-line", + }); + decorations.push( + ...diffLine.incorrectCellSpans.map((span) => ({ + span: { + start: span.start + lineStart, + end: span.end + lineStart, + line: span.line, + }, + type: "error-cell" as DecorationType, + })), + ); + + lineStart += diffLine.expectedLine.length + 1; // +1 for the newline character + + finalLines.push(diffLine.expectedLine); + decorations.push({ + span: { + start: lineStart, + end: lineStart + diffLine.expectedLine.length, + line: i, + }, + type: "correct-line", + }); + decorations.push( + ...diffLine.correctCellSpans.map((span) => ({ + span: { + start: span.start + lineStart, + end: span.end + lineStart, + line: finalLines.length, + }, + type: "correct-cell" as DecorationType, + })), + ); + + lineStart += diffLine.givenLine.length + 1; + } else { + finalLines.push(lines[i]); + lineStart += lines[i].length + 1; + } + } + + let text = finalLines.join("\n"); + if (text.endsWith("\n")) { + text = text.substring(0, text.length - 1); + } + + return { + text: text, + failureNum: diffs.length, + decorations, + lineNumbers, + }; +} + +function generateDiffLine(original: string, diffs: Diff[]): DiffLineDisplay { + const cells = original.split("|").filter((cell) => cell != ""); + const newCells = Array.from(cells); + + const cellStarts: number[] = []; + let sum = 0; + for (let i = 0; i < cells.length; i++) { + cellStarts.push(sum + 1); + sum += cells[i].length + 1; + } + + const correctCellSpans: Span[] = []; + const incorrectCellSpans: Span[] = []; + + for (const diff of diffs) { + cells[diff.col] = diff.expected; + newCells[diff.col] = diff.given; + + const span = { + start: cellStarts[diff.col], + end: cellStarts[diff.col] + diff.expected.length, + line: 0, // not used + }; + correctCellSpans.push(span); + incorrectCellSpans.push(span); + } + + return { + expectedLine: `|${cells.join("|")}|`, + givenLine: `|${newCells.join("|")}|`, + correctCellSpans, + incorrectCellSpans, + }; +} diff --git a/web-ide-main/components/src/dialog.tsx b/web-ide-main/components/src/dialog.tsx new file mode 100644 index 0000000..227e8c7 --- /dev/null +++ b/web-ide-main/components/src/dialog.tsx @@ -0,0 +1,14 @@ +import { useState } from "react"; + +export function useDialog() { + const [open, setOpen] = useState(false); + return { + isOpen: open, + open() { + setOpen(true); + }, + close() { + setOpen(false); + }, + }; +} diff --git a/web-ide-main/components/src/difftable.tsx b/web-ide-main/components/src/difftable.tsx new file mode 100644 index 0000000..5afc8b0 --- /dev/null +++ b/web-ide-main/components/src/difftable.tsx @@ -0,0 +1,120 @@ +import { CMP } from "@nand2tetris/simulator/languages/cmp.js"; +import { display } from "@davidsouther/jiffies/lib/esm/display.js"; +import { range } from "@davidsouther/jiffies/lib/esm/range.js"; +import { Err, isErr, Ok } from "@davidsouther/jiffies/lib/esm/result.js"; +import { ReactElement } from "react"; + +export const DiffTable = ({ + className = "", + out, + cmp, + zeroState, +}: { + out: string; + cmp: string; + className?: string; + zeroState?: ReactElement; +}) => { + const output = CMP.parse(out); + const compare = CMP.parse(cmp); + + if (isErr(output)) { + return ( +
+ Failed to parse output +
{display(Err(output))}
+ +
{out}
+
+
+ ); + } + + if (isErr(compare)) { + return ( +
+ Failed to parse compare + +
{display(Err(compare))}
+
{cmp}
+
+
+ ); + } + + const cmpData = Ok(compare); + const outData = Ok(output); + let failures = 0; + const table = range(0, Math.min(cmpData.length, outData.length)).map((i) => { + const cmpI = cmpData[i] ?? []; + const outI = outData[i] ?? []; + return range(0, Math.max(cmpI.length, outI.length)) + .map((_, j) => [cmpI[j] ?? "", outI[j] ?? ""]) + .map(([cmp, out]) => { + const cell = { + cmp: cmp ?? '"', + out: out ?? '"', + pass: + cmp?.trim().match(/^\*+$/) !== null || out?.trim() === cmp?.trim(), + }; + if (!cell.pass) { + failures += 1; + } + return cell; + }); + }); + + return ( +
+ {failures > 0 && ( +

+ {failures} failure{failures === 1 ? "" : "s"} +

+ )} + {table.length > 0 ? ( + + + {table.map((row, i) => ( + + {row.map(({ cmp, out, pass }, i) => ( + + ))} + + ))} + +
+ ) : ( + (zeroState ??

Execute test script to compare output.

) + )} +
+ ); +}; + +const DiffCell = ({ + cmp, + out, + pass, +}: { + cmp: string; + out: string; + pass: boolean; +}) => { + return pass ? ( + <> + {cmp} + + ) : ( + <> + + {cmp} +
+ {out} + + + ); +}; diff --git a/web-ide-main/components/src/file_utils.ts b/web-ide-main/components/src/file_utils.ts new file mode 100644 index 0000000..978894f --- /dev/null +++ b/web-ide-main/components/src/file_utils.ts @@ -0,0 +1,81 @@ +import { FileSystem, Stats } from "@davidsouther/jiffies/lib/esm/fs"; +import { Err, Ok, Result } from "@davidsouther/jiffies/lib/esm/result.js"; + +interface TestFiles { + tst: string; + cmp?: string; +} + +export async function loadTestFiles( + fs: FileSystem, + tstPath: string, +): Promise> { + try { + const tst = await fs.readFile(tstPath); + let cmp: string | undefined = undefined; + try { + const cpmPath = tstPath + .replace("VME.tst", ".tst") + .replace(".tst", ".cmp"); + cmp = await fs.readFile(cpmPath); + } catch (_e) { + // There doesn't have to be a compare file + } + return Ok({ tst: tst, cmp: cmp }); + } catch (e) { + return Err(e as Error); + } +} + +export function sortFiles(files: Stats[]) { + return files.sort((a, b) => { + const aIsNum = /^\d+/.test(a.name); + const bIsNum = /^\d+/.test(b.name); + if (aIsNum && !bIsNum) { + return -1; + } else if (!aIsNum && bIsNum) { + return 1; + } else if (aIsNum && bIsNum) { + return parseInt(a.name, 10) - parseInt(b.name, 10); + } else { + return a.name.localeCompare(b.name); + } + }); +} + +export async function cloneTree( + sourceFs: FileSystem, + targetFs: FileSystem, + dir = "/", + pathTransform: (path: string) => string, + overwrite = false, +) { + const sourceDir = dir == "/" ? "" : dir; + const targetDir = pathTransform(sourceDir); + + const sourceItems = await sourceFs.scandir(dir); + + targetFs.mkdir(targetDir); + const targetItems = new Set( + (await targetFs.scandir(targetDir)).map((stat) => stat.name), + ); + + for (const item of sourceItems) { + if (item.isFile()) { + if (overwrite || !targetItems.has(item.name)) { + await targetFs.writeFile( + `${targetDir}/${item.name}`, + await sourceFs.readFile(`${sourceDir}/${item.name}`), + ); + } + } else { + await cloneTree( + sourceFs, + targetFs, + `${sourceDir}/${item.name}`, + pathTransform, + overwrite, + ); + } + } +} diff --git a/web-ide-main/components/src/i18n.tsx b/web-ide-main/components/src/i18n.tsx new file mode 100644 index 0000000..0262cd3 --- /dev/null +++ b/web-ide-main/components/src/i18n.tsx @@ -0,0 +1,5 @@ +// export { Trans } from "@lingui/macro"; + +import { PropsWithChildren } from "react"; + +export const Trans = (props: PropsWithChildren) => props.children ?? <>; diff --git a/web-ide-main/components/src/inline_edit.tsx b/web-ide-main/components/src/inline_edit.tsx new file mode 100644 index 0000000..7f28ed7 --- /dev/null +++ b/web-ide-main/components/src/inline_edit.tsx @@ -0,0 +1,85 @@ +import { width } from "@davidsouther/jiffies/lib/esm/dom/css/sizing.js"; +import { useCallback, useState } from "react"; +import { useStateInitializer } from "./react.js"; +import { Action } from "@nand2tetris/simulator/types.js"; + +const Mode = { VIEW: 0, EDIT: 1 }; + +export const InlineEdit = (props: { + mode?: keyof typeof Mode; + value: string; + highlight: boolean; + onChange: Action; + onFocus?: () => void; +}) => { + const [mode, setMode] = useState(props.mode ?? Mode.VIEW); + const [value, setValue] = useStateInitializer(props.value); + + const render = () => { + switch (mode) { + case Mode.EDIT: + return edit(); + case Mode.VIEW: + return view(); + default: + return ; + } + }; + + const view = () => ( +
{ + setMode(Mode.EDIT); + }} + > + {value}  +
+ ); + + const doSelect = useCallback( + (ref: HTMLInputElement | null) => ref?.select(), + [], + ); + const doChange = useCallback( + (target: HTMLInputElement) => { + setMode(Mode.VIEW); + setValue(target.value ?? ""); + props.onChange(target.value ?? ""); + }, + [props, setMode, setValue], + ); + const edit = () => { + const edit = ( + + doChange(target)} + onKeyPress={({ key, target }) => { + if (key === "Enter") { + doChange(target as HTMLInputElement); + } + }} + type="text" + defaultValue={value} + /> + + ); + return edit; + }; + + return render(); +}; + +export default InlineEdit; diff --git a/web-ide-main/components/src/messages.ts b/web-ide-main/components/src/messages.ts new file mode 100644 index 0000000..c04ddc0 --- /dev/null +++ b/web-ide-main/components/src/messages.ts @@ -0,0 +1 @@ +export const LOADING = "Loading in progress..."; diff --git a/web-ide-main/components/src/pin_display.ts b/web-ide-main/components/src/pin_display.ts new file mode 100644 index 0000000..84d53ac --- /dev/null +++ b/web-ide-main/components/src/pin_display.ts @@ -0,0 +1,43 @@ +import { assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { REGISTRY as BUILTIN_REGISTRY } from "@nand2tetris/simulator/chip/builtins/index.js"; + +export class ChipDisplayInfo { + signBehaviors: Map = new Map(); + + public constructor(chipName: string, unsigned?: string[]) { + if (BUILTIN_REGISTRY.has(chipName)) { + const chip = assertExists(BUILTIN_REGISTRY.get(chipName)?.()); + + const pins = [...chip.ins.entries(), ...chip.outs.entries()]; + + for (const pin of pins) { + this.signBehaviors.set( + pin.name, + !unsigned || !unsigned.includes(pin.name), + ); + } + } + } + + public isSigned(pin: string) { + return this.signBehaviors.get(pin); + } +} + +const UNSIGNED_PINS = new Map([ + ["Mux4Way16", ["sel"]], + ["Mux8Way16", ["sel"]], + ["DMux4Way", ["sel"]], + ["DMux8Way", ["sel"]], + ["RAM8", ["address"]], + ["RAM64", ["address"]], + ["RAM512", ["address"]], + ["RAM4K", ["address"]], + ["RAM16K", ["address"]], + ["Screen", ["address"]], + ["Memory", ["address"]], + ["CPU", ["addressM", "pc"]], +]); + +export const getDisplayInfo = (chipName: string) => + new ChipDisplayInfo(chipName, UNSIGNED_PINS.get(chipName)); diff --git a/web-ide-main/components/src/pinout.test.tsx b/web-ide-main/components/src/pinout.test.tsx new file mode 100644 index 0000000..43cafe7 --- /dev/null +++ b/web-ide-main/components/src/pinout.test.tsx @@ -0,0 +1,60 @@ +import { Bus, HIGH } from "@nand2tetris/simulator/chip/chip.js"; +import { render, screen } from "@testing-library/react"; +import { act, useState } from "react"; +import { Pinout, reducePin } from "./pinout.js"; + +describe("", () => { + it("renders pins", () => { + const pin = new Bus("pin"); + render(); + + const pinOut = screen.getByText("0"); + expect(pinOut).toBeVisible(); + }); + + it("toggles bits", () => { + const pin = new Bus("pin"); + const Wrapper = () => { + const [pins, setPins] = useState([reducePin(pin)]); + + const toggle = () => { + pin.toggle(); + setPins([reducePin(pin)]); + }; + + return ; + }; + + render(); + + const pinOut = screen.getByText("0"); + act(() => { + pinOut.click(); + }); + expect(pin.busVoltage).toBe(HIGH); + expect(screen.getByText("1")).toBeVisible(); + }); + + it.skip("increments buses", () => { + const pin = new Bus("pin", 3); + const Wrapper = () => { + const [pins, setPins] = useState([reducePin(pin)]); + + const toggle = () => { + pin.busVoltage += 1; + setPins([reducePin(pin)]); + }; + + return ; + }; + + render(); + + const pinOut = screen.getByText("000"); + act(() => { + pinOut.click(); + }); + expect(pin.busVoltage).toBe(1); + expect(screen.getByText("001")).toBeVisible(); + }); +}); diff --git a/web-ide-main/components/src/pinout.tsx b/web-ide-main/components/src/pinout.tsx new file mode 100644 index 0000000..3bcae8e --- /dev/null +++ b/web-ide-main/components/src/pinout.tsx @@ -0,0 +1,307 @@ +import { range } from "@davidsouther/jiffies/lib/esm/range.js"; +import { + Pin as ChipPin, + Pins, + Voltage, +} from "@nand2tetris/simulator/chip/chip.js"; +import { createContext, useContext, useEffect, useState } from "react"; +import { ChipDisplayInfo, getDisplayInfo } from "./pin_display.js"; +import "./public/pin.css"; +import { ChipSim } from "./stores/chip.store.js"; + +export const PinContext = createContext({}); + +export interface ImmPin { + bits: [number, Voltage][]; + pin: ChipPin; +} + +export function reducePin(pin: ChipPin) { + return { + pin, + bits: range(0, pin.width) + .map((i) => [i, pin.voltage(i)] as [number, Voltage]) + .reverse(), + }; +} + +export function reducePins(pins: Pins): ImmPin[] { + return [...pins.entries()].map(reducePin); +} + +export interface PinoutPins { + pins: ImmPin[]; + toggle?: (pin: ChipPin, bit?: number) => void; +} + +export const FullPinout = (props: { + sim: ChipSim; + toggle: (pin: ChipPin, i: number | undefined) => void; + setInputValid: (pending: boolean) => void; + hideInternal?: boolean; +}) => { + const { inPins, outPins, internalPins } = props.sim; + const displayInfo = getDisplayInfo(props.sim.chip[0].name ?? ""); + return ( + <> + + + + + + {!props.hideInternal && ( + + )} + +
+ + ); +}; + +export const PinoutBlock = ( + props: PinoutPins & { + header: string; + disabled?: boolean; + enableEdit?: boolean; + setInputValid?: (valid: boolean) => void; + displayInfo: ChipDisplayInfo; + }, +) => ( + <> + {props.pins.length > 0 && ( + + {props.header} + + )} + {[...props.pins].map((immPin) => ( + + {immPin.pin.name} + + + + + ))} + +); + +export const Pinout = ({ + pins, + toggle, +}: { + pins: ImmPin[]; + toggle?: (pin: ChipPin, bit?: number) => void; +}) => { + if (pins.length === 0) { + return <>None; + } + return ( + + + + + + + + + {[...pins].map((immPin) => ( + + + + + ))} + +
NameValue
{immPin.pin.name} + +
+ ); +}; + +const Pin = ({ + pin, + toggle, + disabled = false, + enableEdit = true, + signed = true, + setInputValid, + internal = false, +}: { + pin: ImmPin; + toggle: ((pin: ChipPin, bit?: number) => void) | undefined; + disabled?: boolean; + enableEdit?: boolean; + signed?: boolean; + setInputValid?: (valid: boolean) => void; + internal: boolean; +}) => { + const [isBin, setIsBin] = useState(true); + let inputValid = true; + const [decimal, setDecimal] = useState(""); + + const toggleBin = () => { + setIsBin(!isBin); + }; + + const resetDispatcher = useContext(PinContext); + if (resetDispatcher instanceof PinResetDispatcher) { + resetDispatcher.registerCallback(() => { + setIsBin(true); + }); + } + + const setInputValidity = (valid: boolean) => { + inputValid = valid; + setInputValid?.(valid); + }; + + const handleDecimalChange = (value: string) => { + const positive = value.replace(/[^\d]/g, ""); + const numeric = signed && value[0] === "-" ? `-${positive}` : positive; + + setDecimal(numeric); + if (isNaN(parseInt(numeric))) { + setInputValidity(false); + } else { + const newValue = parseInt(numeric); + if ( + (!signed && newValue >= Math.pow(2, pin.bits.length)) || + (signed && + (newValue >= Math.pow(2, pin.bits.length - 1) || + newValue < -Math.pow(2, pin.bits.length - 1))) + ) { + setInputValidity(false); + } else { + updatePins(newValue); + setInputValidity(true); + } + } + }; + + const updatePins = (n: number) => { + for (let i = 0; i < pin.bits.length; i++) { + if (pin.bits[pin.bits.length - i - 1][1] !== ((n >> i) & 1)) { + toggle?.(pin.pin, i); + } + } + }; + + useEffect(() => { + if (!isBin && inputValid) { + let value = 0; + if (signed && pin.bits[0][1]) { + // negative + for (const [i, v] of pin.bits) { + if (i < pin.bits.length - 1 && !v) { + value += 2 ** i; + } + } + value = -value - 1; + } else { + // positive + const limit = signed ? pin.bits.length - 1 : pin.bits.length; + for (const [i, v] of pin.bits) { + if (i < limit && v) { + value += 2 ** i; + } + } + } + setDecimal(value.toString()); + } + }, [pin, isBin]); + + return ( +
+
+ {isBin ? ( + pin.bits.map(([i, v]) => ( + + )) + ) : ( + { + handleDecimalChange(e.target.value); + }} + disabled={!enableEdit} + /> + )} +
+ {pin.bits.length > 1 && ( + <> +
+ + + )} +
+ ); +}; + +export class PinResetDispatcher { + private callbacks: (() => void)[] = []; + + registerCallback(callback: () => void) { + this.callbacks.push(callback); + } + + reset() { + for (const callback of this.callbacks) { + callback(); + } + } +} diff --git a/web-ide-main/components/src/public/alu.css b/web-ide-main/components/src/public/alu.css new file mode 100644 index 0000000..6fd93c2 --- /dev/null +++ b/web-ide-main/components/src/public/alu.css @@ -0,0 +1,3 @@ +.alu { + font-size: 20; +} diff --git a/web-ide-main/components/src/public/pin.css b/web-ide-main/components/src/public/pin.css new file mode 100644 index 0000000..2b6a9dc --- /dev/null +++ b/web-ide-main/components/src/public/pin.css @@ -0,0 +1,5 @@ +.pin-control { + max-width: 3em !important; + background: var(--light-grey); + border-color: var(--light-grey); +} diff --git a/web-ide-main/components/src/react.ts b/web-ide-main/components/src/react.ts new file mode 100644 index 0000000..5c28816 --- /dev/null +++ b/web-ide-main/components/src/react.ts @@ -0,0 +1,31 @@ +import { produce } from "immer"; +import { Dispatch, useEffect, useReducer, useState } from "react"; + +export function useImmerReducer< + T, + // biome-ignore lint/suspicious/noExplicitAny: reducer really doesn't care + Reducers extends Record T | void>, +>(reducers: Reducers, initialState: T) { + return useReducer( + ( + state: T, + command: { + action: keyof Reducers; + // biome-ignore lint/suspicious/noExplicitAny: reducer doesn't care and covariants are hard + payload?: any; + }, + ): T => + produce(state, (draft: T) => { + reducers[command.action](draft, command.payload); + }), + initialState, + ); +} + +export function useStateInitializer(init: T): [T, Dispatch] { + const [state, setState] = useState(init); + useEffect(() => { + setState(init); + }, [init]); + return [state, setState]; +} diff --git a/web-ide-main/components/src/runbar.tsx b/web-ide-main/components/src/runbar.tsx new file mode 100644 index 0000000..e956503 --- /dev/null +++ b/web-ide-main/components/src/runbar.tsx @@ -0,0 +1,141 @@ +import { Timer } from "@nand2tetris/simulator/timer.js"; +import { ChangeEvent, ReactNode, useEffect, useRef } from "react"; +import { useStateInitializer } from "./react.js"; +import { useTimer } from "./timer.js"; + +interface RunbarTooltipOverrides { + step: string; + run: string; + pause: string; + reset: string; +} + +export type RunSpeed = 0 | 1 | 2 | 3 | 4; + +export const Runbar = (props: { + runner: Timer; + speed?: RunSpeed; + disabled?: boolean; + prefix?: ReactNode; + children?: ReactNode; + overrideTooltips?: Partial; + onSpeedChange?: (speed: RunSpeed) => void; +}) => { + const runner = useTimer(props.runner); + const [speedValue, setSpeed] = useStateInitializer(props.speed ?? 2); + + const speedValues: Record = { + 0: [1000, 1], + 1: [500, 1], + 2: [16, 1], + 3: [16, 16666], + 4: [16, 16666 * 30], + }; + + useEffect(() => { + updateSpeed(); + }, [speedValue]); + + const updateSpeed = () => { + const [speed, steps] = speedValues[speedValue]; + runner.dispatch({ action: "setSpeed", payload: speed }); + runner.dispatch({ action: "setSteps", payload: steps }); + }; + + const onChange = (e: ChangeEvent) => { + const speed = Number(e.target.value) as RunSpeed; + setSpeed(speed); + props.onSpeedChange?.(speed); + }; + + const toggleRef = useRef(null); + + const onKeyPress = (event: KeyboardEvent) => { + toggleRef.current?.blur(); + }; + + useEffect(() => { + window.addEventListener("keydown", onKeyPress); + window.addEventListener("keyup", onKeyPress); + + return () => { + window.removeEventListener("keydown", onKeyPress); + window.removeEventListener("keyup", onKeyPress); + }; + }); + + return ( +
+
+ {props.prefix} + + + +
+
+ Slow + + Fast +
+ {props.children} +
+ ); +}; diff --git a/web-ide-main/components/src/setupTests.ts b/web-ide-main/components/src/setupTests.ts new file mode 100644 index 0000000..2ab4566 --- /dev/null +++ b/web-ide-main/components/src/setupTests.ts @@ -0,0 +1,6 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import "@testing-library/jest-dom"; +import "@nand2tetris/simulator/setupTests.js"; diff --git a/web-ide-main/components/src/stores/asm.store.ts b/web-ide-main/components/src/stores/asm.store.ts new file mode 100644 index 0000000..1472c99 --- /dev/null +++ b/web-ide-main/components/src/stores/asm.store.ts @@ -0,0 +1,490 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { + Err, + isErr, + Ok, + Result, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import { + CompareResultLengths, + CompareResultLine, + compareLines, +} from "@nand2tetris/simulator/compare.js"; +import { + KEYBOARD_OFFSET, + SCREEN_OFFSET, +} from "@nand2tetris/simulator/cpu/memory.js"; +import { + ASM, + Asm, + fillLabel, + isAValueInstruction, + translateInstruction, +} from "@nand2tetris/simulator/languages/asm.js"; +import { + CompilationError, + Span, +} from "@nand2tetris/simulator/languages/base.js"; +import { Action } from "@nand2tetris/simulator/types.js"; +import { bin } from "@nand2tetris/simulator/util/twos.js"; +import { Dispatch, MutableRefObject, useContext, useMemo, useRef } from "react"; +import { RunSpeed } from "src/runbar.js"; +import { useImmerReducer } from "../react.js"; +import { BaseContext, StatusSeverity } from "./base.context.js"; + +export interface TranslatorSymbol { + name: string; + value: string; +} + +function defaultSymbols(): TranslatorSymbol[] { + return [ + { name: "R0", value: "0" }, + { name: "R1", value: "1" }, + { name: "R2", value: "2" }, + { name: "...", value: "" }, // abbreviation of R3 - R14 + { name: "R15", value: "15" }, + { name: "SCREEN", value: SCREEN_OFFSET.toString() }, + { name: "KBD", value: KEYBOARD_OFFSET.toString() }, + ]; +} + +interface HighlightInfo { + resultHighlight: Span | undefined; + sourceHighlight: Span | undefined; + highlightMap: Map; +} + +interface AsmVariable { + name: string; + isHidden: boolean; +} + +class Translator { + asm: Asm = { instructions: [] }; + current = -1; + done = false; + symbols: TranslatorSymbol[] = []; + private variables: Map = new Map(); + private lines: string[] = []; + lineNumbers: number[] = []; + + getResult() { + return this.lines.join("\n"); + } + + load(asm: Asm, lineNum: number): Result { + this.symbols = defaultSymbols(); + this.variables.clear(); + this.asm = asm; + + const result = fillLabel(asm, (name, value, isVar) => { + if (isVar) { + this.variables.set(value, { name: name, isHidden: true }); + } else { + this.symbols.push({ name: name, value: value.toString() }); + } + }); + if (isErr(result)) { + return result; + } + + asm.instructions = asm.instructions.filter(({ type }) => type !== "L"); + + this.resolveLineNumbers(lineNum); + this.reset(); + return Ok(); + } + + resolveLineNumbers(lineNum: number) { + this.lineNumbers = Array(lineNum); + let currentLine = 0; + for (const instruction of this.asm.instructions) { + if ( + (instruction.type === "A" || instruction.type === "C") && + instruction.span != undefined + ) { + this.lineNumbers[instruction.span.line] = currentLine; + currentLine += 1; + } + } + } + + step(highlightInfo: HighlightInfo) { + if (this.current >= this.asm.instructions.length - 1) { + return; + } + this.current += 1; + const instruction = this.asm.instructions[this.current]; + if (instruction.type === "A" || instruction.type === "C") { + highlightInfo.sourceHighlight = instruction.span; + const result = translateInstruction(this.asm.instructions[this.current]); + if (result === undefined) { + return; + } + this.lines.push(`${bin(result)}`); + highlightInfo.resultHighlight = { + start: this.current * 17, + end: (this.current + 1) * 17, + line: -1, + }; + + if (highlightInfo.sourceHighlight) { + highlightInfo.highlightMap.set( + highlightInfo.sourceHighlight, + highlightInfo.resultHighlight, + ); + } + + if (isAValueInstruction(instruction)) { + const variable = this.variables.get(instruction.value); + if (variable != undefined && variable.isHidden) { + this.symbols.push({ + name: variable.name, + value: instruction.value.toString(), + }); + variable.isHidden = false; + } + } + + if (this.current === this.asm.instructions.length - 1) { + this.done = true; + } + } + } + + resetSymbols() { + for (const variable of this.variables.values()) { + variable.isHidden = true; + } + + const variableNames = new Set( + Array.from(this.variables.values()).map((v) => v.name), + ); + this.symbols = this.symbols.filter( + (symbol) => !variableNames.has(symbol.name), + ); + } + + reset() { + this.current = -1; + this.lines = []; + this.done = false; + this.resetSymbols(); + } +} + +export interface AsmPageState { + asm: string; + path: string | undefined; + translating: boolean; + current: number; + resultHighlight: Span | undefined; + sourceHighlight: Span | undefined; + symbols: TranslatorSymbol[]; + result: string; + compare: string; + compareName: string | undefined; + lineNumbers: number[]; + error?: CompilationError; + compareError: boolean; + title?: string; + config: AsmPageConfig; +} + +export interface AsmPageConfig { + speed: RunSpeed; +} + +export type AsmStoreDispatch = Dispatch<{ + action: keyof ReturnType["reducers"]; + payload?: unknown; +}>; + +export function makeAsmStore( + fs: FileSystem, + setStatus: Action, + dispatch: MutableRefObject, + upgraded: boolean, +) { + const translator = new Translator(); + const highlightInfo: HighlightInfo = { + resultHighlight: undefined, + sourceHighlight: undefined, + highlightMap: new Map(), + }; + let path: string | undefined; + let animate = true; + let compiled = false; + let translating = false; + let failure = false; + + const reducers = { + setAsm( + state: AsmPageState, + { asm, path }: { asm: string; path: string | undefined }, + ) { + state.asm = asm; + + if (path) { + state.path = path; + } + }, + + setCmp(state: AsmPageState, { cmp, name }: { cmp: string; name: string }) { + state.compare = cmp; + state.compareName = name; + setStatus("Loaded compare file"); + }, + + setError(state: AsmPageState, error?: CompilationError) { + if (error) { + setStatus({ + message: error.message, + severity: "ERROR", + }); + } + state.error = error; + }, + + update(state: AsmPageState) { + state.translating = translating; + state.current = translator.current; + state.result = translator.getResult(); + state.symbols = Array.from(translator.symbols); + state.lineNumbers = Array.from(translator.lineNumbers); + state.sourceHighlight = highlightInfo.sourceHighlight; + state.resultHighlight = highlightInfo.resultHighlight; + state.compareError = failure; + }, + + compare(state: AsmPageState) { + const comparison = compareLines(state.result, state.compare); + + if ((comparison as CompareResultLengths).lenA) { + failure = true; + setStatus({ + message: "Comparison failed - different lengths", + severity: "ERROR", + }); + return; + } + + const { line } = comparison as CompareResultLine; + if (line) { + setStatus({ + message: `Comparison failure: Line ${line}`, + severity: "ERROR", + }); + + failure = true; + highlightInfo.resultHighlight = { + start: line * 17, + end: (line + 1) * 17, + line: -1, + }; + return; + } + + setStatus({ + message: "Comparison successful", + severity: "SUCCESS", + }); + }, + + setTitle(state: AsmPageState, title: string) { + state.title = title; + }, + + updateConfig(state: AsmPageState, config: Partial) { + state.config = { ...state.config, ...config }; + }, + }; + + const actions = { + async loadAsm(_path: string) { + path = _path; + const source = await fs.readFile(path); + actions.setAsm(source, path); + }, + + setAsm(asm: string, path?: string) { + asm = asm.replace(/\r\n/g, "\n"); + dispatch.current({ + action: "setAsm", + payload: { asm, path }, + }); + translating = false; + this.saveAsm(asm); + requestAnimationFrame(() => { + this.compileAsm(asm); + }); + }, + + saveAsm(asm: string) { + if (path) { + fs.writeFile(path, asm); + } + }, + + compileAsm(asm: string) { + this.reset(); + const parseResult = ASM.parse(asm); + if (isErr(parseResult)) { + dispatch.current({ + action: "setError", + payload: Err(parseResult), + }); + compiled = false; + return; + } + + const loadResult = translator.load( + Ok(parseResult), + asm.split("\n").length, + ); + if (isErr(loadResult)) { + dispatch.current({ + action: "setError", + payload: Err(loadResult), + }); + compiled = false; + return; + } + + compiled = translator.asm.instructions.length > 0; + setStatus(""); + dispatch.current({ action: "setError" }); + dispatch.current({ action: "update" }); + }, + + setAnimate(value: boolean) { + animate = value; + }, + + async step(): Promise { + if (compiled) { + translating = true; + } + translator.step(highlightInfo); + + if (animate || translator.done) { + dispatch.current({ action: "update" }); + + if (path && upgraded) { + await fs.writeFile( + path.replace(/\.asm$/, ".hack"), + translator.getResult(), + ); + } + } + + if (translator.done) { + setStatus({ + message: "Translation done.", + severity: "SUCCESS", + }); + } + return translator.done; + }, + + compare() { + dispatch.current({ action: "compare" }); + this.updateHighlight(highlightInfo.resultHighlight?.start ?? 0, false); + dispatch.current({ action: "update" }); + }, + + updateHighlight(index: number, fromSource: boolean) { + if (failure) { + return; + } + for (const [sourceSpan, resultSpan] of highlightInfo.highlightMap) { + if ( + (fromSource && + sourceSpan.start <= index && + index <= sourceSpan.end) || + (!fromSource && resultSpan.start <= index && index <= resultSpan.end) + ) { + highlightInfo.sourceHighlight = sourceSpan; + highlightInfo.resultHighlight = resultSpan; + } + } + dispatch.current({ action: "update" }); + }, + + resetHighlightInfo() { + highlightInfo.sourceHighlight = undefined; + highlightInfo.resultHighlight = undefined; + highlightInfo.highlightMap.clear(); + }, + + reset() { + failure = false; + translating = false; + setStatus("Reset"); + translator.reset(); + this.resetHighlightInfo(); + dispatch.current({ action: "update" }); + }, + + clear() { + this.setAsm(""); + dispatch.current({ action: "setTitle", payload: undefined }); + dispatch.current({ action: "setCmp", payload: "" }); + this.reset(); + }, + + overrideState(state: AsmPageState) { + this.resetHighlightInfo(); + this.setAsm(state.asm, state.path); + dispatch.current({ + action: "setCmp", + payload: { cmp: state.compare, name: state.compareName }, + }); + + if (state.translating) { + for (let i = 0; i <= state.current; i++) { + this.step(); + } + } + + dispatch.current({ action: "update" }); + }, + }; + + const initialState: AsmPageState = { + asm: "", + path: undefined, + translating: false, + current: -1, + resultHighlight: undefined, + sourceHighlight: undefined, + symbols: [], + result: "", + compare: "", + compareName: undefined, + lineNumbers: [], + compareError: false, + config: { + speed: 2, + }, + }; + + return { initialState, reducers, actions }; +} + +export function useAsmPageStore() { + const { setStatus, fs, localFsRoot } = useContext(BaseContext); + + const dispatch = useRef(() => undefined); + + const { initialState, reducers, actions } = useMemo( + () => makeAsmStore(fs, setStatus, dispatch, localFsRoot != undefined), + [setStatus, dispatch, fs], + ); + + const [state, dispatcher] = useImmerReducer(reducers, initialState); + dispatch.current = dispatcher; + + return { state, dispatch, actions }; +} diff --git a/web-ide-main/components/src/stores/base.context.ts b/web-ide-main/components/src/stores/base.context.ts new file mode 100644 index 0000000..c4ae7e4 --- /dev/null +++ b/web-ide-main/components/src/stores/base.context.ts @@ -0,0 +1,186 @@ +import { + FileSystem, + LocalStorageFileSystemAdapter, +} from "@davidsouther/jiffies/lib/esm/fs.js"; +import { Action, AsyncAction } from "@nand2tetris/simulator/types.js"; +import { + createContext, + useCallback, + useEffect, + useMemo, + useState, +} from "react"; +import { useDialog } from "../dialog.js"; +import { cloneTree } from "../file_utils.js"; +import { + FileSystemAccessFileSystemAdapter, + openNand2TetrisDirectory, +} from "./base/fs.js"; +import { + attemptLoadAdapterFromIndexedDb, + createAndStoreLocalAdapterInIndexedDB, + removeLocalAdapterFromIndexedDB, +} from "./base/indexDb.js"; + +export type StatusSeverity = "SUCCESS" | "WARNING" | "ERROR" | "INFO"; + +export interface BaseContext { + fs: FileSystem; + localFsRoot?: string; + canUpgradeFs: boolean; + upgradeFs: (force?: boolean, createFiles?: boolean) => Promise; + closeFs: () => void; + status: { message: string; severity: StatusSeverity }; + setStatus: Action; + storage: Record; + permissionPrompt: ReturnType; + requestPermission: AsyncAction; + loadFs: Action; +} + +export function useBaseContext(): BaseContext { + const localAdapter = useMemo(() => new LocalStorageFileSystemAdapter(), []); + const [fs, setFs] = useState(new FileSystem(localAdapter)); + const [root, setRoot] = useState(); + + const permissionPrompt = useDialog(); + + const setLocalFs = useCallback( + async (handle: FileSystemDirectoryHandle, createFiles = false) => { + // We will not mirror the changes in localStorage, since they will be saved in the user's file system + const newFs = new FileSystem( + new FileSystemAccessFileSystemAdapter(handle), + ); + if (createFiles) { + if (root) { + const loaders = await import("@nand2tetris/projects/loader.js"); + await loaders.createFiles(newFs); + } else { + await cloneTree(fs, newFs, "/projects", (path: string) => + path.replace("/projects", "/").replace(/\/0*(\d+)/, "$1"), + ); + } + } + setFs(newFs); + setRoot(handle.name); + }, + [setRoot, setFs], + ); + + const requestPermission = async () => { + attemptLoadAdapterFromIndexedDb().then(async (adapter) => { + if (!adapter) return; + await adapter.requestPermission({ mode: "readwrite" }); + }); + }; + + const loadFs = () => { + attemptLoadAdapterFromIndexedDb().then(async (adapter) => { + if (!adapter) return; + setLocalFs(adapter); + }); + }; + + useEffect(() => { + if (root) return; + + if ("showDirectoryPicker" in window) { + attemptLoadAdapterFromIndexedDb().then(async (adapter) => { + if (!adapter) return; + + const permissions = await adapter.queryPermission({ + mode: "readwrite", + }); + + switch (permissions) { + case "granted": + setLocalFs(adapter); + break; + case "prompt": + permissionPrompt.open(); + break; + case "denied": + setStatus({ + message: + "Permission denied. Please allow access to your file system.", + severity: "ERROR", + }); + break; + } + }); + } + }, [root, setLocalFs]); + + const canUpgradeFs = `showDirectoryPicker` in window; + + const upgradeFs = useCallback( + async (force = false, createFiles = false) => { + if (!canUpgradeFs || (root && !force)) return; + const handler = await openNand2TetrisDirectory(); + if (root) { + await removeLocalAdapterFromIndexedDB(); + } + const adapter = await createAndStoreLocalAdapterInIndexedDB(handler); + await setLocalFs(adapter, createFiles); + }, + [root, setLocalFs], + ); + + const closeFs = useCallback(async () => { + if (!root) return; + await removeLocalAdapterFromIndexedDB(); + setRoot(undefined); + setFs(new FileSystem(localAdapter)); + }, [root]); + + const [status, setStatusInternal] = useState<{ + message: string; + severity: StatusSeverity; + }>({ message: "", severity: "INFO" }); + + const setStatus = useCallback( + (input: string | { message: string; severity?: StatusSeverity }) => { + if (typeof input === "string") { + setStatusInternal({ message: input, severity: "INFO" }); + } else { + setStatusInternal({ + message: input.message, + severity: input.severity || "INFO", + }); + } + }, + [], + ); + + return { + fs, + localFsRoot: root, + status, + setStatus, + storage: localStorage, + canUpgradeFs, + permissionPrompt, + upgradeFs, + requestPermission, + closeFs, + loadFs, + }; +} + +export const BaseContext = createContext({ + fs: new FileSystem(new LocalStorageFileSystemAdapter()), + canUpgradeFs: false, + // biome-ignore lint/suspicious/noEmptyBlockStatements: abstract base + async upgradeFs() {}, + // biome-ignore lint/suspicious/noEmptyBlockStatements: abstract base + closeFs() {}, + status: { message: "", severity: "INFO" }, + // biome-ignore lint/suspicious/noEmptyBlockStatements: abstract base + setStatus() {}, + storage: {}, + permissionPrompt: {} as ReturnType, + // biome-ignore lint/suspicious/noEmptyBlockStatements: abstract base + async requestPermission() {}, + // biome-ignore lint/suspicious/noEmptyBlockStatements: abstract base + loadFs() {}, +}); diff --git a/web-ide-main/components/src/stores/base/fs.ts b/web-ide-main/components/src/stores/base/fs.ts new file mode 100644 index 0000000..d0dd87f --- /dev/null +++ b/web-ide-main/components/src/stores/base/fs.ts @@ -0,0 +1,176 @@ +import { + basename, + FileSystemAdapter, + SEP, + Stats, +} from "@davidsouther/jiffies/lib/esm/fs.js"; + +function dirname(path: string): string { + return path.split(SEP).slice(0, -1).join(SEP); +} + +export function openNand2TetrisDirectory(): Promise { + return window.showDirectoryPicker({ + id: "nand2tetris", + mode: "readwrite", + startIn: "documents", + }); +} + +export class FileSystemAccessFileSystemAdapter implements FileSystemAdapter { + constructor(private baseDir: FileSystemDirectoryHandle) {} + + async getFolder( + path: string, + create = false, + ): Promise { + let folder = this.baseDir; + const parts = path + .split(SEP) + .slice(1) + .filter((part) => part.trim() != ""); + for (const part of parts) { + folder = await folder.getDirectoryHandle(part, { create }); + } + return folder; + } + + async copyFile(from: string, to: string): Promise { + throw new Error( + "unimplemented: FileSystemAccessFileSystemAdapter::copyFile", + ); + } + + async mkdir(path: string): Promise { + this.getFolder(path, true); + } + + async readFile(path: string): Promise { + const folder = await this.getFolder(dirname(path)); + const file = await (await folder.getFileHandle(basename(path))).getFile(); + return file.text(); + } + + async writeFile(path: string, contents: string): Promise { + const folder = await this.getFolder(dirname(path), true); + const file = await ( + await folder.getFileHandle(basename(path), { create: true }) + ).createWritable(); + await file.write(contents); + await file.close(); + } + + async readdir(path: string): Promise { + const folder = await this.getFolder(path); + const entries: string[] = []; + for await (const [entry, _] of folder.entries()) { + entries.push(entry); + } + return entries; + } + + async scandir(path: string): Promise { + const folder = await this.getFolder(path); + const entries: Stats[] = []; + for await (const [name, handle] of folder.entries()) { + entries.push({ + name, + isDirectory() { + return handle.kind == "directory"; + }, + isFile() { + return handle.kind == "file"; + }, + }); + } + return entries; + } + + async stat(path: string): Promise { + const folder = await this.getFolder(dirname(path)); + for await (const [name, handle] of folder.entries()) { + if (name == basename(path)) { + return { + name, + isDirectory() { + return handle.kind == "directory"; + }, + isFile() { + return handle.kind == "file"; + }, + }; + } + } + return { + name: basename(path), + isDirectory() { + return false; + }, + isFile() { + return false; + }, + }; + } + + async rm(path: string): Promise { + const folder = await this.getFolder(dirname(path), true); + await folder.removeEntry(basename(path), { recursive: true }); + } +} + +export class ChainedFileSystemAdapter implements FileSystemAdapter { + constructor( + protected adapter: FileSystemAdapter, + private nextAdapter?: FileSystemAdapter | undefined, + ) {} + + stat(path: string): Promise { + return this.adapter.stat(path).catch((e) => { + if (this.nextAdapter) { + return this.nextAdapter.stat(path); + } + throw e; + }); + } + readdir(path: string): Promise { + return this.adapter.readdir(path).catch((e) => { + if (this.nextAdapter) { + return this.nextAdapter.readdir(path); + } + throw e; + }); + } + scandir(path: string): Promise { + return this.adapter.scandir(path).catch((e) => { + if (this.nextAdapter) { + return this.nextAdapter.scandir(path); + } + throw e; + }); + } + + async mkdir(path: string): Promise { + if (this.nextAdapter) await this.nextAdapter.mkdir(path); + return this.adapter.mkdir(path); + } + async copyFile(from: string, to: string): Promise { + if (this.nextAdapter) await this.nextAdapter.copyFile(from, to); + return this.adapter.copyFile(from, to); + } + readFile(path: string): Promise { + return this.adapter.readFile(path).catch((e) => { + if (this.nextAdapter) { + return this.nextAdapter.readFile(path); + } + throw e; + }); + } + async writeFile(path: string, contents: string): Promise { + if (this.nextAdapter) await this.nextAdapter?.writeFile(path, contents); + return this.adapter.writeFile(path, contents); + } + async rm(path: string): Promise { + if (this.nextAdapter) await this.nextAdapter.rm(path); + return this.adapter.rm(path); + } +} diff --git a/web-ide-main/components/src/stores/base/indexDb.ts b/web-ide-main/components/src/stores/base/indexDb.ts new file mode 100644 index 0000000..699b6be --- /dev/null +++ b/web-ide-main/components/src/stores/base/indexDb.ts @@ -0,0 +1,96 @@ +import { assert } from "@davidsouther/jiffies/lib/esm/assert.js"; + +const IDB_NAME = "NAND2TetrisIndexedDB"; +const IDB_VERSION = 1; +const IDB_FS_ADAPTER_OBJECT_STORE = "FileSystemAccess"; +const IDB_FS_ADAPTER_KEY = "Handler"; +function openIndexedDb(): Promise { + return new Promise((resolve, reject) => { + const request = window.indexedDB.open(IDB_NAME, IDB_VERSION); + request.onsuccess = () => { + resolve(request.result); + }; + request.onerror = () => { + reject(request.error); + }; + request.onupgradeneeded = (e) => { + request.result.createObjectStore(IDB_FS_ADAPTER_OBJECT_STORE); + }; + }); +} +export async function attemptLoadAdapterFromIndexedDb(): Promise { + const db = await openIndexedDb(); + return new Promise((resolve, reject) => { + const transaction = db.transaction( + [IDB_FS_ADAPTER_OBJECT_STORE], + "readonly", + ); + const objectStore = transaction.objectStore(IDB_FS_ADAPTER_OBJECT_STORE); + const handleRequest = objectStore.get(IDB_FS_ADAPTER_KEY); + handleRequest.onsuccess = () => { + const handle = handleRequest.result; + if (handle === undefined) { + resolve(); + } else { + assert( + handle instanceof FileSystemDirectoryHandle, + `Retrieved ${IDB_FS_ADAPTER_KEY} in ${IDB_FS_ADAPTER_OBJECT_STORE} in ${IDB_NAME} is not a FileSystemDirectoryHandle`, + ); + resolve(handle); + } + }; + transaction.onerror = () => { + console.error("Error in loading FileSystemDirectoryHandle transaction", { + err: transaction.error, + }); + reject(transaction.error); + }; + handleRequest.onerror = () => { + console.error("Error in FileSystemDirectoryHandle handleRequest", { + err: handleRequest.error, + }); + reject(handleRequest.error); + }; + }); +} + +export async function createAndStoreLocalAdapterInIndexedDB( + handle: FileSystemDirectoryHandle, +): Promise { + const db = await openIndexedDb(); + const transaction = db.transaction( + [IDB_FS_ADAPTER_OBJECT_STORE], + "readwrite", + ); + transaction + .objectStore(IDB_FS_ADAPTER_OBJECT_STORE) + .add(handle, IDB_FS_ADAPTER_KEY); + transaction.commit(); + return new Promise((resolve, reject) => { + transaction.oncomplete = () => { + resolve(handle); + }; + transaction.onerror = () => { + reject(transaction.error); + }; + }); +} + +export async function removeLocalAdapterFromIndexedDB() { + const db = await openIndexedDb(); + const transaction = db.transaction( + [IDB_FS_ADAPTER_OBJECT_STORE], + "readwrite", + ); + transaction + .objectStore(IDB_FS_ADAPTER_OBJECT_STORE) + .delete(IDB_FS_ADAPTER_KEY); + return new Promise((resolve, reject) => { + transaction.oncomplete = () => { + resolve(); + }; + transaction.onerror = () => { + reject(transaction.error); + }; + }); +} diff --git a/web-ide-main/components/src/stores/chip.store.test.ts b/web-ide-main/components/src/stores/chip.store.test.ts new file mode 100644 index 0000000..288bf1d --- /dev/null +++ b/web-ide-main/components/src/stores/chip.store.test.ts @@ -0,0 +1,164 @@ +import { + FileSystem, + ObjectFileSystemAdapter, +} from "@davidsouther/jiffies/lib/esm/fs.js"; +import { cleanState } from "@davidsouther/jiffies/lib/esm/scope/state.js"; +import * as not from "@nand2tetris/projects/project_01/01_not.js"; +import { produce } from "immer"; +import { MutableRefObject } from "react"; +import { ImmPin } from "src/pinout.js"; +import { ChipStoreDispatch, makeChipStore } from "./chip.store.js"; + +function testChipStore( + fs: Record = { + "projects/01/Not.hdl": not.hdl, + "projects/01/Not.tst": not.tst, + "projects/01/Not.cmp": not.cmp, + }, + storage: Record = {}, +) { + const dispatch: MutableRefObject = { current: jest.fn() }; + + const setStatus = jest.fn(); + + const { initialState, actions, reducers } = makeChipStore( + new FileSystem(new ObjectFileSystemAdapter(fs)), + setStatus, + storage, + dispatch, + false, + ); + const store = { state: initialState, actions, reducers, dispatch, setStatus }; + dispatch.current = jest.fn().mockImplementation( + // biome-ignore lint/suspicious/noExplicitAny: covariants are hard + (command: { action: keyof typeof reducers; payload: any }) => { + store.state = produce(store.state, (draft: typeof initialState) => { + reducers[command.action](draft, command.payload); + }); + }, + ); + + return store; +} + +describe("ChipStore", () => { + describe("initialization", () => { + it("loads chip", async () => { + const store = testChipStore({ + "projects/01/Not.hdl": not.hdl, + "projects/01/Not.tst": not.tst, + "projects/01/Not.cmp": not.cmp, + }); + + await store.actions.initialize(); + await store.actions.loadChip("projects/01/Not.hdl"); + + expect(store.state.controls.project).toBe("01"); + expect(store.state.controls.chipName).toBe("Not"); + expect(store.state.files.hdl).toBe(not.hdl); + expect(store.state.files.tst).toBe(not.tst); + expect(store.state.files.cmp).toBe(""); + expect(store.state.files.out).toBe(""); + }); + }); + + describe("behavior", () => { + const state = cleanState(async () => { + const store = testChipStore({ + "projects/01/Not.hdl": not.hdl, + "projects/01/Not.tst": not.tst, + "projects/01/Not.cmp": not.cmp, + }); + await store.actions.initialize(); + await store.actions.loadChip("projects/01/Not.hdl"); + return { store }; + }, beforeEach); + + it.todo("loads projects and chips"); + + it("toggles bits", async () => { + state.store.actions.toggle(state.store.state.sim.chip[0].in(), 0); + expect(state.store.state.sim.chip[0].in().busVoltage).toBe(1); + expect(state.store.dispatch.current).toHaveBeenCalledWith({ + action: "updateChip", + payload: { pending: true }, + }); + expect(state.store.state.sim.pending).toBe(true); + + state.store.actions.eval(); + expect(state.store.dispatch.current).toHaveBeenCalledWith({ + action: "updateChip", + payload: { pending: false }, + }); + expect(state.store.state.sim.pending).toBe(false); + expect(state.store.state.sim.chip[0].out().busVoltage).toBe(0); + }); + }); + + describe("execution", () => { + const state = cleanState(async () => { + const store = testChipStore({ + "projects/01/Not.hdl": not.hdl, + "projects/01/Not.tst": not.tst, + "projects/01/Not.cmp": not.cmp, + }); + await store.actions.initialize(); + await store.actions.loadChip("projects/01/Not.hdl"); + return { store }; + }, beforeEach); + + it.todo("compiles chips"); + + it("steps tests", async () => { + const bits = (pins: ImmPin[]) => + pins.map((pin) => pin.bits.map((bit) => bit[1])); + + expect(bits(state.store.state.sim.inPins)).toEqual([[0]]); + expect(bits(state.store.state.sim.outPins)).toEqual([[0]]); + + await state.store.actions.toggleBuiltin(); + + expect(bits(state.store.state.sim.inPins)).toEqual([[0]]); + expect(bits(state.store.state.sim.outPins)).toEqual([[1]]); + + await state.store.actions.stepTest(); // Load, Compare To and Output List + + await state.store.actions.stepTest(); // Set in 0 + expect(bits(state.store.state.sim.inPins)).toEqual([[0]]); + expect(bits(state.store.state.sim.outPins)).toEqual([[1]]); + + await state.store.actions.stepTest(); // Set in 1 + expect(bits(state.store.state.sim.inPins)).toEqual([[1]]); + expect(bits(state.store.state.sim.outPins)).toEqual([[0]]); + + await state.store.actions.stepTest(); // No change (after end) + expect(bits(state.store.state.sim.inPins)).toEqual([[1]]); + expect(bits(state.store.state.sim.outPins)).toEqual([[0]]); + }); + + it("starts the cursor on the first instruction", () => { + expect(state.store.state.files.tst).toBe(not.tst); + expect(state.store.state.controls.span).toEqual({ + start: 167, + end: 220, + line: 6, + }); + }); + + it("leaves the cursor on the final character", async () => { + // Not.tst has 3 commands + await state.store.actions.stepTest(); + await state.store.actions.stepTest(); + await state.store.actions.stepTest(); + + // Past the end of the test + await state.store.actions.stepTest(); + + expect(state.store.state.controls.span).toEqual({ + start: 269, + end: 270, + line: 16, + }); + }); + }); +}); diff --git a/web-ide-main/components/src/stores/chip.store.ts b/web-ide-main/components/src/stores/chip.store.ts new file mode 100644 index 0000000..9ae95d3 --- /dev/null +++ b/web-ide-main/components/src/stores/chip.store.ts @@ -0,0 +1,647 @@ +import { assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { display } from "@davidsouther/jiffies/lib/esm/display.js"; +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { Err, isErr, Ok } from "@davidsouther/jiffies/lib/esm/result.js"; +import { + BUILTIN_CHIP_PROJECTS, + CHIP_PROJECTS, + sortChips, +} from "@nand2tetris/projects/base.js"; +import { parse as parseChip } from "@nand2tetris/simulator/chip/builder.js"; +import { getBuiltinChip } from "@nand2tetris/simulator/chip/builtins/index.js"; +import { + Chip, + Low, + Pin, + Chip as SimChip, +} from "@nand2tetris/simulator/chip/chip.js"; +import { Clock } from "@nand2tetris/simulator/chip/clock.js"; +import { + CompilationError, + Span, +} from "@nand2tetris/simulator/languages/base.js"; +import { TST } from "@nand2tetris/simulator/languages/tst.js"; +import { ChipTest } from "@nand2tetris/simulator/test/chiptst.js"; +import { Action } from "@nand2tetris/simulator/types.js"; +import { Dispatch, MutableRefObject, useContext, useMemo, useRef } from "react"; +import { compare } from "../compare.js"; +import { sortFiles } from "../file_utils.js"; +import { ImmPin, reducePins } from "../pinout.js"; +import { useImmerReducer } from "../react.js"; +import { RunSpeed } from "../runbar.js"; +import { BaseContext, StatusSeverity } from "./base.context.js"; + +export const NO_SCREEN = "noScreen"; + +export const PROJECT_NAMES = [ + ["01", `Project 1`], + ["02", `Project 2`], + ["03", `Project 3`], + ["05", `Project 5`], +]; + +const TEST_NAMES: Record = { + CPU: ["CPU", "CPU-external"], + Computer: ["ComputerAdd", "ComputerMax", "ComputerRect"], +}; + +export function isBuiltinOnly( + project: keyof typeof CHIP_PROJECTS, + chipName: string, +) { + return BUILTIN_CHIP_PROJECTS[project].includes(chipName); +} + +function convertToBuiltin(name: string, hdl: string) { + return hdl.replace(/PARTS:([\s\S]*?)\}/, `PARTS:\n\tBUILTIN ${name};`); +} + +export interface ChipPageState { + title?: string; + files: Files; + sim: ChipSim; + controls: ControlsState; + config: ChipPageConfig; + dir?: string; +} + +export interface ChipPageConfig { + speed: RunSpeed; +} + +export interface ChipSim { + clocked: boolean; + inPins: ImmPin[]; + outPins: ImmPin[]; + internalPins: ImmPin[]; + chip: [Chip]; + pending: boolean; + invalid: boolean; +} + +export interface Files { + hdl: string; + cmp: string; + tst: string; + out: string; +} + +export interface ControlsState { + projects: string[]; + project: string; + chips: string[]; + chipName: string; + tests: string[]; + testName: string; + usingBuiltin: boolean; + runningTest: boolean; + span?: Span; + error?: CompilationError; + visualizationParameters: Set; +} + +export interface HDLFile { + name: string; + content: string; +} + +function reduceChip(chip: SimChip, pending = false, invalid = false): ChipSim { + return { + clocked: chip.clocked, + inPins: reducePins(chip.ins), + outPins: reducePins(chip.outs), + internalPins: reducePins(chip.pins), + chip: [chip], + pending, + invalid, + }; +} + +const clock = Clock.get(); + +export type ChipStoreDispatch = Dispatch<{ + action: keyof ReturnType["reducers"]; + payload?: unknown; +}>; + +export function makeChipStore( + fs: FileSystem, + setStatus: Action, + storage: Record, + dispatch: MutableRefObject, + upgraded: boolean, +) { + let _chipName = ""; + let _dir = ""; + let chip = new Low(); + let backupHdl = ""; + let tests: string[] = []; + let test = new ChipTest(); + let usingBuiltin = false; + let invalid = false; + + const reducers = { + setFiles( + state: ChipPageState, + { + hdl = state.files.hdl, + tst = state.files.tst, + cmp = state.files.cmp, + out = "", + }: { + hdl?: string; + tst?: string; + cmp?: string; + out?: string; + }, + ) { + state.files.hdl = hdl; + state.files.tst = tst; + state.files.cmp = cmp; + state.files.out = out; + }, + + updateChip( + state: ChipPageState, + payload?: { + pending?: boolean; + invalid?: boolean; + chipName?: string; + error?: CompilationError | undefined; + }, + ) { + state.sim = reduceChip( + chip, + payload?.pending ?? state.sim.pending, + payload?.invalid ?? state.sim.invalid, + ); + state.controls.error = state.sim.invalid + ? (payload?.error ?? state.controls.error) + : undefined; + }, + + setProjects(state: ChipPageState, projects: string[]) { + state.controls.projects = projects; + }, + + setProject(state: ChipPageState, project: keyof typeof CHIP_PROJECTS) { + state.controls.project = project; + }, + + setChips(state: ChipPageState, chips: string[]) { + state.controls.chips = chips; + }, + + setChip( + state: ChipPageState, + { chipName, dir }: { chipName: string; dir: string }, + ) { + _dir = dir; + _chipName = chipName; + state.controls.chipName = chipName; + state.title = `${chipName}.hdl`; + state.controls.tests = Array.from(tests); + state.dir = dir; + }, + + clearChip(state: ChipPageState) { + _chipName = ""; + state.controls.chipName = ""; + state.title = undefined; + state.controls.tests = []; + + this.setFiles(state, { hdl: "", tst: "", cmp: "", out: "" }); + }, + + setTest(state: ChipPageState, testName: string) { + state.controls.testName = testName; + }, + + setVisualizationParams(state: ChipPageState, params: Set) { + state.controls.visualizationParameters = new Set(params); + }, + + testRunning(state: ChipPageState) { + state.controls.runningTest = true; + }, + + testFinished(state: ChipPageState) { + state.controls.runningTest = false; + const passed = compare(state.files.cmp.trim(), state.files.out.trim()); + // For some reason, this is happening during a render but I can't track it down. + Promise.resolve().then(() => { + setStatus( + passed + ? { + message: `Simulation successful: The output file is identical to the compare file`, + severity: "SUCCESS", + } + : { + message: `Simulation error: The output file differs from the compare file`, + severity: "ERROR", + }, + ); + }); + }, + + updateTestStep(state: ChipPageState) { + state.files.out = test?.log() ?? ""; + if (test?.currentStep?.span) { + state.controls.span = test.currentStep.span; + } else { + if (test.done) { + const end = state.files.tst.length; + state.controls.span = { + start: end - 1, + end, + line: state.files.tst.split("\n").length, + }; + } + } + this.updateChip(state, { + pending: state.sim.pending, + invalid: state.sim.invalid, + }); + }, + + updateConfig(state: ChipPageState, config: Partial) { + state.config = { ...state.config, ...config }; + }, + + updateUsingBuiltin(state: ChipPageState) { + state.controls.usingBuiltin = usingBuiltin; + }, + + displayBuiltin(state: ChipPageState) { + backupHdl = state.files.hdl; + this.setFiles(state, { + hdl: convertToBuiltin(state.controls.chipName, state.files.hdl), + }); + }, + + toggleBuiltin(state: ChipPageState) { + state.controls.usingBuiltin = usingBuiltin; + if (usingBuiltin) { + this.displayBuiltin(state); + } else { + this.setFiles(state, { hdl: backupHdl }); + } + }, + }; + + const actions = { + async initialize() { + const projectsFolder = upgraded ? "/" : "/projects"; + + const entries = await fs.scandir(projectsFolder); + const hdlProjects = []; + + for (const project of entries.filter((project) => + project.isDirectory(), + )) { + const items = await fs.scandir(`${projectsFolder}/${project.name}`); + if (items.some((item) => item.isFile() && item.name.endsWith(".hdl"))) { + hdlProjects.push(project); + } + } + + const sortedNames = sortFiles(hdlProjects).map((project) => project.name); + + dispatch.current({ + action: "setProjects", + payload: sortedNames, + }); + + if (hdlProjects.length > 0) { + await actions.setProject(sortedNames[0]); + } else { + dispatch.current({ action: "setChips", payload: [] }); + } + + dispatch.current({ action: "clearChip" }); + }, + + reset() { + Clock.get().reset(); + chip.reset(); + test.reset(); + dispatch.current({ action: "setFiles", payload: {} }); + dispatch.current({ action: "updateChip" }); + }, + + async setProject(project: string) { + storage["/chip/project"] = project; + dispatch.current({ action: "setProject", payload: project }); + + const prefix = upgraded ? "/" : "/projects"; + + const chips = (await fs.scandir(`${prefix}/${project}`)) + .filter((entry) => entry.isFile() && entry.name.endsWith(".hdl")) + .map((file) => file.name.replace(".hdl", "")); + + const payload = sortChips(project, chips); + + dispatch.current({ action: "setChips", payload }); + + if (chips.length > 0) { + this.loadChip(`${prefix}/${project}/${chips[0]}.hdl`, true); + } + }, + + async loadChip(path: string, loadTests = true) { + dispatch.current({ action: "updateUsingBuiltin", payload: false }); + + const hdl = await fs.readFile(path); + + const parts = path.split("/"); + const name = assertExists(parts.pop()).replace(".hdl", ""); + const dir = parts.join("/"); + + await this.compileChip(hdl, dir, name); + + if (loadTests) { + await this.initializeTests(dir, name); + } + + dispatch.current({ + action: "setChip", + payload: { chipName: name, dir: dir }, + }); + dispatch.current({ action: "setFiles", payload: { hdl } }); + + if (usingBuiltin) { + this.loadBuiltin(); + dispatch.current({ action: "displayBuiltin" }); + } + }, + + async compileChip(hdl: string, dir?: string, name?: string) { + chip.remove(); + const maybeChip = await parseChip(hdl, dir, name, fs); + if (isErr(maybeChip)) { + const error = Err(maybeChip); + setStatus({ + message: Err(maybeChip).message, + severity: "ERROR", + }); + invalid = true; + dispatch.current({ + action: "updateChip", + payload: { invalid: true, error }, + }); + return; + } + this.replaceChip(Ok(maybeChip)); + }, + + replaceChip(nextChip: SimChip) { + // Store current inPins + const inPins = chip.ins; + for (const [pin, { busVoltage }] of inPins) { + const nextPin = nextChip.ins.get(pin); + if (nextPin) { + nextPin.busVoltage = busVoltage; + } + } + clock.reset(); + nextChip.eval(); + chip = nextChip; + chip.reset(); + dispatch.current({ action: "updateChip", payload: { invalid: false } }); + dispatch.current({ action: "updateTestStep" }); + }, + + async initializeTests(dir: string, chip: string) { + tests = TEST_NAMES[chip] ?? []; + this.loadTest(tests[0] ?? chip, dir); + }, + + async loadTest(name: string, dir?: string) { + if (!fs) return; + try { + dir ??= _dir; + + const tst = await fs.readFile(`${dir}/${name}.tst`); + + dispatch.current({ action: "setFiles", payload: { tst, cmp: "" } }); + dispatch.current({ action: "setTest", payload: name }); + this.compileTest(tst, dir); + } catch (e) { + setStatus({ + message: `Could not find ${name}.tst. Please load test file separately.`, + severity: "WARNING", + }); + console.error(e); + } + }, + + compileTest(file: string, path: string) { + if (!fs) return; + dispatch.current({ action: "setFiles", payload: { tst: file } }); + const tst = TST.parse(file); + if (isErr(tst)) { + setStatus({ + message: `Failed to parse test ${Err(tst).message}`, + severity: "ERROR", + }); + invalid = true; + return false; + } + const maybeTest = ChipTest.from(Ok(tst), { + dir: path, + setStatus: setStatus, + loadAction: async (file) => { + await this.loadChip(file, false); + return chip; + }, + compareTo: async (file) => { + const cmp = await fs.readFile(`${_dir}/${file}`); + dispatch.current({ action: "setFiles", payload: { cmp } }); + }, + }); + if (isErr(maybeTest)) { + invalid = true; + setStatus({ + message: Err(maybeTest).message, + severity: "ERROR", + }); + return false; + } else { + test = Ok(maybeTest).with(chip).reset(); + test.setFileSystem(fs); + dispatch.current({ action: "updateTestStep" }); + return true; + } + }, + + async updateFiles({ + hdl, + tst, + cmp, + tstPath, + }: { + hdl?: string; + tst?: string; + cmp: string; + tstPath?: string; + }) { + invalid = false; + dispatch.current({ action: "setFiles", payload: { hdl, tst, cmp } }); + try { + if (hdl) { + await this.compileChip(hdl, _dir, _chipName); + } + if (tst) { + this.compileTest(tst, tstPath ?? _dir); + } + } catch (e) { + setStatus({ + message: display(e), + severity: "ERROR", + }); + } + dispatch.current({ action: "updateChip", payload: { invalid: invalid } }); + if (!invalid) { + setStatus(`HDL code: No syntax errors`); + } + }, + + async saveChip(hdl: string) { + dispatch.current({ action: "setFiles", payload: { hdl } }); + const path = `${_dir}/${_chipName}.hdl`; + if (fs && path) { + await fs.writeFile(path, hdl); + } + }, + + toggle(pin: Pin, i: number | undefined) { + if (i !== undefined) { + pin.busVoltage = pin.busVoltage ^ (1 << i); + } else { + if (pin.width === 1) { + pin.toggle(); + } else { + pin.busVoltage += 1; + } + } + dispatch.current({ action: "updateChip", payload: { pending: true } }); + }, + + eval() { + chip.eval(); + dispatch.current({ action: "updateChip", payload: { pending: false } }); + }, + + clock() { + clock.toggle(); + if (clock.isLow) { + clock.frame(); + } + dispatch.current({ action: "updateChip" }); + }, + + async loadBuiltin() { + const builtinName = _chipName; + const nextChip = await getBuiltinChip(builtinName); + if (isErr(nextChip)) { + setStatus({ + message: `Failed to load builtin ${builtinName}: ${display(Err(nextChip))}`, + severity: "ERROR", + }); + return; + } + this.replaceChip(Ok(nextChip)); + }, + + async toggleBuiltin() { + usingBuiltin = !usingBuiltin; + dispatch.current({ action: "toggleBuiltin" }); + if (usingBuiltin) { + await this.loadBuiltin(); + } else { + await this.compileChip(backupHdl, _dir, _chipName); + } + }, + + tick(): Promise { + return this.stepTest(); + }, + + async stepTest(): Promise { + try { + const done = await test.step(); + dispatch.current({ action: "updateTestStep" }); + if (done) { + dispatch.current({ action: "testFinished" }); + } + return done; + } catch (e) { + setStatus({ + message: (e as Error).message, + severity: "ERROR", + }); + return true; + } + }, + + async getProjectFiles() { + console.log(_dir); + + return (await fs.scandir(_dir)) + .filter((entry) => entry.isFile() && entry.name.endsWith(".hdl")) + .map((entry) => ({ + name: entry.name, + content: fs.readFile(`${_dir}/${entry.name}`), + })); + }, + }; + + const initialState: ChipPageState = (() => { + const controls: ControlsState = { + projects: ["1", "2", "3", "5"], + project: "1", + chips: [], + chipName: "", + tests, + testName: "", + usingBuiltin: false, + runningTest: false, + error: undefined, + visualizationParameters: new Set(), + }; + + const sim = reduceChip(new Low()); + + return { + controls, + files: { + hdl: "", + cmp: "", + tst: "", + out: "", + backupHdl: "", + }, + sim, + config: { speed: 2 }, + }; + })(); + + return { initialState, reducers, actions }; +} + +export function useChipPageStore() { + const { fs, setStatus, storage, localFsRoot } = useContext(BaseContext); + + const dispatch = useRef(() => undefined); + + const { initialState, reducers, actions } = useMemo( + () => + makeChipStore(fs, setStatus, storage, dispatch, localFsRoot != undefined), + [fs, setStatus, storage, dispatch], + ); + + const [state, dispatcher] = useImmerReducer(reducers, initialState); + dispatch.current = dispatcher; + + return { state, dispatch, actions }; +} diff --git a/web-ide-main/components/src/stores/compiler.store.ts b/web-ide-main/components/src/stores/compiler.store.ts new file mode 100644 index 0000000..0ea6dd3 --- /dev/null +++ b/web-ide-main/components/src/stores/compiler.store.ts @@ -0,0 +1,175 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { compile } from "@nand2tetris/simulator/jack/compiler.js"; +import { CompilationError } from "@nand2tetris/simulator/languages/base.js"; +import { Action } from "@nand2tetris/simulator/types.js"; +import { Dispatch, MutableRefObject, useContext, useMemo, useRef } from "react"; +import { useImmerReducer } from "../react.js"; +import { BaseContext, StatusSeverity } from "./base.context.js"; + +export interface CompiledFile { + vm?: string; + valid: boolean; + error?: CompilationError; +} + +export interface CompilerPageState { + fs?: FileSystem; + files: Record; + compiled: Record; + isValid: boolean; + isCompiled: boolean; + selected: string; + title?: string; +} + +export type CompilerStoreDispatch = Dispatch<{ + action: keyof ReturnType["reducers"]; + payload?: unknown; +}>; + +function classTemplate(name: string) { + return `class ${name} {\n\n}\n`; +} + +export function makeCompilerStore( + setStatus: Action, + dispatch: MutableRefObject, +) { + let fs: FileSystem | undefined; + + const reducers = { + setFs(state: CompilerPageState, fs: FileSystem) { + state.fs = fs; + }, + reset(state: CompilerPageState) { + state.files = {}; + state.title = undefined; + }, + + setFile( + state: CompilerPageState, + { name, content }: { name: string; content: string }, + ) { + state.files[name] = content; + state.isCompiled = false; + this.compile(state); + }, + + // the keys of 'files' have to be the full file path, not basename + setFiles(state: CompilerPageState, files: Record) { + state.files = files; + state.isCompiled = false; + this.compile(state); + }, + + compile(state: CompilerPageState) { + const compiledFiles = compile(state.files); + state.compiled = {}; + for (const [name, compiled] of Object.entries(compiledFiles)) { + if (typeof compiled === "string") { + state.compiled[name] = { + valid: true, + vm: compiled, + }; + } else { + state.compiled[name] = { + valid: false, + error: compiled, + }; + } + } + state.isValid = Object.keys(state.files).every( + (file) => state.compiled[file].valid, + ); + }, + + writeCompiled(state: CompilerPageState) { + if (Object.values(state.compiled).every((compiled) => compiled.valid)) { + for (const [name, compiled] of Object.entries(state.compiled)) { + if (compiled.vm) { + fs?.writeFile(`${name}.vm`, compiled.vm); + } + } + } + state.isCompiled = true; + }, + + setSelected(state: CompilerPageState, selected: string) { + state.selected = selected; + }, + + setTitle(state: CompilerPageState, title: string) { + state.title = title; + }, + }; + + const actions = { + async loadProject(_fs: FileSystem, title: string) { + this.reset(); + fs = _fs; + dispatch.current({ action: "setFs", payload: fs }); + dispatch.current({ action: "setTitle", payload: title }); + + const files: Record = {}; + for (const file of (await fs.scandir("/")).filter( + (entry) => entry.isFile() && entry.name.endsWith(".jack"), + )) { + files[file.name.replace(".jack", "")] = await fs.readFile(file.name); + } + this.loadFiles(files); + }, + + async loadFiles(files: Record) { + dispatch.current({ action: "setFiles", payload: files }); + if (Object.entries(files).length > 0) { + dispatch.current({ + action: "setSelected", + payload: Object.keys(files)[0], + }); + } + }, + + async writeFile(name: string, content?: string) { + content ??= classTemplate(name); + dispatch.current({ action: "setFile", payload: { name, content } }); + if (fs) { + await fs.writeFile(`${name}.jack`, content); + } + }, + + async reset() { + fs = undefined; + dispatch.current({ action: "reset" }); + }, + + async compile() { + dispatch.current({ action: "writeCompiled" }); + }, + }; + + const initialState: CompilerPageState = { + files: {}, + compiled: {}, + selected: "", + isCompiled: false, + isValid: true, + }; + + return { initialState, reducers, actions }; +} + +export function useCompilerPageStore() { + const { setStatus } = useContext(BaseContext); + + const dispatch = useRef(() => undefined); + + const { initialState, reducers, actions } = useMemo( + () => makeCompilerStore(setStatus, dispatch), + [setStatus, dispatch], + ); + + const [state, dispatcher] = useImmerReducer(reducers, initialState); + dispatch.current = dispatcher; + + return { state, dispatch, actions }; +} diff --git a/web-ide-main/components/src/stores/cpu.store.ts b/web-ide-main/components/src/stores/cpu.store.ts new file mode 100644 index 0000000..bee9764 --- /dev/null +++ b/web-ide-main/components/src/stores/cpu.store.ts @@ -0,0 +1,355 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs"; +import { + Err, + isErr, + Ok, + unwrap, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import { + Format, + KeyboardAdapter, + MemoryAdapter, + MemoryKeyboard, + ROM, +} from "@nand2tetris/simulator/cpu/memory.js"; +import { Span } from "@nand2tetris/simulator/languages/base.js"; +import { TST } from "@nand2tetris/simulator/languages/tst.js"; +import { loadAsm, loadBlob, loadHack } from "@nand2tetris/simulator/loader.js"; +import { CPUTest } from "@nand2tetris/simulator/test/cputst.js"; +import { Action } from "@nand2tetris/simulator/types.js"; +import { Dispatch, MutableRefObject, useContext, useMemo, useRef } from "react"; +import { ScreenScales } from "src/chips/screen.js"; +import { RunSpeed } from "src/runbar.js"; +import { compare } from "../compare.js"; +import { loadTestFiles } from "../file_utils.js"; +import { useImmerReducer } from "../react.js"; +import { BaseContext, StatusSeverity } from "./base.context.js"; +import { ImmMemory } from "./imm_memory.js"; + +function makeTst() { + return `repeat { + ticktock; +}`; +} + +export interface CpuSim { + A: number; + D: number; + PC: number; + RAM: MemoryAdapter; + ROM: MemoryAdapter; + Screen: MemoryAdapter; + Keyboard: KeyboardAdapter; +} + +export interface CPUTestSim { + name: string; + tst: string; + cmp: string; + out: string; + highlight: Span | undefined; + valid: boolean; +} + +export interface CPUPageConfig { + romFormat: Format; + ramFormat: Format; + screenScale: ScreenScales; + speed: RunSpeed; + testSpeed: RunSpeed; +} + +export interface CpuPageState { + sim: CpuSim; + test: CPUTestSim; + path: string; + tests: string[]; + title?: string; + config: CPUPageConfig; +} + +function reduceCPUTest( + cpuTest: CPUTest, + dispatch: MutableRefObject, +): CpuSim { + const RAM = new ImmMemory(cpuTest.cpu.RAM, dispatch); + const ROM = new ImmMemory(cpuTest.cpu.ROM, dispatch); + const Screen = new ImmMemory(cpuTest.cpu.Screen, dispatch); + const Keyboard = new MemoryKeyboard(new ImmMemory(cpuTest.cpu.RAM, dispatch)); + + return { + A: cpuTest.cpu.A, + D: cpuTest.cpu.D, + PC: cpuTest.cpu.PC, + RAM, + ROM, + Screen, + Keyboard, + }; +} + +export type CpuStoreDispatch = Dispatch<{ + action: keyof ReturnType["reducers"]; + payload?: unknown; +}>; + +export function makeCpuStore( + fs: FileSystem, + setStatus: Action, + storage: Record, + dispatch: MutableRefObject, +) { + let test = new CPUTest(); + let animate = true; + let valid = true; + let path = ""; + let tests: string[] = []; + let tstName = ""; + let _title: string | undefined; + + const reducers = { + update(state: CpuPageState) { + state.sim = reduceCPUTest(test, dispatch); + state.test.highlight = test.currentStep?.span; + state.test.valid = valid; + state.path = path; + state.tests = Array.from(tests); + state.test.name = tstName; + }, + + setTest(state: CpuPageState, { tst, cmp }: { tst?: string; cmp?: string }) { + state.test.tst = tst ?? state.test.tst; + state.test.cmp = cmp ?? state.test.cmp; + state.test.out = ""; + }, + + testStep(state: CpuPageState) { + state.test.out = test.log(); + this.update(state); + }, + + testFinished(state: CpuPageState) { + if (state.test.cmp.trim() === "") { + return; + } + const passed = compare(state.test.cmp.trim(), test.log().trim()); + setStatus( + passed + ? { + message: `Simulation successful: The output file is identical to the compare file`, + severity: "SUCCESS", + } + : { + message: `Simulation error: The output file differs from the compare file`, + severity: "ERROR", + }, + ); + }, + + setTitle(state: CpuPageState, title?: string) { + _title = title; + state.title = title; + if (title) { + test.fileLoaded = true; + } + }, + + updateConfig(state: CpuPageState, config: Partial) { + state.config = { ...state.config, ...config }; + }, + }; + + const actions = { + tick() { + test.cpu.tick(); + }, + + setAnimate(value: boolean) { + animate = value; + }, + + async setPath(_path: string) { + path = _path; + + const dir = path.split("/").slice(0, -1).join("/"); + const files = await fs.scandir(dir); + tests = files + .filter((file) => file.name.endsWith(".tst")) + .map((file) => file.name); + + if (tests.length > 0) { + this.loadTest(tests[0]); + } else { + tstName = "Default"; + this.compileTest(makeTst(), ""); + } + + dispatch.current({ action: "update" }); + }, + + async testStep() { + try { + const done = await test.step(); + if (animate || done) { + dispatch.current({ action: "testStep" }); + } + if (done) { + dispatch.current({ action: "testFinished" }); + } + return done; + } catch (e) { + setStatus({ + message: (e as Error).message, + severity: "ERROR", + }); + return true; + } + }, + + resetRAM() { + test.cpu.RAM.loadBytes([]); + dispatch.current({ action: "update" }); + setStatus("Reset RAM"); + }, + + toggleUseTest() { + dispatch.current({ action: "update" }); + }, + + reset() { + test.reset(); + dispatch.current({ action: "update" }); + }, + + clear() { + this.replaceROM(new ROM()); + this.resetRAM(); + this.clearTest(); + this.reset(); + dispatch.current({ action: "setTitle", payload: undefined }); + }, + + clearTest() { + tstName = ""; + this.compileTest(makeTst(), ""); + dispatch.current({ action: "update" }); + }, + + replaceROM(rom: ROM) { + test = new CPUTest({ dir: path, rom }); + this.clearTest(); + }, + + compileTest(file: string, cmp?: string, _path?: string) { + const tstPath = _path ?? path; + dispatch.current({ action: "setTest", payload: { tst: file, cmp } }); + const tst = TST.parse(file); + + if (isErr(tst)) { + setStatus({ + message: `Failed to parse test - ${Err(tst).message}`, + severity: "ERROR", + }); + valid = false; + dispatch.current({ action: "update" }); + return false; + } + valid = true; + + const maybeTest = CPUTest.from(Ok(tst), { + dir: tstPath, + rom: test.cpu.ROM, + doEcho: setStatus, + doLoad: async (path) => { + let file; + try { + file = await fs.readFile(path); + } catch (_e) { + throw new Error(`Cannot find ${path}`); + } + const loader = path.endsWith("hack") + ? loadHack + : path.endsWith("asm") + ? loadAsm + : loadBlob; + const bytes = await loader(file); + console.log(bytes); + test.cpu.ROM.loadBytes(bytes); + }, + compareTo: async (file) => { + const dir = tstPath.split("/").slice(0, -1).join("/"); + const cmp = await fs.readFile(`${dir}/${file}`); + dispatch.current({ action: "setTest", payload: { cmp } }); + }, + requireLoad: false, + }); + + if (isErr(maybeTest)) { + setStatus({ + message: Err(maybeTest).message, + severity: "ERROR", + }); + return false; + } else { + test = Ok(maybeTest); + test.fileLoaded = _title != undefined; + dispatch.current({ action: "update" }); + return true; + } + }, + + async loadTest(name: string) { + const dir = path.split("/").slice(0, -1).join("/"); + const files = await loadTestFiles(fs, `${dir}/${name}`); + if (isErr(files)) { + setStatus({ + message: `Failed to load test`, + severity: "ERROR", + }); + return; + } + tstName = name; + const { tst } = unwrap(files); + this.compileTest(tst, ""); + }, + }; + + const initialState: CpuPageState = { + sim: reduceCPUTest(test, dispatch), + test: { + highlight: test.currentStep?.span, + name: "", + tst: makeTst(), + cmp: "", + out: "", + valid: true, + }, + path: "", + tests: [], + config: { + romFormat: "asm", + ramFormat: "dec", + screenScale: 1, + speed: 2, + testSpeed: 2, + }, + }; + + return { initialState, reducers, actions }; +} + +export function useCpuPageStore() { + const { fs, setStatus, storage } = useContext(BaseContext); + + const dispatch = useRef(() => undefined); + + const { initialState, reducers, actions } = useMemo( + () => makeCpuStore(fs, setStatus, storage, dispatch), + [fs, setStatus, storage, dispatch], + ); + + const [state, dispatcher] = useImmerReducer(reducers, initialState); + dispatch.current = dispatcher; + + return { state, dispatch, actions }; +} diff --git a/web-ide-main/components/src/stores/imm_memory.ts b/web-ide-main/components/src/stores/imm_memory.ts new file mode 100644 index 0000000..7a9c34c --- /dev/null +++ b/web-ide-main/components/src/stores/imm_memory.ts @@ -0,0 +1,20 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { MemoryAdapter, SubMemory } from "@nand2tetris/simulator/cpu/memory.js"; +import { MutableRefObject } from "react"; + +export class ImmMemory< + Action extends { action: "update" }, + Dispatch extends (a: Action) => void, +> extends SubMemory { + constructor( + parent: MemoryAdapter, + private dispatch: MutableRefObject, + ) { + super(parent, parent.size, 0); + } + + override async load(fs: FileSystem, path: string): Promise { + await super.load(fs, path); + this.dispatch.current({ action: "update" } as Action); + } +} diff --git a/web-ide-main/components/src/stores/vm.store.ts b/web-ide-main/components/src/stores/vm.store.ts new file mode 100644 index 0000000..3e94705 --- /dev/null +++ b/web-ide-main/components/src/stores/vm.store.ts @@ -0,0 +1,465 @@ +import { assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { + Err, + isErr, + Ok, + Result, + unwrap, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import { FIBONACCI } from "@nand2tetris/projects/base.js"; +import { + Format, + KeyboardAdapter, + MemoryAdapter, + MemoryKeyboard, +} from "@nand2tetris/simulator/cpu/memory.js"; +import { + CompilationError, + Span, +} from "@nand2tetris/simulator/languages/base.js"; +import { TST } from "@nand2tetris/simulator/languages/tst.js"; +import { VM, VmInstruction } from "@nand2tetris/simulator/languages/vm.js"; +import { VMTest, VmFile } from "@nand2tetris/simulator/test/vmtst.js"; +import { Action } from "@nand2tetris/simulator/types.js"; +import { Vm, VmFrame } from "@nand2tetris/simulator/vm/vm.js"; +import { Dispatch, MutableRefObject, useContext, useMemo, useRef } from "react"; +import { ScreenScales } from "../chips/screen.js"; +import { compare } from "../compare.js"; +import { useImmerReducer } from "../react.js"; +import { RunSpeed } from "../runbar.js"; +import { BaseContext, StatusSeverity } from "./base.context.js"; +import { ImmMemory } from "./imm_memory.js"; + +export const DEFAULT_TEST = "repeat {\n\tvmstep;\n}"; + +export interface VmSim { + RAM: MemoryAdapter; + Screen: MemoryAdapter; + Keyboard: KeyboardAdapter; + Stack: VmFrame[]; + Prog: VmInstruction[]; + Statics: number[]; + Temp: number[]; + AddedSysInit: boolean; + highlight: number; + showHighlight: boolean; +} + +export interface VMTestSim { + highlight: Span | undefined; +} + +export interface VmPageState { + vm: VmSim; + controls: ControlsState; + test: VMTestSim; + files: VMFiles; + title?: string; + config: VmPageConfig; +} + +export interface VmPageConfig { + ram1Format: Format; + ram2Format: Format; + screenScale: ScreenScales; + speed: RunSpeed; + testSpeed: RunSpeed; +} + +export interface ControlsState { + runningTest: boolean; + exitCode: number | undefined; + animate: boolean; + valid: boolean; + error?: CompilationError; +} + +export interface VMFiles { + vm: string; + tst: string; + cmp: string; + out: string; +} + +export type VmStoreDispatch = Dispatch<{ + action: keyof ReturnType["reducers"]; + payload?: unknown; +}>; + +function reduceVMTest( + vmTest: VMTest, + dispatch: MutableRefObject, + setStatus: Action, + showHighlight: boolean, +): VmSim { + const RAM = new ImmMemory(vmTest.vm.RAM, dispatch); + const Screen = new ImmMemory(vmTest.vm.Screen, dispatch); + const Keyboard = new MemoryKeyboard(new ImmMemory(vmTest.vm.RAM, dispatch)); + const highlight = vmTest.vm.derivedLine(); + + let stack: VmFrame[] = []; + try { + stack = vmTest.vm.vmStack().reverse(); + } catch (_e) { + dispatch.current({ + action: "setError", + payload: new Error("Runtime error: Invalid stack"), + }); + } + + return { + Keyboard, + RAM, + Screen, + Stack: stack, + Prog: vmTest.vm.program, + Statics: [ + ...vmTest.vm.memory.map((_, v) => v, 16, 16 + vmTest.vm.getStaticCount()), + ], + Temp: [...vmTest.vm.memory.map((_, v) => v, 5, 13)], + AddedSysInit: vmTest.vm.addedSysInit, + highlight, + showHighlight, + }; +} + +export function makeVmStore( + fs: FileSystem, + setStatus: Action, + storage: Record, + dispatch: MutableRefObject, +) { + const parsed = unwrap(VM.parse(FIBONACCI)); + let vm = unwrap(Vm.build(parsed.instructions)); + let test = new VMTest({ doEcho: setStatus }).with(vm); + let useTest = false; + let animate = true; + let vmSource = ""; + let showHighlight = true; + const reducers = { + setVm(state: VmPageState, vm: string) { + state.files.vm = vm; + }, + setTst(state: VmPageState, { tst }: { tst: string }) { + state.files.tst = tst; + }, + setCmp(state: VmPageState, { cmp }: { cmp: string }) { + state.files.cmp = cmp; + }, + setExitCode(state: VmPageState, code: number | undefined) { + state.controls.exitCode = code; + }, + setValid(state: VmPageState, valid: boolean) { + state.controls.valid = valid; + }, + setShowHighlight(state: VmPageState, value: boolean) { + state.vm.showHighlight = value; + }, + setError(state: VmPageState, error?: CompilationError) { + if (error) { + state.controls.valid = false; + setStatus({ + message: error?.message, + severity: "ERROR", + }); + } else { + state.controls.valid = true; + } + state.controls.error = error; + }, + update(state: VmPageState) { + state.vm = reduceVMTest(test, dispatch, setStatus, showHighlight); + state.test.highlight = test.currentStep?.span; + }, + setAnimate(state: VmPageState, value: boolean) { + state.controls.animate = value; + }, + testStep(state: VmPageState) { + state.files.out = test.log(); + }, + testFinished(state: VmPageState) { + const passed = compare(state.files.cmp.trim(), state.files.out); + setStatus( + passed + ? { + message: `Simulation successful: The output file is identical to the compare file`, + severity: "SUCCESS", + } + : { + message: `Simulation error: The output file differs from the compare file`, + severity: "ERROR", + }, + ); + }, + + setTitle(state: VmPageState, title: string) { + state.title = title; + }, + + updateConfig(state: VmPageState, config: Partial) { + state.config = { ...state.config, ...config }; + }, + }; + const initialState: VmPageState = { + vm: reduceVMTest(test, dispatch, setStatus, true), + controls: { + exitCode: undefined, + runningTest: false, + animate: true, + valid: true, + }, + test: { + highlight: undefined, + }, + files: { + vm: "", + tst: DEFAULT_TEST, + cmp: "", + out: "", + }, + config: { + ram1Format: "dec", + ram2Format: "dec", + screenScale: 1, + speed: 2, + testSpeed: 2, + }, + }; + const actions = { + async load(path: string) { + const files: VmFile[] = []; + let title: string; + + if ((await fs.stat(path)).isFile()) { + // single file + files.push({ + name: assertExists(path.split("/").pop()).replace(".vm", ""), + content: await fs.readFile(path), + }); + title = path.split("/").pop() ?? ""; + } else { + // folder + for (const file of (await fs.scandir(path)).filter( + (entry) => entry.isFile() && entry.name.endsWith(".vm"), + )) { + files.push({ + name: file.name.replace(".vm", ""), + content: await fs.readFile(`${path}/${file.name}`), + }); + } + title = `${path.split("/").pop()} / *.vm`; + } + dispatch.current({ action: "setTitle", payload: title }); + this.loadVm(files); + this.reset(); + setStatus(""); + }, + setVm(content: string) { + showHighlight = false; + dispatch.current({ + action: "setVm", + payload: content, + }); + if (vmSource == content) { + return; + } + vmSource = content; + + const parseResult = VM.parse(content); + + if (isErr(parseResult)) { + dispatch.current({ action: "setError", payload: Err(parseResult) }); + return false; + } + const instructions = unwrap(parseResult).instructions; + const buildResult = Vm.build(instructions); + return this.replaceVm(buildResult); + }, + loadVm(files: VmFile[]) { + showHighlight = false; + + const content = files.map((f) => f.content).join("\n"); + dispatch.current({ + action: "setVm", + payload: content, + }); + + if (vmSource == content) { + return; + } + vmSource = content; + + const parsed = []; + + let lineOffset = 0; + for (const file of files) { + const parseResult = VM.parse(file.content); + + if (isErr(parseResult)) { + dispatch.current({ action: "setError", payload: Err(parseResult) }); + return false; + } + const instructions = unwrap(parseResult).instructions; + + for (const instruction of instructions) { + if (instruction.span?.line != undefined) { + instruction.span.line += lineOffset; + } + } + lineOffset += file.content.split("\n").length; + + parsed.push({ + name: file.name, + instructions, + }); + } + const buildResult = Vm.buildFromFiles(parsed); + return this.replaceVm(buildResult); + }, + replaceVm(buildResult: Result) { + if (isErr(buildResult)) { + dispatch.current({ action: "setError", payload: Err(buildResult) }); + return false; + } + dispatch.current({ action: "setError" }); + // setStatus("Compiled VM code successfully"); + + vm = unwrap(buildResult); + test.vm = vm; + dispatch.current({ action: "update" }); + return true; + }, + + loadTest(path: string, source: string) { + dispatch.current({ action: "setTst", payload: { tst: source } }); + const tst = TST.parse(source); + + if (isErr(tst)) { + dispatch.current({ action: "setValid", payload: false }); + setStatus({ + message: `Failed to parse test`, + severity: "ERROR", + }); + return false; + } + dispatch.current({ action: "setValid", payload: true }); + setStatus(`Parsed tst`); + + vm.reset(); + + const maybeTest = VMTest.from(unwrap(tst), { + dir: path, + doLoad: async (path) => { + await this.load(path); + }, + doEcho: setStatus, + compareTo: async (file) => { + const dir = path.split("/").slice(0, -1).join("/"); + const cmp = await fs.readFile(`${dir}/${file}`); + dispatch.current({ action: "setCmp", payload: { cmp } }); + }, + }); + if (isErr(maybeTest)) { + setStatus({ + message: Err(maybeTest).message, + severity: "ERROR", + }); + return false; + } else { + test = Ok(maybeTest).using(fs); + test.vm = vm; + dispatch.current({ action: "update" }); + return true; + } + }, + setAnimate(value: boolean) { + animate = value; + dispatch.current({ action: "setAnimate", payload: value }); + }, + async testStep() { + showHighlight = true; + let done = false; + try { + done = await test.step(); + dispatch.current({ action: "testStep" }); + if (done) { + dispatch.current({ action: "testFinished" }); + } + if (animate) { + dispatch.current({ action: "update" }); + } + return done; + } catch (e) { + setStatus({ + message: `Runtime error: ${(e as Error).message}`, + severity: "ERROR", + }); + dispatch.current({ action: "setError", payload: e }); + return true; + } + }, + setPaused(paused = true) { + vm.setPaused(paused); + }, + step() { + showHighlight = true; + try { + let done = false; + + const exitCode = vm.step(); + if (exitCode !== undefined) { + done = true; + dispatch.current({ action: "setExitCode", payload: exitCode }); + } + + if (animate) { + dispatch.current({ action: "update" }); + } + + return done; + } catch (e) { + setStatus({ + message: `Runtime error: ${(e as Error).message}`, + severity: "ERROR", + }); + dispatch.current({ action: "setError", payload: e }); + return true; + } + }, + reset() { + showHighlight = true; + test.reset(); + vm.reset(); + dispatch.current({ action: "update" }); + dispatch.current({ action: "setExitCode", payload: undefined }); + dispatch.current({ action: "setValid", payload: true }); + }, + toggleUseTest() { + useTest = !useTest; + dispatch.current({ action: "update" }); + }, + initialize() { + dispatch.current({ action: "setTitle", payload: undefined }); + this.setVm(FIBONACCI); + }, + }; + + return { initialState, reducers, actions }; +} + +export function useVmPageStore() { + const { fs, setStatus, storage } = useContext(BaseContext); + + const dispatch = useRef(() => undefined); + + const { initialState, reducers, actions } = useMemo( + () => makeVmStore(fs, setStatus, storage, dispatch), + [fs, setStatus, storage, dispatch], + ); + + const [state, dispatcher] = useImmerReducer(reducers, initialState); + dispatch.current = dispatcher; + + return { state, dispatch, actions }; +} diff --git a/web-ide-main/components/src/table.tsx b/web-ide-main/components/src/table.tsx new file mode 100644 index 0000000..9492998 --- /dev/null +++ b/web-ide-main/components/src/table.tsx @@ -0,0 +1,73 @@ +import { rounded } from "@davidsouther/jiffies/lib/esm/dom/css/border.js"; +import { TranslatorSymbol } from "./stores/asm.store"; + +export const Table = ({ + values = [], + highlight = -1, + onClick, +}: { + values?: TranslatorSymbol[]; + highlight?: number; + onClick?: (id: string, value: string) => void; +}) => { + return ( +
+ {values.map((entry, i) => ( + onClick?.(entry.name, entry.value)} + /> + ))} +
+ ); +}; + +const TableRow = ({ + identifier, + value, + highlight = false, + onClick, +}: { + identifier: string; + value: string; + highlight?: boolean; + onClick?: () => void; +}) => { + return ( +
+ {identifier.length > 0 && ( + + {identifier} + + )} + {value.length > 0 && ( + + {value} + + )} +
+ ); +}; diff --git a/web-ide-main/components/src/timer.tsx b/web-ide-main/components/src/timer.tsx new file mode 100644 index 0000000..0e04a8c --- /dev/null +++ b/web-ide-main/components/src/timer.tsx @@ -0,0 +1,82 @@ +import { Timer } from "@nand2tetris/simulator/timer.js"; +import { useImmerReducer } from "./react.js"; + +export interface TimerStoreState { + steps: number; + speed: number; + running: boolean; +} + +import { Dispatch, MutableRefObject, useMemo, useRef } from "react"; +export type TimerStoreDispatch = Dispatch<{ + action: keyof ReturnType["reducers"]; + payload?: unknown; +}>; + +const makeTimerStore = ( + timer: Timer, + dispatch: MutableRefObject, +) => { + const initialState: TimerStoreState = { + running: timer.running, + speed: timer.speed, + steps: timer.steps, + }; + + const finishFrame = timer.finishFrame.bind(timer); + timer.finishFrame = function () { + finishFrame(); + dispatch.current({ action: "update" }); + }; + + const reducers = { + update(state: TimerStoreState) { + state.running = timer.running; + state.speed = timer.speed; + state.steps = timer.steps; + }, + setSteps(state: TimerStoreState, steps: number) { + state.steps = steps; + timer.steps = steps; + }, + setSpeed(state: TimerStoreState, speed: number) { + state.speed = speed; + timer.speed = speed; + }, + }; + + const actions = { + frame() { + timer.frame(); + }, + start() { + timer.start(); + dispatch.current({ action: "update" }); + }, + stop() { + timer.stop(); + dispatch.current({ action: "update" }); + }, + reset() { + timer.reset(); + dispatch.current({ action: "update" }); + }, + }; + + return { initialState, reducers, actions }; +}; + +export function useTimer(timer: Timer) { + const dispatch = useRef(() => undefined); + + const { initialState, reducers, actions } = useMemo( + () => makeTimerStore(timer, dispatch), + [timer, dispatch], + ); + + const [state, dispatcher] = useImmerReducer(reducers, initialState); + + dispatch.current = dispatcher; + + return { state, dispatch: dispatch.current, actions }; +} diff --git a/web-ide-main/components/src/virtual_scroll.test.tsx b/web-ide-main/components/src/virtual_scroll.test.tsx new file mode 100644 index 0000000..dc8b4ff --- /dev/null +++ b/web-ide-main/components/src/virtual_scroll.test.tsx @@ -0,0 +1,18 @@ +import { render, screen } from "@testing-library/react"; +import VirtualScroll, { arrayAdapter } from "./virtual_scroll.js"; + +describe("", () => { + it("initializes & renders", () => { + render( + + settings={{ maxIndex: 3 }} + get={arrayAdapter([1, 2, 3])} + row={(i) =>
{i}
} + rowKey={(i) => i} + />, + ); + + const two = screen.getByText("2"); + expect(two).toBeVisible(); + }); +}); diff --git a/web-ide-main/components/src/virtual_scroll.tsx b/web-ide-main/components/src/virtual_scroll.tsx new file mode 100644 index 0000000..f36ef56 --- /dev/null +++ b/web-ide-main/components/src/virtual_scroll.tsx @@ -0,0 +1,216 @@ +/* eslint-disable @typescript-eslint/ban-types */ +import { + Key, + ReactNode, + useCallback, + useEffect, + useMemo, + useReducer, + useRef, +} from "react"; + +export interface VirtualScrollSettings { + /**Minimum offset into the adapter. Default is 0. */ + minIndex: number; + /** Maximum offset into the adapter. Default is Number.MAX_SAFE_INTEGER. */ + maxIndex: number; + /** Initial index to start rendering from. Default is minIndex. */ + startIndex: number; + /** + * Number of items to render in visible area. Default is entire range from + * minIndex to maxIndex. + */ + count: number; + /** + * Maximum number of items to render on either side of the visible area. + * Default is `count`. + */ + tolerance: number; + /** Height of each item, in pixels. Default is 20px. */ + itemHeight: number; +} + +export interface VirtualScrollDataAdapter { + (offset: number, limit: number): Iterable; +} + +export function arrayAdapter(data: T[]): VirtualScrollDataAdapter { + return (offset, limit) => data.slice(offset, offset + limit); +} + +export interface VirtualScrollProps { + settings?: Partial; + get: VirtualScrollDataAdapter; + row: (t: T) => U; + rowKey: (t: T) => Key; +} + +export function fillVirtualScrollSettings( + settings: Partial, +): VirtualScrollSettings { + const { + minIndex = 0, + maxIndex = Number.MAX_SAFE_INTEGER, + startIndex = 0, + itemHeight = 20, + count = Math.max(maxIndex - minIndex, 1), + tolerance = count, + } = settings; + + return { minIndex, maxIndex, startIndex, itemHeight, count, tolerance }; +} + +export function initialState( + settings: VirtualScrollSettings, + adapter: VirtualScrollDataAdapter, +): VirtualScrollState { + // From Denis Hilt, https://blog.logrocket.com/virtual-scrolling-core-principles-and-basic-implementation-in-react/ + const { minIndex, maxIndex, startIndex, itemHeight, count, tolerance } = + settings; + const bufferedItems = count + 2 * tolerance; + const itemsAbove = Math.max(0, startIndex - tolerance - minIndex); + + const viewportHeight = count * itemHeight; + const totalHeight = Math.max(maxIndex - minIndex, 1) * itemHeight; + const toleranceHeight = tolerance * itemHeight; + const bufferHeight = viewportHeight + 2 * toleranceHeight; + const topPaddingHeight = itemsAbove * itemHeight; + const bottomPaddingHeight = totalHeight - (topPaddingHeight + bufferHeight); + + const state: VirtualScrollState = { + scrollTop: 0, + settings, + viewportHeight, + totalHeight, + toleranceHeight, + bufferedItems, + topPaddingHeight, + bottomPaddingHeight, + data: [], + }; + + return { + ...state, + ...doScroll(topPaddingHeight + toleranceHeight, state, adapter), + }; +} + +export function getData( + minIndex: number, + maxIndex: number, + offset: number, + limit: number, + get: VirtualScrollDataAdapter, +): T[] { + const start = Math.max(0, minIndex, offset); + const end = Math.min(maxIndex, offset + limit - 1); + const data = get(start, end - start); + return [...data]; +} + +interface ScrollUpdate { + scrollTop: number; + topPaddingHeight: number; + bottomPaddingHeight: number; + data: T[]; +} + +export function doScroll( + scrollTop: number, + state: VirtualScrollState, + get: VirtualScrollDataAdapter, +): ScrollUpdate { + const { + totalHeight, + toleranceHeight, + bufferedItems, + settings: { itemHeight, minIndex, maxIndex }, + } = state; + const index = + minIndex + Math.floor((scrollTop - toleranceHeight) / itemHeight); + const data = getData(minIndex, maxIndex, index, bufferedItems, get); + const topPaddingHeight = Math.max((index - minIndex) * itemHeight, 0); + const bottomPaddingHeight = Math.max( + totalHeight - (topPaddingHeight + data.length * itemHeight), + 0, + ); + + return { scrollTop, topPaddingHeight, bottomPaddingHeight, data }; +} + +interface VirtualScrollState { + settings: VirtualScrollSettings; + scrollTop: number; // px + bufferedItems: number; // count + totalHeight: number; // px + viewportHeight: number; // px + topPaddingHeight: number; // px + bottomPaddingHeight: number; // px + toleranceHeight: number; // px + data: T[]; +} + +const scrollReducer = + (get: VirtualScrollDataAdapter) => + (state: VirtualScrollState, scrollTop: number) => ({ + ...state, + ...doScroll(scrollTop, state, get), + }); + +export const VirtualScroll = ( + props: VirtualScrollProps & { className?: string }, +) => { + const viewportRef = useRef(null); + + const { settings, startState, reducer } = useMemo(() => { + const settings = fillVirtualScrollSettings(props.settings ?? {}); + const startState = initialState(settings, props.get); + const reducer = scrollReducer(props.get); + return { settings, reducer, startState }; + }, [props.settings, props.get]); + + const [state, dispatchScroll] = useReducer(reducer, startState); + + useEffect(() => { + if (viewportRef.current !== null) { + dispatchScroll(viewportRef.current.scrollTop); + } + }, [settings, props.row]); + + const initialScroll = useCallback( + (div: HTMLDivElement | null) => { + if (div) { + div.scrollTop = viewportRef.current + ? viewportRef.current.scrollTop + : settings.startIndex * settings.itemHeight; + } + viewportRef.current = div; + }, + [viewportRef, settings.startIndex, settings.itemHeight], + ); + + const rows = state.data.map((d) => ( +
+ {props.row(d)} +
+ )); + + return ( +
dispatchScroll((e.target as HTMLDivElement).scrollTop)} + > +
+ {rows} +
+
+ ); +}; + +export default VirtualScroll; diff --git a/web-ide-main/components/tsconfig.json b/web-ide-main/components/tsconfig.json new file mode 100644 index 0000000..ca2da56 --- /dev/null +++ b/web-ide-main/components/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "outDir": "build", + "rootDir": "src", + "tsBuildInfoFile": "build/.tsbuildinfo" + + }, + "include": ["src"] +} diff --git a/web-ide-main/extension/.gitignore b/web-ide-main/extension/.gitignore new file mode 100644 index 0000000..27a1f10 --- /dev/null +++ b/web-ide-main/extension/.gitignore @@ -0,0 +1 @@ +*.vsix diff --git a/web-ide-main/extension/.vscodeignore b/web-ide-main/extension/.vscodeignore new file mode 100644 index 0000000..7605caf --- /dev/null +++ b/web-ide-main/extension/.vscodeignore @@ -0,0 +1,12 @@ +.. +build +node_modules +src +tsconfig* +views +!out +out/**/*.map +!fileicons +!languages +!LICENSE +!package.json diff --git a/web-ide-main/extension/LICENSE b/web-ide-main/extension/LICENSE new file mode 100644 index 0000000..d3a73b1 --- /dev/null +++ b/web-ide-main/extension/LICENSE @@ -0,0 +1,12 @@ +MIT License + +Copyright 2022 David Souther et al + +This software is based on Stefano Volpe's 'Nand2Tetris Tools'. Please check [here](https://github.com/foxyseta/nand-ide/blob/master/LICENSE) for further information. +This software is based on Aviv Yaish's 'NAND IDE'. Please check [here](https://github.com/AvivYaish/nand-ide/blob/master/LICENSE) for further information. + +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. diff --git a/web-ide-main/extension/README.md b/web-ide-main/extension/README.md new file mode 100644 index 0000000..25916cf --- /dev/null +++ b/web-ide-main/extension/README.md @@ -0,0 +1,19 @@ +# NAND2Tetris VSCode Extension + +This extension adds a NAND2Tetris side panel to VSCode. + +The side panel allows interacting with .HDl files and chips. + +## Developing the extension + +1. Open this project in VSCode. +2. Select "Run Extension" from the "Run and Debug" panel +3. Click "Run" or press F5. +4. In the debug VSCode window, open the [Project Files](https://github.com/nand2tetris/projects). +5. Open an HDL file, for instance, demo/Xor.hdl +6. The NAND2TETRIS: HDL CHIP view should be open in the side panel. + - If it is not, try `NAND2Tetris: Focus on HDL Chip View` in the command pallette. + +## References + +- [Your first extension](https://code.visualstudio.com/api/get-started/your-first-extension) diff --git a/web-ide-main/extension/fileicons/icon-theme.json b/web-ide-main/extension/fileicons/icon-theme.json new file mode 100644 index 0000000..cf2df4f --- /dev/null +++ b/web-ide-main/extension/fileicons/icon-theme.json @@ -0,0 +1,42 @@ +{ + "iconDefinitions": { + "_hdl": { + "iconPath": "./images/hdl.svg" + }, + "_tst": { + "iconPath": "./images/tst.svg" + }, + "_cmp-out": { + "iconPath": "./images/cmp-out.svg" + }, + "_hack": { + "iconPath": "./images/hack.svg" + }, + "_vm": { + "iconPath": "./images/vm.svg" + }, + "_jack": { + "iconPath": "./images/jack.svg" + } + }, + "fileExtensions": { + "hdl": "_hdl", + "tst": "_tst", + "cmp": "_cmp-out", + "out": "_cmp-out", + "asm": "_asm", + "hack": "_hack", + "vm": "_vm", + "jack": "_jack" + }, + "languageIds": { + "hdl": "_hdl", + "tst": "_tst", + "cmp": "_cmp-out", + "out": "_cmp-out", + "asm": "_asm", + "hack": "_hack", + "vm": "_vm", + "jack": "_jack" + } +} diff --git a/web-ide-main/extension/fileicons/images/cmp-out.svg b/web-ide-main/extension/fileicons/images/cmp-out.svg new file mode 100644 index 0000000..4cc3c79 --- /dev/null +++ b/web-ide-main/extension/fileicons/images/cmp-out.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/web-ide-main/extension/fileicons/images/hack.svg b/web-ide-main/extension/fileicons/images/hack.svg new file mode 100644 index 0000000..5b234f3 --- /dev/null +++ b/web-ide-main/extension/fileicons/images/hack.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/web-ide-main/extension/fileicons/images/hdl.svg b/web-ide-main/extension/fileicons/images/hdl.svg new file mode 100644 index 0000000..02d57eb --- /dev/null +++ b/web-ide-main/extension/fileicons/images/hdl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/web-ide-main/extension/fileicons/images/jack.svg b/web-ide-main/extension/fileicons/images/jack.svg new file mode 100644 index 0000000..f987d52 --- /dev/null +++ b/web-ide-main/extension/fileicons/images/jack.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/web-ide-main/extension/fileicons/images/tst.svg b/web-ide-main/extension/fileicons/images/tst.svg new file mode 100644 index 0000000..199090e --- /dev/null +++ b/web-ide-main/extension/fileicons/images/tst.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/web-ide-main/extension/fileicons/images/vm.svg b/web-ide-main/extension/fileicons/images/vm.svg new file mode 100644 index 0000000..7dd96aa --- /dev/null +++ b/web-ide-main/extension/fileicons/images/vm.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/web-ide-main/extension/fileicons/logo.svg b/web-ide-main/extension/fileicons/logo.svg new file mode 100644 index 0000000..cee1b79 --- /dev/null +++ b/web-ide-main/extension/fileicons/logo.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/web-ide-main/extension/languages/asm.snippets.json.code-snippets b/web-ide-main/extension/languages/asm.snippets.json.code-snippets new file mode 100644 index 0000000..a87a6c7 --- /dev/null +++ b/web-ide-main/extension/languages/asm.snippets.json.code-snippets @@ -0,0 +1,57 @@ +{ + "If-then Statement": { + "prefix": [ + "if", + "then", + "condition" + ], + "body": [ + "\t${1:$LINE_COMMENT D = condition}", + "\t@${2:IF_END}", + "\tD;JEQ", + "\t${0:$LINE_COMMENT code}", + "(${2:IF_END})" + ], + "description": "An if-then statement." + }, + "If-then-else Statement": { + "prefix": [ + "if", + "then", + "else", + "elif", + "condition" + ], + "body": [ + "\t${1:$LINE_COMMENT D = condition}", + "\t@${2:IF_ELSE}", + "\tD;JEQ", + "\t${4:$LINE_COMMENT code}", + "\t@${3:IF_END}", + "\t0;JMP", + "(${2:IF_ELSE})", + "\t${0:$LINE_COMMENT code}", + "(${3:IF_END})" + ], + "description": "An if-then-else statement." + }, + "While Loop": { + "prefix": [ + "repeat", + "loop", + "for", + "while" + ], + "body": [ + "(${1:LOOP})", + "\t${2:$LINE_COMMENT D = condition}", + "\t@${3:LOOP_END}", + "\tD;JEQ", + "\t${0:$LINE_COMMENT code}", + "\t@${1:LOOP}", + "\t0;JMP", + "(${3:LOOP_END})" + ], + "description": "A while loop." + } +} \ No newline at end of file diff --git a/web-ide-main/extension/languages/asm.tmLanguage.json b/web-ide-main/extension/languages/asm.tmLanguage.json new file mode 100644 index 0000000..596654f --- /dev/null +++ b/web-ide-main/extension/languages/asm.tmLanguage.json @@ -0,0 +1,111 @@ +{ + "fileTypes": [ + "asm" + ], + "name": "Hack Assembly Language", + "patterns": [ + { + "include": "#declaration" + }, + { + "include": "#A-instruction" + }, + { + "include": "#destination" + }, + { + "include": "#boolean" + }, + { + "include": "#jump" + }, + { + "include": "#comment" + } + ], + "repository": { + "declaration": { + "patterns": [ + { + "comment": "Label declaration", + "match": "\\(([^ \\/]*)\\)", + "name": "storage.type", + "captures": { + "1": { + "patterns": [ + { + "comment": "Label", + "match": "[a-zA-Z\\_\\.\\$\\:]+[a-zA-Z\\_\\.\\$\\:\\d]*", + "name": "variable.other" + } + ] + } + } + } + ] + }, + "A-instruction": { + "patterns": [ + { + "comment": "@XXX instruction", + "match": "\\@([^ \\/]*)", + "name": "keyword.operator", + "captures": { + "1": { + "patterns": [ + { + "match": "R10|R11|R12|R13|R14|R15|R0|R1|R2|R3|R4|R5|R6|R7|R8|R9|SP|LCL|ARG|THIS|THAT|SCREEN|KBD", + "name": "variable.language" + }, + { + "comment": "A-instruction string argument", + "match": "[a-zA-Z\\_\\.\\$\\:]+[a-zA-Z\\_\\.\\$\\:\\d]*", + "name": "variable.other" + }, + { + "match": "\\d+", + "name": "constant.numeric" + } + ] + } + } + } + ] + }, + "destination": { + "patterns": [ + { + "comment": "Left-hand side", + "match": "null|M|D|A|MD|AM|AD|AMD", + "name": "variable.language" + } + ] + }, + "jump": { + "patterns": [ + { + "comment": "Jump type", + "match": "JGT|JLE|JEQ|JLT|JNE|JMP|JGE", + "name": "keyword.control" + } + ] + }, + "comment": { + "patterns": [ + { + "comment": "Inline comment", + "begin": "\\/\\/", + "end": "\\n", + "name": "comment.line.double-slash" + }, + { + "comment": "Multiline comment", + "begin": "\\/\\*", + "end": "\\*\\/", + "name": "comment.block" + } + ] + } + }, + "scopeName": "source.asm" +} \ No newline at end of file diff --git a/web-ide-main/extension/languages/cmp-out.tmLanguage.json b/web-ide-main/extension/languages/cmp-out.tmLanguage.json new file mode 100644 index 0000000..908b3fe --- /dev/null +++ b/web-ide-main/extension/languages/cmp-out.tmLanguage.json @@ -0,0 +1,60 @@ +{ + "fileTypes": [ + "cmp", + "out" + ], + "name": "CMP/OUT", + "patterns": [ + { + "include": "#border" + }, + { + "include": "#variable" + }, + { + "include": "#value" + }, + { + "include": "#placeholder" + } + ], + "repository": { + "border": { + "patterns": [ + { + "comment": "Vertical table border", + "name": "keyword.operator", + "match": "\\|" + } + ] + }, + "variable": { + "patterns": [ + { + "comment": "The variable identifier (table header)", + "name": "support.variable", + "match": "[a-zA-Z]+" + } + ] + }, + "value": { + "patterns": [ + { + "comment": "The value of a certain variable at a given time", + "name": "constant.numeric", + "match": "-*\\d+\\+*" + } + ] + }, + "placeholder": { + "patterns": [ + { + "comment": "List of wildcard characters", + "name": "constant.language", + "match": "\\*+" + } + ] + } + }, + "scopeName": "source.cmp" +} \ No newline at end of file diff --git a/web-ide-main/extension/languages/hack.tmLanguage.json b/web-ide-main/extension/languages/hack.tmLanguage.json new file mode 100644 index 0000000..556a0fa --- /dev/null +++ b/web-ide-main/extension/languages/hack.tmLanguage.json @@ -0,0 +1,59 @@ +{ + "fileTypes": ["hack"], + "name": "Hack Machine Language", + "patterns": [ + { + "include": "#a" + }, + { + "include": "#c" + } + ], + "repository": { + "a": { + "patterns": [ + { + "comment": "0-value", + "begin": "\\b0", + "end": "\\b", + "name": "comment", + "patterns": [ + { + "comment": "value", + "match": "[01]{15}\\b", + "name": "constant.numeric" + } + ] + } + ] + }, + "c": { + "patterns": [ + { + "comment": "1-??-a-comp-dest-jump", + "match": "\\b1[01]{2}([01]{1})([01]{6})([01]{3})([01]{3})\\b", + "name": "comment", + "captures": { + "1": { + "comment": "control", + "name": "keyword.control" + }, + "2": { + "comment": "op", + "name": "keyword.operarator" + }, + "3": { + "comment": "dest", + "name": "variable.language" + }, + "4": { + "comment": "jump", + "name": "keyword.control" + } + } + } + ] + } + }, + "scopeName": "source.hack" +} diff --git a/web-ide-main/extension/languages/hdl.snippets.json.code-snippets b/web-ide-main/extension/languages/hdl.snippets.json.code-snippets new file mode 100644 index 0000000..5e5a912 --- /dev/null +++ b/web-ide-main/extension/languages/hdl.snippets.json.code-snippets @@ -0,0 +1,264 @@ +{ + "CHIP Class": { + "body": [ + "CHIP $1 {", + " IN $2;", + " OUT $3;", + "", + " PARTS:", + " $4", + "}" + ], + "description": "Create CHIP class.\n", + "prefix": "CHIP" + }, + "Chip Add16": { + "body": [ + "Add16(a=$1, b=$2, out=$3);" + ], + "description": [ + "* Adds two 16-bit values.\n* The most significant carry bit is ignored.\n" + ], + "prefix": "Add16" + }, + "Chip ALU": { + "body": [ + "ALU(x=$1, y=$2, zx=$3, nx=$4, zy=$5, ny=$6, f=$7, no=$8, out=$9, zr=$10, ng=$11);" + ], + "description": [ + "* the ALU manipulates the x and y.\n" + ], + "prefix": "ALU" + }, + "Chip And": { + "body": [ + "And(a=$1, b=$2, out=$3);" + ], + "description": "* And gate:\n* out = 1 if (a == 1 and b == 1)\n* 0 otherwise\n", + "prefix": "And" + }, + "Chip And16": { + "body": [ + "And16(a=$1, b=$2, out=$3);" + ], + "description": "* 16-bit bitwise And:\n* for i = 0..15: out[i] = (a[i] and b[i])\n", + "prefix": "And16" + }, + "Chip ARegister": { + "body": [ + "ARegister(in=$1, load=$2, out=$3);" + ], + "description": "* A 16-Bit register called \"A Register\"\n", + "prefix": "ARegister" + }, + "Chip Bit": { + "body": [ + "Bit(in=$1, load=$2, out=$3);" + ], + "description": "* 1-bit register:\n* If load[t] == 1 then out[t+1] = in[t]\n* else out does not change (out[t+1] = out[t])\n", + "prefix": "Bit" + }, + "Chip DFF": { + "body": [ + "DFF(in=$1, out=$2);" + ], + "description": "* Data Flip-flop:\n* out(t) = in(t-1)\n* where t is the current time unit, or clock cycle.\n", + "prefix": "DFF" + }, + "Chip DMux": { + "body": [ + "DMux(in=$1, sel=$2, a=$3, b=$4);" + ], + "description": "* Demultiplexor:\n* {a, b} = {in, 0} if sel == 0\n* {0, in} if sel == 1\n", + "prefix": "DMux" + }, + "Chip DMux4Way": { + "body": [ + "DMux4Way(in=$1, sel=$2, a=$3, b=$4, c=$5, d=$6);" + ], + "description": "* 4-way demultiplexor:\n* {a, b, c, d} = {in, 0, 0, 0} if sel == 00\n* {0, in, 0, 0} if sel == 01\n* {0, 0, in, 0} if sel == 10\n* {0, 0, 0, in} if sel == 11\n", + "prefix": "DMux4Way" + }, + "Chip DMux8Way": { + "body": [ + "DMux8Way(in=$1, sel=$2, a=$3, b=$4, c=$5, d=$6, e=$7, f=$8, g=$9, h=$10);" + ], + "description": "* 8-way demultiplexor:\n* {a, b, c, d, e, f, g, h} = {in, 0, 0, 0, 0, 0, 0, 0} if sel == 000\n* {0, in, 0, 0, 0, 0, 0, 0} if sel == 001\n* etc.\n* {0, 0, 0, 0, 0, 0, 0, in} if sel == 111\n", + "prefix": "DMux8Way" + }, + "Chip DRegister": { + "body": [ + "DRegister(in=$1, load=$2, out=$3);" + ], + "description": "* A 16-Bit register called \"D Register\"\n", + "prefix": "DRegister" + }, + "Chip FullAdder": { + "body": [ + "FullAdder(a=$1, b=$2, c=$3, sum=$4, carry=$5);" + ], + "description": "* Full adder:\n* Computes sum, the least significant bit of a + b + c, and carry, the most significant bit of a + b + c.\n", + "prefix": "FullAdder" + }, + "Chip HalfAdder": { + "body": [ + "HalfAdder(a=$1, b=$2, sum=$3, carry=$4);" + ], + "description": "* Half adder:\n* Computes sum, the least significnat bit of a + b, and carry, the most significnat bit of a + b.\n", + "prefix": "HalfAdder" + }, + "Chip Inc16": { + "body": [ + "Inc16(in=$1, out=$2);" + ], + "description": "* 16-bit incrementer:\n* out = in + 1 (arithmetic addition)\n", + "prefix": "Inc16" + }, + "Chip Keyboard": { + "body": [ + "Keyboard(out=$1);" + ], + "description": "* The keyboard (memory map).\n* Outputs the code of the currently pressed key\n", + "prefix": "Keyboard" + }, + "Chip Mux": { + "body": [ + "Mux(a=$1, b=$2, sel=$3, out=$4);" + ], + "description": "* Multiplexor:\n* If sel == 1 then out = b else out = a.\n", + "prefix": "Mux" + }, + "Chip Mux16": { + "body": [ + "Mux16(a=$1, b=$2, sel=$3, out=$4);" + ], + "description": "* 16-bit multiplexor:\n* for i = 0..15 out[i] = a[i] if sel == 0\n* b[i] if sel == 1\n", + "prefix": "Mux16" + }, + "Chip Mux4Way16": { + "body": [ + "Mux4Way16(a=$1, b=$2, c=$3, d=$4, sel=$5, out=$6);" + ], + "description": "* 4-way 16-bit multiplexor:\n* out = a if sel == 00\n* b if sel == 01\n* c if sel == 10\n* d if sel == 11\n", + "prefix": "Mux4Way16" + }, + "Chip Mux8Way16": { + "body": [ + "Mux8Way16(a=$1, b=$2, c=$3, d=$4, e=$5, f=$6, g=$7, h=$8, sel=$9, out=$10);" + ], + "description": "* 8-way 16-bit multiplexor:\n* out = a if sel == 000\n* b if sel == 001\n* etc.\n* h if sel == 111\n", + "prefix": "Mux8Way16" + }, + "Chip Nand": { + "body": [ + "Nand(a=$1, b=$2, out=$3);" + ], + "description": "* Nand gate:\n* out = a Nand b.\n", + "prefix": "Nand" + }, + "Chip Not": { + "body": [ + "Not(in=$1, out=$2);" + ], + "description": "* Not gate:\n* out = not in\n", + "prefix": "Not" + }, + "Chip Not16": { + "body": [ + "Not16(in=$1, out=$2);" + ], + "description": "* 16-bit Not:\n* for i=0..15: out[i] = not in[i]\n", + "prefix": "Not16" + }, + "Chip Or": { + "body": [ + "Or(a=$1, b=$2, out=$3);" + ], + "description": "* Or gate:\n* out = 1 if (a == 1 or b == 1)\n* 0 otherwise\n", + "prefix": "Or" + }, + "Chip Or16": { + "body": [ + "Or16(a=$1, b=$2, out=$3);" + ], + "description": "* 16-bit bitwise Or gate:\n* for i = 0..15 out[i] = a[i] or b[i].\n", + "prefix": "Or16" + }, + "Chip Or8Way": { + "body": [ + "Or8Way(in=$1, out=$2);" + ], + "description": "* 8-way Or\n* out = (in[0] or in[1] or ... or in[7])\n", + "prefix": "Or8Way" + }, + "Chip PC": { + "body": [ + "PC(in=$1, load=$2, inc=$3, reset=$4, out=$5);" + ], + "description": "* A 16-bit counter with load and reset control bits.\n* if (reset[t] == 1) out[t+1] = 0\n* else if (load[t] == 1) out[t+1] = in[t]\n* else if (inc[t] == 1) out[t+1] = out[t] + 1 (integer addition)\n* else out[t+1] = out[t]\n", + "prefix": "PC" + }, + "Chip RAM16K": { + "body": [ + "RAM16K(in=$1, load=$2, address=$3, out=$4);" + ], + "description": "* Memory of 16K registers, each 16 bit-wide. Out holds the value stored at the memory location specified by address.\n* If load==1, then the in value is loaded into the memory location specified by address (the loaded value will be emitted to out from the next time step onward).\n", + "prefix": "RAM16K" + }, + "Chip RAM4K": { + "body": [ + "RAM4K(in=$1, load=$2, address=$3, out=$4);" + ], + "description": "* Memory of 4K registers, each 16 bit-wide. Out holds the value stored at the memory location specified by address.\n* If load==1, then the in value is loaded into the memory location specified by address (the loaded value will be emitted to out from the next time step onward).\n", + "prefix": "RAM4K" + }, + "Chip RAM512": { + "body": [ + "RAM512(in=$1, load=$2, address=$3, out=$4);" + ], + "description": "* Memory of 512 registers, each 16 bit-wide. Out holds the value stored at the memory location specified by address.\n* If load==1, then the in value is loaded into the memory location specified by address (the loaded value will be emitted to out from the next time step onward).\n", + "prefix": "RAM512" + }, + "Chip RAM64": { + "body": [ + "RAM64(in=$1, load=$2, address=$3, out=$4);" + ], + "description": "* Memory of 64 registers, each 16 bit-wide. Out holds the value stored at the memory location specified by address.\n* If load==1, then the in value is loaded into the memory location specified by address (the loaded value will be emitted to out from the next time step onward).\n", + "prefix": "RAM64" + }, + "Chip RAM8": { + "body": [ + "RAM8(in=$1, load=$2, address=$3, out=$4);" + ], + "description": "* Memory of 8 registers, each 16 bit-wide. Out holds the value stored at the memory location specified by address.\n* If load==1, then the in value is loaded into the memory location specified by address (the loaded value will be emitted to out from the next time step onward).\n", + "prefix": "RAM8" + }, + "Chip Register": { + "body": [ + "Register(in=$1, load=$2, out=$3);" + ], + "description": "* 16-bit register:\n* If load[t] == 1 then out[t+1] = in[t]\n* else out does not change\n", + "prefix": "Register" + }, + "Chip ROM32K": { + "body": [ + "ROM32K(address=$1, out=$2);" + ], + "description": "* Read-Only memory (ROM) of 16K registers, each 16-bit wide.\n* The chip is designed to facilitate data read, as follows:\n* out(t) = ROM32K[address(t)](t)\n", + "prefix": "ROM32K" + }, + "Chip Screen": { + "body": [ + "Screen(in=$1, load=$2, address=$3, out=$4);" + ], + "description": "* The Screen (memory map).\n* Functions exactly like a 16-bit 8K RAM:\n* 1. out(t)=Screen[address(t)](t)\n* 2. If load(t-1) then Screen[address(t-1)](t)=in(t-1)\n", + "prefix": "Screen" + }, + "Chip Xor": { + "body": [ + "Xor(a=$1, b=$2, out=$3);" + ], + "description": "* Exclusive-or gate:\n* out = !(a == b).\n", + "prefix": "Xor" + } +} \ No newline at end of file diff --git a/web-ide-main/extension/languages/hdl.tmLanguage.json b/web-ide-main/extension/languages/hdl.tmLanguage.json new file mode 100644 index 0000000..719e90c --- /dev/null +++ b/web-ide-main/extension/languages/hdl.tmLanguage.json @@ -0,0 +1,75 @@ +{ + "fileTypes": [ + "hdl" + ], + "name": "HDL", + "patterns": [ + { + "comment": "Block comment", + "begin": "\\/\\*", + "end": "\\*\\/", + "name": "comment.block.hdl" + }, + { + "comment": "Line comment", + "begin": "\\/\\/", + "end": "\\n", + "name": "comment.line.hdl" + }, + { + "comment": "keywords", + "name": "keyword.hdl", + "match": "IN|OUT|PARTS|BUILTIN" + }, + { + "comment": "true, false", + "name": "constant.language.hdl", + "match": "true|false" + }, + { + "comment": "bus index", + "captures": { + "1": { + "name": "constant.numeric.hdl" + } + }, + "match": "\\[([\\d]+)\\]" + }, + { + "comment": ".. in bus slicing", + "captures": { + "1": { + "name": "constant.numeric.hdl" + } + }, + "match": "\\[(\\d+\\.{2}\\d+)\\]" + }, + { + "comment": "chip name", + "name": "storage.type.hdl", + "match": "CHIP" + }, + { + "comment": "inner chip", + "captures": { + "1": { + "name": "entity.name.function.hdl" + } + }, + "match": "([\\w\\d\\_]+)\\s*\\(" + }, + { + "comment": "inner chip inputs and outputs", + "captures": { + "1": { + "name": "variable.parameter.hdl" + }, + "2": { + "name": "constant.numeric.hdl" + } + }, + "match": "([\\w\\d\\_]+)\\s*(\\[.+\\])*=" + } + ], + "scopeName": "source.hdl" +} \ No newline at end of file diff --git a/web-ide-main/extension/languages/jack.snippets.json.code-snippets b/web-ide-main/extension/languages/jack.snippets.json.code-snippets new file mode 100644 index 0000000..a5d4b77 --- /dev/null +++ b/web-ide-main/extension/languages/jack.snippets.json.code-snippets @@ -0,0 +1,32 @@ +{ + "Class": { + "prefix": [ + "class", + "struct" + ], + "body": [ + "class ${1:Name} {", + "\t${0:$LINE_COMMENT attributes and methods}", + "}" + ], + "description": "A class interface." + }, + "Function/method": { + "prefix": [ + "function", + "method", + "procedure", + "void", + "int", + "String", + "Array", + "Char" + ], + "body": [ + "${1|function,method|} ${2:void} ${3:name} (${4:$BLOCK_COMMENT_START arguments $BLOCK_COMMENT_END}) {", + "\t${0:$LINE_COMMENT code}", + "}" + ], + "description": "A function/method definition." + } +} \ No newline at end of file diff --git a/web-ide-main/extension/languages/jack.tmLanguage.json b/web-ide-main/extension/languages/jack.tmLanguage.json new file mode 100644 index 0000000..5fb0815 --- /dev/null +++ b/web-ide-main/extension/languages/jack.tmLanguage.json @@ -0,0 +1,122 @@ +{ + "fileTypes": [ + "jack" + ], + "name": "Jack Language", + "patterns": [ + { + "include": "#keyword" + }, + { + "include": "#constant" + }, + { + "include": "#declaration" + }, + { + "include": "#comment" + } + ], + "repository": { + "keyword": { + "patterns": [ + { + "comment": "Keyword related to flow control", + "match": "\\b(if|else|while|do|return)\\b", + "name": "keyword.control" + }, + { + "comment": "Miscellaneous keyword", + "match": "\\blet\\b", + "name": "keyword.other" + } + ] + }, + "constant": { + "patterns": [ + { + "comment": "Numeric constant", + "name": "constant.numeric", + "match": "\\b[0-9]+\\b" + }, + { + "comment": "String literal", + "begin": "\\\"", + "end": "\\\"", + "name": "string.quoted.double", + "patterns": [ + { + "comment": "Escape characters", + "match": "\\\\.", + "name": "constant.character.escape" + } + ] + }, + { + "comment": "Language constant", + "name": "constant.language", + "match": "\\b(true|false|null|this)\\b" + } + ] + }, + "declaration": { + "patterns": [ + { + "comment": "Class declaration", + "match": "\\bclass\\b", + "name": "storage.type" + }, + { + "comment": "Variable declaration", + "name": "storage.type", + "match": "\\b(field|static|var)\\s+(\\w+)\\b", + "captures": { + "1": { + "name": "storage.modifier" + }, + "2": { + "name": "storage.type" + } + } + }, + { + "comment": "Function declaration", + "begin": "\\b(constructor|function|method)\\s+([A-Za-z_][A-Za-z_0-9]*)\\s+([A-Za-z_][A-Za-z_0-9]*)\\s*\\(", + "end": "\\)", + "match": "meta.function", + "beginCaptures": { + "1": { + "name": "storage.modifier" + }, + "2": { + "name": "storage.type" + } + }, + "patterns": [ + { + "match": "\\s*([A-Za-z_][A-Za-z_0-9]*)\\s+(?=[A-Za-z_][A-Za-z_0-9]*)\\b", + "name": "storage.type" + } + ] + } + ] + }, + "comment": { + "patterns": [ + { + "comment": "Inline comment", + "begin": "\\/\\/", + "end": "\\n", + "name": "comment.line.double-slash" + }, + { + "comment": "Multiline comment", + "begin": "\\/\\*", + "end": "\\*\\/", + "name": "comment.block" + } + ] + } + }, + "scopeName": "source.jack" +} \ No newline at end of file diff --git a/web-ide-main/extension/languages/language-configuration.json b/web-ide-main/extension/languages/language-configuration.json new file mode 100644 index 0000000..aefee5a --- /dev/null +++ b/web-ide-main/extension/languages/language-configuration.json @@ -0,0 +1,28 @@ +{ + "comments": { + "lineComment": "//", + "blockComment": ["/*", "*/"] + }, + // symbols used as brackets + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + // symbols that are auto closed when typing + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ], + // symbols that that can be used to surround a selection + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ] +} diff --git a/web-ide-main/extension/languages/tst.snippets.json.code-snippets b/web-ide-main/extension/languages/tst.snippets.json.code-snippets new file mode 100644 index 0000000..6524cd1 --- /dev/null +++ b/web-ide-main/extension/languages/tst.snippets.json.code-snippets @@ -0,0 +1,16 @@ +{ + "Repeat Loop": { + "prefix": [ + "repeat", + "loop", + "while", + "for" + ], + "body": [ + "repeat ${1:iterations} {", + "\t${0:$LINE_COMMENT code", + "}" + ], + "description": "A repeat loop." + } +} \ No newline at end of file diff --git a/web-ide-main/extension/languages/tst.tmLanguage.json b/web-ide-main/extension/languages/tst.tmLanguage.json new file mode 100644 index 0000000..1db3df7 --- /dev/null +++ b/web-ide-main/extension/languages/tst.tmLanguage.json @@ -0,0 +1,59 @@ +{ + "fileTypes": [ + "tst" + ], + "name": "TST", + "patterns": [ + { + "include": "#instruction" + }, + { + "include": "#comment" + } + ], + "repository": { + "instruction": { + "patterns": [ + { + "comment": "Everything which is not a comment is a function", + "begin": "\\b", + "end": "(,|;)", + "patterns": [ + { + "comment": "Every actual instruction starts with a function", + "name": "support.function", + "match": "(output-file|compare-to|output-list|set|eval|output|load)\\b" + }, + { + "comment": "A single bit", + "name": "constant.numeric", + "match": "\\s(1|0)|%B(\\d|\\.)+" + }, + { + "comment": "Filename with a known extension", + "name": "string.interpolated", + "match": "\\w+\\.(hdl|out|cmp)" + } + ] + } + ] + }, + "comment": { + "patterns": [ + { + "comment": "Inline comment", + "begin": "\\/\\/", + "end": "\\n", + "name": "comment.line.double-slash" + }, + { + "comment": "Multiline comment", + "begin": "\\/\\*", + "end": "\\*\\/", + "name": "comment.block" + } + ] + } + }, + "scopeName": "source.tst" +} \ No newline at end of file diff --git a/web-ide-main/extension/languages/vm.snippets.json.code-snippets b/web-ide-main/extension/languages/vm.snippets.json.code-snippets new file mode 100644 index 0000000..e94d021 --- /dev/null +++ b/web-ide-main/extension/languages/vm.snippets.json.code-snippets @@ -0,0 +1,63 @@ +{ + "If-then Statement": { + "prefix": [ + "if", + "then", + "condition" + ], + "body": [ + "\t${1:$LINE_COMMENT not-condition}", + "\tif-goto\t${2:if_end}", + "\t${0:$LINE_COMMENT code}", + "label\t\t${2:IF_END}" + ], + "description": "An if-then statement." + }, + "If-then-else Statement": { + "prefix": [ + "if", + "then", + "else", + "elif", + "condition" + ], + "body": [ + "\t${1:$LINE_COMMENT not-condition}", + "\tif-goto\t${2:if_else}", + "\t${3:$LINE_COMMENT code}", + "\tgoto\t${4:if_end}", + "label\t\t${2:if_else}", + "\t${0:$LINE_COMMENT code}", + "label\t\t${4:if_end}" + ], + "description": "An if-then-else statement." + }, + "While Loop": { + "prefix": [ + "repeat", + "loop", + "for", + "while" + ], + "body": [ + "label\t\t${1:loop}", + "\t${2:$LINE_COMMENT not condition}", + "\tif-goto\t${3:loop_end}", + "\t${4:$LINE_COMMENT code}", + "\tgoto\t${1:loop}", + "label\t\t${3:loop_end}" + ], + "description": "A while loop." + }, + "Function": { + "prefix": [ + "function", + "procedure" + ], + "body": [ + "function ${TM_FILENAME/(.*)\\..+$/$1/}.${1:name} ${2:0}", + "\t${0:$LINE_COMMENT code}" + ], + "description": "A function definition." + } +} \ No newline at end of file diff --git a/web-ide-main/extension/languages/vm.tmLanguage.json b/web-ide-main/extension/languages/vm.tmLanguage.json new file mode 100644 index 0000000..5576246 --- /dev/null +++ b/web-ide-main/extension/languages/vm.tmLanguage.json @@ -0,0 +1,134 @@ +{ + "fileTypes": [ + "vm" + ], + "name": "Virtual Machine Language", + "patterns": [ + { + "include": "#arithmetic-command" + }, + { + "include": "#memory-access-command" + }, + { + "include": "#program-flow-command" + }, + { + "include": "#function-calling-command" + }, + { + "include": "#comment" + } + ], + "repository": { + "arithmetic-command": { + "patterns": [ + { + "comment": "Performs arithmetic and logical operations on the stack.", + "match": "\\b(add|sub|neg|eq|gt|lt|and|or|not|shiftleft|shiftright)\\b", + "name": "keyword.operator" + } + ] + }, + "memory-access-command": { + "patterns": [ + { + "comment": "Transfers data between the stack and virtual memory segments.", + "match": "\\b(push|pop)\\s+([^ \\/]*)\\s+(\\d+)\\b", + "name": "keyword.operator", + "captures": { + "2": { + "patterns": [ + { + "comment": "Segment", + "match": "[a-zA-Z\\_\\.\\$\\:]+[a-zA-Z\\_\\.\\$\\:\\d]*", + "name": "storage.type" + } + ] + }, + "3": { + "patterns": [ + { + "comment": "Location", + "match": "\\d+", + "name": "constant.numeric" + } + ] + } + } + } + ] + }, + "program-flow-command": { + "patterns": [ + { + "comment": "Facilitates conditional and unconditional branching operations.", + "match": "\\b(label|goto|if-goto)\\s+([^ \\/]*)\\b", + "name": "keyword.control", + "captures": { + "2": { + "patterns": [ + { + "comment": "Label", + "match": "[a-zA-Z\\_\\.\\$\\:]+[a-zA-Z\\_\\.\\$\\:\\d]*", + "name": "entity.name.section" + } + ] + } + } + } + ] + }, + "function-calling-command": { + "patterns": [ + { + "comment": "Defines/calls functions.", + "match": "\\b(function|call)\\s+([^ \\/]*)\\s+(\\w+)\\b", + "name": "keyword.control", + "captures": { + "2": { + "patterns": [ + { + "comment": "Function name", + "match": "[a-zA-Z\\_\\.\\$\\:]+[a-zA-Z\\_\\.\\$\\:\\d]*", + "name": "entity.name.function" + } + ] + }, + "3": { + "patterns": [ + { + "comment": "Number of local variables/arguments passed", + "match": "\\d+", + "name": "constant.numeric" + } + ] + } + } + }, + { + "comment": "Returns from functions.", + "match": "return", + "name": "keyword.control" + } + ] + }, + "comment": { + "patterns": [ + { + "comment": "Inline comment", + "begin": "\\/\\/", + "end": "\\n", + "name": "comment.line.double-slash" + }, + { + "comment": "Multiline comment", + "begin": "\\/\\*", + "end": "\\*\\/", + "name": "comment.block" + } + ] + } + }, + "scopeName": "source.vm" +} diff --git a/web-ide-main/extension/package.json b/web-ide-main/extension/package.json new file mode 100644 index 0000000..5fb7c34 --- /dev/null +++ b/web-ide-main/extension/package.json @@ -0,0 +1,261 @@ +{ + "name": "@nand2tetris/vscode", + "version": "0.0.0", + "private": true, + "description": "NAND2Tetris IDE features for VSCode", + "author": "David Souther ", + "license": "ISC", + "repository": { + "type": "git", + "url": "git+https://github.com/davidsouther/nand2tetris.git" + }, + "homepage": "https://davidsouther.github.io/nand2tetris", + "scripts": { + "prebuild": "shx mkdir -p out/views/hdl && cd .. && npm run build -w extension/views/hdl", + "build": "npx esbuild ./src/extension.ts --bundle --outfile=out/main.js --external:vscode --format=cjs --platform=node --sourcemap", + "watch": "npm run build -- --watch", + "vscode:prepublish": "npm run build", + "package": "vsce package" + }, + "engines": { + "vscode": "^1.61.0" + }, + "main": "./out/main.js", + "contributes": { + "commands": [ + { + "command": "nand2tetris.run", + "title": "Nand2Tetris: run code", + "icon": "./images/button.png" + }, + { + "command": "nand2tetris.stop", + "title": "Nand2Tetris: stop running" + }, + { + "command": "nand2tetris.hardware", + "title": "Nand2Tetris: open hardware Simulator" + } + ], + "configuration": { + "type": "object", + "title": "Nand2Tetris IDE", + "properties": { + "nand2tetris.showRunIconInEditorTitleMenu": { + "type": "boolean", + "default": true, + "description": "Whether to show 'Run Code' icon in editor title menu.", + "scope": "resource" + }, + "nand2tetris.showTranslateIconInEditorTitleMenu": { + "type": "boolean", + "default": true, + "description": "Whether to show 'Translate Code' icon in editor title menu.", + "scope": "resource" + } + } + }, + "languages": [ + { + "id": "hdl", + "aliases": [ + "HDL" + ], + "extensions": [ + ".hdl" + ], + "configuration": "./languages/language-configuration.json" + }, + { + "id": "tst", + "aliases": [ + "TST", + "TEST", + "Test", + "test" + ], + "extensions": [ + ".tst" + ], + "configuration": "./languages/language-configuration.json" + }, + { + "id": "cmp", + "aliases": [ + "CMP", + "cmp" + ], + "extensions": [ + ".cmp" + ] + }, + { + "id": "out", + "aliases": [ + "OUT", + "out" + ], + "extensions": [ + ".out" + ] + }, + { + "id": "asm", + "aliases": [ + "ASM", + "asm" + ], + "extensions": [ + ".asm" + ], + "configuration": "./languages/language-configuration.json" + }, + { + "id": "hack", + "aliases": [ + "HACK", + "hack" + ], + "extensions": [ + ".hack" + ] + }, + { + "id": "vm", + "aliases": [ + "VM", + "vm" + ], + "extensions": [ + ".vm" + ], + "configuration": "./languages/language-configuration.json" + }, + { + "id": "jack", + "aliases": [ + "JACK", + "jack" + ], + "extensions": [ + ".jack" + ], + "configuration": "./languages/language-configuration.json" + } + ], + "grammars": [ + { + "language": "hdl", + "scopeName": "source.hdl", + "path": "./languages/hdl.tmLanguage.json" + }, + { + "language": "tst", + "scopeName": "source.tst", + "path": "./languages/tst.tmLanguage.json" + }, + { + "language": "cmp", + "scopeName": "source.cmp", + "path": "./languages/cmp-out.tmLanguage.json" + }, + { + "language": "out", + "scopeName": "source.out", + "path": "./languages/cmp-out.tmLanguage.json" + }, + { + "language": "asm", + "scopeName": "source.asm", + "path": "./languages/asm.tmLanguage.json" + }, + { + "language": "hack", + "scopeName": "source.hack", + "path": "./languages/hack.tmLanguage.json" + }, + { + "language": "vm", + "scopeName": "source.vm", + "path": "./languages/vm.tmLanguage.json" + }, + { + "language": "jack", + "scopeName": "source.jack", + "path": "./languages/jack.tmLanguage.json" + } + ], + "snippets": [ + { + "language": "hdl", + "path": "./languages/hdl.snippets.json.code-snippets" + }, + { + "language": "tst", + "path": "./languages/tst.snippets.json.code-snippets" + }, + { + "language": "asm", + "path": "./languages/asm.snippets.json.code-snippets" + }, + { + "language": "vm", + "path": "./languages/vm.snippets.json.code-snippets" + }, + { + "language": "jack", + "path": "./languages/jack.snippets.json.code-snippets" + } + ], + "iconThemes": [ + { + "id": "nand-ide", + "label": "Nand2Tetris IDE Icon Theme", + "path": "./fileicons/icon-theme.json" + } + ], + "viewsContainers": { + "activitybar": [ + { + "id": "nand2tetris", + "icon": "./fileicons/logo.svg", + "title": "NAND2Tetris" + } + ] + }, + "views": { + "nand2tetris": [ + { + "type": "webview", + "id": "nand2tetris.hdlView", + "name": "HDL Chip" + } + ] + } + }, + "activationEvents": [ + "onCommand:nand2tetris.hardware", + "onLanguage:cmp", + "onLanguage:hdl", + "onLanguage:out", + "onLanguage:tst" + ], + "devDependencies": { + "@davidsouther/jiffies": "^2.0.6", + "@nand2tetris/simulator": "file:../simulator", + "@types/error-cause": "^1.0.1", + "@types/node": "^16.11.41", + "@types/vscode": "^1.74.0", + "@vscode/vsce": "^2.27.0", + "@vscode/webview-ui-toolkit": "^1.2.1", + "esbuild": "^0.15.18", + "ohm-js": "^17.1.0" + }, + "dependencies": { + "gh-pages": "6.1.1", + "react-scripts": "5.0.1" + }, + "optionalDependencies": { + "esbuild-windows-64": "^0.15.18" + } +} diff --git a/web-ide-main/extension/src/commands.ts b/web-ide-main/extension/src/commands.ts new file mode 100644 index 0000000..ebb0861 --- /dev/null +++ b/web-ide-main/extension/src/commands.ts @@ -0,0 +1,14 @@ +import * as vscode from "vscode"; + +type Callback = Parameters[1]; + +export function makeCommands(): [string, Callback][] { + const hardwareCommand: [string, Callback] = [ + "nand2tetris.hardware", + async (fileUri: string) => { + console.log("Hardware Command"); + }, + ]; + + return [hardwareCommand]; +} diff --git a/web-ide-main/extension/src/commands/hardware.ts b/web-ide-main/extension/src/commands/hardware.ts new file mode 100644 index 0000000..ce5ce08 --- /dev/null +++ b/web-ide-main/extension/src/commands/hardware.ts @@ -0,0 +1,6 @@ +export async function hardware(fileUri: string) { + // The await eval() hack is for https://github.com/microsoft/TypeScript/issues/43329 + const tst = await import("@nand2tetris/simulator/test/chiptst.js"); + console.log(`Hardware for ${fileUri}`); + console.log(new tst.ChipTest()); +} diff --git a/web-ide-main/extension/src/diagnostics.ts b/web-ide-main/extension/src/diagnostics.ts new file mode 100644 index 0000000..795e1cd --- /dev/null +++ b/web-ide-main/extension/src/diagnostics.ts @@ -0,0 +1,41 @@ +import * as vscode from "vscode"; +import * as lang from "./languages/index.js"; + +async function getDiagnostics(document: vscode.TextDocument) { + switch (document.languageId) { + case "cmp": + case "out": + return lang.cmp.getDiagnostics(document); + case "hdl": + return lang.hdl.getDiagnostics(document); + case "tst": + return lang.tst.getDiagnostics(document); + default: + return []; + } +} + +let diagnosticCollection: vscode.DiagnosticCollection; +function getDiagnosticCollection() { + if (diagnosticCollection === undefined) { + diagnosticCollection = vscode.languages.createDiagnosticCollection(); + } + return diagnosticCollection; +} + +async function runDiagnostics(document: vscode.TextDocument) { + getDiagnosticCollection().delete(document.uri); + const allDiagnostics = await getDiagnostics(document); + for (const [file, diagnostics] of allDiagnostics) { + getDiagnosticCollection().set(file, diagnostics); + } +} + +export function makeDiagnostics() { + vscode.workspace.textDocuments.forEach(runDiagnostics); + vscode.workspace.onDidOpenTextDocument(runDiagnostics); + vscode.workspace.onDidChangeTextDocument(async (event) => { + runDiagnostics(event.document); + }); + return getDiagnosticCollection(); +} diff --git a/web-ide-main/extension/src/extension.ts b/web-ide-main/extension/src/extension.ts new file mode 100644 index 0000000..1fc4aba --- /dev/null +++ b/web-ide-main/extension/src/extension.ts @@ -0,0 +1,18 @@ +import * as vscode from "vscode"; +import { makeCommands } from "./commands.js"; +import { makeDiagnostics } from "./diagnostics.js"; +import { activateHdlView } from "./views/hdl.js"; + +export function activate(context: vscode.ExtensionContext) { + makeCommands().forEach(([name, callback]) => + context.subscriptions.push(vscode.commands.registerCommand(name, callback)), + ); + + context.subscriptions.push(makeDiagnostics()); + + activateHdlView(context); +} + +export function deactivate() { + console.log("Deactivating extension"); +} diff --git a/web-ide-main/extension/src/languages/base.ts b/web-ide-main/extension/src/languages/base.ts new file mode 100644 index 0000000..970302c --- /dev/null +++ b/web-ide-main/extension/src/languages/base.ts @@ -0,0 +1,40 @@ +import type { Grammar } from "ohm-js"; +import { + Diagnostic, + DiagnosticSeverity, + Range, + TextDocument, + Uri, +} from "vscode"; + +export async function getDiagnostics( + document: TextDocument, + parser: Grammar, +): Promise<[Uri, Diagnostic[]][]> { + const parsed = parser.match(document.getText()); + if (!parsed.failed()) return []; + + const { line, column, message } = + /Line (?\d+), col (?\d+): (?.*)/.exec( + parsed.shortMessage ?? "", + )?.groups ?? { line: 1, column: 1, message: "could not parse error" }; + + const startLineNumber = Number(line); + const endLineNumber = startLineNumber; + const startColumn = Number(column); + const restOfLine = document + .lineAt(startLineNumber) + .text.substring(startColumn - 1); + let endColumn = startColumn + (restOfLine.match(/([^\s]+)/)?.[0].length ?? 1); + if (endColumn <= startColumn) { + endColumn = startColumn + 1; + } + const range = new Range( + startLineNumber - 1, + startColumn - 1, + endLineNumber - 1, + endColumn - 1, + ); + const diagnostic = new Diagnostic(range, message, DiagnosticSeverity.Error); + return [[document.uri, [diagnostic]]]; +} diff --git a/web-ide-main/extension/src/languages/cmp.ts b/web-ide-main/extension/src/languages/cmp.ts new file mode 100644 index 0000000..54d41b0 --- /dev/null +++ b/web-ide-main/extension/src/languages/cmp.ts @@ -0,0 +1,25 @@ +import type { CMP } from "@nand2tetris/simulator/languages/cmp"; +import { Diagnostic, TextDocument, Uri } from "vscode"; +import * as base from "./base.js"; + +// import { load } from "../loader.js"; + +let cmp: typeof CMP | undefined = undefined; +async function getCmp(): Promise { + if (cmp) return Promise.resolve(cmp); + cmp = (await import("@nand2tetris/simulator/languages/cmp.js")) + .CMP as typeof CMP; + return cmp; +} + +export async function getDiagnostics( + document: TextDocument, +): Promise<[Uri, Diagnostic[]][]> { + try { + const { parser } = await getCmp(); + return base.getDiagnostics(document, parser); + } catch (e) { + console.error("Failed to load tst parser", e); + return []; + } +} diff --git a/web-ide-main/extension/src/languages/hdl.ts b/web-ide-main/extension/src/languages/hdl.ts new file mode 100644 index 0000000..5e1bc34 --- /dev/null +++ b/web-ide-main/extension/src/languages/hdl.ts @@ -0,0 +1,19 @@ +import type { HDL } from "@nand2tetris/simulator/languages/hdl"; +import { Diagnostic, TextDocument, Uri } from "vscode"; +import * as base from "./base.js"; + +let hdl: typeof HDL | undefined = undefined; +async function getHdl(): Promise { + if (hdl) return Promise.resolve(hdl); + hdl = (await import("@nand2tetris/simulator/languages/hdl.js")) + .HDL as typeof HDL; + return hdl; +} + +export async function getDiagnostics( + document: TextDocument, +): Promise<[Uri, Diagnostic[]][]> { + const { parser } = await getHdl(); + + return base.getDiagnostics(document, parser); +} diff --git a/web-ide-main/extension/src/languages/index.ts b/web-ide-main/extension/src/languages/index.ts new file mode 100644 index 0000000..f916ec2 --- /dev/null +++ b/web-ide-main/extension/src/languages/index.ts @@ -0,0 +1,5 @@ +export const LANGUAGE_IDS = ["cmp", "hdl", "out", "tst"]; +export * as base from "./base.js"; +export * as cmp from "./cmp.js"; +export * as hdl from "./hdl.js"; +export * as tst from "./tst.js"; diff --git a/web-ide-main/extension/src/languages/tst.ts b/web-ide-main/extension/src/languages/tst.ts new file mode 100644 index 0000000..e9bfef0 --- /dev/null +++ b/web-ide-main/extension/src/languages/tst.ts @@ -0,0 +1,23 @@ +import type { TST } from "@nand2tetris/simulator/languages/tst"; +import { Diagnostic, TextDocument, Uri } from "vscode"; +import * as base from "./base.js"; + +let tst: typeof TST | undefined = undefined; +async function getTst(): Promise { + if (tst) return Promise.resolve(tst); + tst = (await import("@nand2tetris/simulator/languages/tst.js")) + .TST as typeof TST; + return tst; +} + +export async function getDiagnostics( + document: TextDocument, +): Promise<[Uri, Diagnostic[]][]> { + try { + const { parser } = await getTst(); + return base.getDiagnostics(document, parser); + } catch (e) { + console.error("Failed to load tst parser", e); + return []; + } +} diff --git a/web-ide-main/extension/src/views/hdl.ts b/web-ide-main/extension/src/views/hdl.ts new file mode 100644 index 0000000..26b53c5 --- /dev/null +++ b/web-ide-main/extension/src/views/hdl.ts @@ -0,0 +1,104 @@ +import { parse } from "path"; +import * as vscode from "vscode"; +import { hdl as HDL } from "../languages/index.js"; + +export function activateHdlView(context: vscode.ExtensionContext) { + const provider = new HdlViewProvider(context.extensionUri); + vscode.window.registerWebviewViewProvider(HdlViewProvider.viewType, provider); +} + +class HdlViewProvider implements vscode.WebviewViewProvider { + public static readonly viewType = "nand2tetris.hdlView"; + + private _hdl = ""; + private _view?: vscode.WebviewView; + + constructor(private readonly extensionUri: vscode.Uri) {} + + public resolveWebviewView( + webviewView: vscode.WebviewView, + context: vscode.WebviewViewResolveContext, + _token: vscode.CancellationToken, + ) { + this._view = webviewView; + + webviewView.webview.options = { + // Allow scripts in the webview + enableScripts: true, + localResourceRoots: [this.extensionUri], + }; + + webviewView.webview.html = this._getHtmlForWebview(webviewView.webview); + + webviewView.webview.onDidReceiveMessage( + (message: { nand2tetris: boolean; ready: boolean }) => { + if (message.nand2tetris && message.ready) { + this.updateHdl(vscode.window.activeTextEditor?.document); + } + }, + ); + + webviewView.onDidChangeVisibility(() => { + if (this._view?.visible !== true) { + this.clearHdl(); + } else { + this.updateHdl(vscode.window.activeTextEditor?.document); + } + }); + + vscode.window.onDidChangeActiveTextEditor((e) => { + this.updateHdl(e?.document); + }); + + vscode.workspace.onDidSaveTextDocument(async (document) => { + this.updateHdl(document); + }); + } + + clearHdl() { + this._hdl = ""; + } + + async updateHdl(document?: vscode.TextDocument) { + if (document?.languageId !== "hdl") return; + const hdl = document.getText(); + if (this._hdl === hdl) { + return; + } + const diagnostics = await HDL.getDiagnostics(document); + if ((diagnostics[0] ?? ["", []])[1].length === 0) { + const chipName = parse(document.fileName).name; + this._view?.webview.postMessage({ nand2tetris: true, hdl, chipName }); + this._hdl = hdl; + } + } + + private _getHtmlForWebview(webview: vscode.Webview) { + const stylesUri = this.getUri(webview, ["hdl", "styles.css"]); + const scriptUri = this.getUri(webview, ["hdl", "main.js"]); + + return /*html*/ ` + + + + + + + + HDL - NAND2Tetris + + + +
+ + + + `; + } + + private getUri(webview: vscode.Webview, pathList: string[]) { + return webview.asWebviewUri( + vscode.Uri.joinPath(this.extensionUri, "out", "views", ...pathList), + ); + } +} diff --git a/web-ide-main/extension/tsconfig.json b/web-ide-main/extension/tsconfig.json new file mode 100644 index 0000000..57590d7 --- /dev/null +++ b/web-ide-main/extension/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "build", + "rootDir": "src", + "module": "CommonJS", + "tsBuildInfoFile": "build/.tsbuildinfo" + }, + "include": ["src"] +} diff --git a/web-ide-main/extension/views/base/package.json b/web-ide-main/extension/views/base/package.json new file mode 100644 index 0000000..e69de29 diff --git a/web-ide-main/extension/views/base/src/index.css b/web-ide-main/extension/views/base/src/index.css new file mode 100644 index 0000000..fbf65c1 --- /dev/null +++ b/web-ide-main/extension/views/base/src/index.css @@ -0,0 +1,31 @@ +[role="group"] { + display: flex; + align-items: baseline; +} + +[role="group"] > label:has(input[type="radio"]) { + color: var(--vscode-button-foreground); + background-color: var(--vscode-button-background); + align-self: stretch; + padding: 2px 1px; +} + +[role="group"] > label:has(input[type="radio"]):first-of-type { + padding-left: 2px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +[role="group"] > label:has(input[type="radio"]):larst-of-type { + padding-right: 2px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +[role="group"] > label[aria-current="true"]:has(input[type="radio"]) { + background-color: var(--vscode-button-hoverBackground); +} + +[role="group"] > label > input[type="radio"] { + display: none; +} diff --git a/web-ide-main/extension/views/hdl/.gitignore b/web-ide-main/extension/views/hdl/.gitignore new file mode 100644 index 0000000..4d29575 --- /dev/null +++ b/web-ide-main/extension/views/hdl/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/web-ide-main/extension/views/hdl/README.md b/web-ide-main/extension/views/hdl/README.md new file mode 100644 index 0000000..b87cb00 --- /dev/null +++ b/web-ide-main/extension/views/hdl/README.md @@ -0,0 +1,46 @@ +# Getting Started with Create React App + +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.\ +You will also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you canโ€™t go back!** + +If you arenโ€™t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point youโ€™re on your own. + +You donโ€™t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldnโ€™t feel obligated to use this feature. However we understand that this tool wouldnโ€™t be useful if you couldnโ€™t customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/web-ide-main/extension/views/hdl/package.json b/web-ide-main/extension/views/hdl/package.json new file mode 100644 index 0000000..40af0d7 --- /dev/null +++ b/web-ide-main/extension/views/hdl/package.json @@ -0,0 +1,44 @@ +{ + "name": "hdl", + "version": "0.0.0", + "private": true, + "dependencies": { + "@nand2tetris/components": "0.0.0", + "@nand2tetris/simulator": "0.0.0", + "gh-pages": "6.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "rewire": "^6.0.0", + "vsce": "^2.15.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^16.11.66", + "@types/react": "^18.0.26", + "@types/react-dom": "^18.0.10", + "@types/vscode-webview": "^1.57.1", + "react-scripts": "^5.0.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "node ./scripts/build-react-no-split.js", + "postbuild": "shx cp ./build/styles.css ./build/static/js/main.js ./build/static/js/main.js.map ./build/static/js/main.js.LICENSE.txt ../../out/views/hdl", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/web-ide-main/extension/views/hdl/public/favicon.ico b/web-ide-main/extension/views/hdl/public/favicon.ico new file mode 100644 index 0000000..a11777c Binary files /dev/null and b/web-ide-main/extension/views/hdl/public/favicon.ico differ diff --git a/web-ide-main/extension/views/hdl/public/index.html b/web-ide-main/extension/views/hdl/public/index.html new file mode 100644 index 0000000..431a2c1 --- /dev/null +++ b/web-ide-main/extension/views/hdl/public/index.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + + React App + + + + + +
+ + + diff --git a/web-ide-main/extension/views/hdl/public/logo192.png b/web-ide-main/extension/views/hdl/public/logo192.png new file mode 100644 index 0000000..fc44b0a Binary files /dev/null and b/web-ide-main/extension/views/hdl/public/logo192.png differ diff --git a/web-ide-main/extension/views/hdl/public/logo512.png b/web-ide-main/extension/views/hdl/public/logo512.png new file mode 100644 index 0000000..a4e47a6 Binary files /dev/null and b/web-ide-main/extension/views/hdl/public/logo512.png differ diff --git a/web-ide-main/extension/views/hdl/public/manifest.json b/web-ide-main/extension/views/hdl/public/manifest.json new file mode 100644 index 0000000..080d6c7 --- /dev/null +++ b/web-ide-main/extension/views/hdl/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/web-ide-main/extension/views/hdl/public/robots.txt b/web-ide-main/extension/views/hdl/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/web-ide-main/extension/views/hdl/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/web-ide-main/extension/views/hdl/public/styles.css b/web-ide-main/extension/views/hdl/public/styles.css new file mode 100644 index 0000000..9996f86 --- /dev/null +++ b/web-ide-main/extension/views/hdl/public/styles.css @@ -0,0 +1,63 @@ +:root { + --font-family-monospace: var(--vscode-editor-font-family); +} + +button { + font-family: var(--vscode-editor-font-family); + font-weight: var(--vscode-editor-font-weight); + font-size: var(--vscode-editor-font-size); + color: var(--vscode-button-foreground); + background-color: var(--vscode-button-background); + border: 0; + padding: 0; + width: 1rem; +} + +button:hover { + background-color: var(--vscode-button-hoverBackground); +} + +button[disabled] { + opacity: var(--disabled-opacity); + background-color: var(--vscode-button-hoverBackground); +} + +fieldset[role="group"] { + border: 0; + padding: 0; + display: flex; + align-items: baseline; +} + +fieldset[role="group"] > label[role="button"] { + /* fieldset[role="group"] > label:has(input[type="radio"]) { */ + color: var(--vscode-button-foreground); + background-color: var(--vscode-button-background); + align-self: stretch; + padding: 2px 1px; +} + +fieldset[role="group"] button:first-of-type, +fieldset[role="group"] > label[role="button"]:first-of-type { + /* fieldset[role="group"] > label:has(input[type="radio"]):first-of-type { */ + padding-left: 2px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +fieldset[role="group"] button:last-of-type, +fieldset[role="group"] > label[role="button"]:last-of-type { + /* fieldset[role="group"] > label:has(input[type="radio"]):last-of-type { */ + padding-right: 2px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +fieldset[role="group"] > label[role="button"][aria-current="true"] { + /* fieldset[role="group"] > label[aria-current="true"]:has(input[type="radio"]) { */ + background-color: var(--vscode-button-hoverBackground); +} + +fieldset[role="group"] > label > input[type="radio"] { + display: none; +} diff --git a/web-ide-main/extension/views/hdl/public/vars.css b/web-ide-main/extension/views/hdl/public/vars.css new file mode 100644 index 0000000..525f19b --- /dev/null +++ b/web-ide-main/extension/views/hdl/public/vars.css @@ -0,0 +1,591 @@ +:root { + --vscode-font-family: -apple-system, BlinkMacSystemFont, sans-serif; + --vscode-font-weight: normal; + --vscode-font-size: 13px; + --vscode-editor-font-family: "JetBrains Mono", "Consolas Light", "Courier New", + monospace; + --vscode-editor-font-weight: normal; + --vscode-editor-font-size: 16px; + + --vscode-foreground: #cccccc; + + --vscode-button-background: #0e639c; + --vscode-button-foreground: #ffffff; + --vscode-button-hoverBackground: #1177bb; + --vscode-button-separator: rgba(255, 255, 255, 0.4); + + --vscode-charts-blue: #3794ff; + --vscode-charts-foreground: #cccccc; + --vscode-charts-green: #89d185; + --vscode-charts-lines: rgba(204, 204, 204, 0.5); + --vscode-charts-orange: #d18616; + --vscode-charts-purple: #b180d7; + --vscode-charts-red: #f14c4c; + --vscode-charts-yellow: #cca700; + --vscode-checkbox-background: #3c3c3c; + --vscode-checkbox-border: #3c3c3c; + --vscode-checkbox-foreground: #f0f0f0; + --vscode-commandCenter-activeBackground: rgba(90, 93, 94, 0.31); + --vscode-commandCenter-activeForeground: #cccccc; + --vscode-commandCenter-border: rgba(128, 128, 128, 0.35); + --vscode-commandCenter-foreground: #cccccc; + --vscode-debugConsole-errorForeground: #f48771; + --vscode-debugConsole-infoForeground: #3794ff; + --vscode-debugConsole-sourceForeground: #cccccc; + --vscode-debugConsole-warningForeground: #cca700; + --vscode-debugConsoleInputIcon-foreground: #cccccc; + --vscode-debugExceptionWidget-background: #420b0d; + --vscode-debugExceptionWidget-border: #a31515; + --vscode-debugIcon-breakpointCurrentStackframeForeground: #ffcc00; + --vscode-debugIcon-breakpointDisabledForeground: #848484; + --vscode-debugIcon-breakpointForeground: #e51400; + --vscode-debugIcon-breakpointStackframeForeground: #89d185; + --vscode-debugIcon-breakpointUnverifiedForeground: #848484; + --vscode-debugIcon-continueForeground: #75beff; + --vscode-debugIcon-disconnectForeground: #f48771; + --vscode-debugIcon-pauseForeground: #75beff; + --vscode-debugIcon-restartForeground: #89d185; + --vscode-debugIcon-startForeground: #89d185; + --vscode-debugIcon-stepBackForeground: #75beff; + --vscode-debugIcon-stepIntoForeground: #75beff; + --vscode-debugIcon-stepOutForeground: #75beff; + --vscode-debugIcon-stepOverForeground: #75beff; + --vscode-debugIcon-stopForeground: #f48771; + --vscode-debugTokenExpression-boolean: #4e94ce; + --vscode-debugTokenExpression-error: #f48771; + --vscode-debugTokenExpression-name: #c586c0; + --vscode-debugTokenExpression-number: #b5cea8; + --vscode-debugTokenExpression-string: #ce9178; + --vscode-debugTokenExpression-value: rgba(204, 204, 204, 0.6); + --vscode-debugToolBar-background: #333333; + --vscode-debugView-exceptionLabelBackground: #6c2022; + --vscode-debugView-exceptionLabelForeground: #cccccc; + --vscode-debugView-stateLabelBackground: rgba(136, 136, 136, 0.27); + --vscode-debugView-stateLabelForeground: #cccccc; + --vscode-debugView-valueChangedHighlight: #569cd6; + --vscode-descriptionForeground: rgba(204, 204, 204, 0.7); + --vscode-diffEditor-diagonalFill: rgba(204, 204, 204, 0.2); + --vscode-diffEditor-insertedLineBackground: rgba(155, 185, 85, 0.2); + --vscode-diffEditor-insertedTextBackground: rgba(156, 204, 44, 0.2); + --vscode-diffEditor-removedLineBackground: rgba(255, 0, 0, 0.2); + --vscode-diffEditor-removedTextBackground: rgba(255, 0, 0, 0.2); + --vscode-disabledForeground: rgba(204, 204, 204, 0.5); + --vscode-dropdown-background: #3c3c3c; + --vscode-dropdown-border: #3c3c3c; + --vscode-dropdown-foreground: #f0f0f0; + --vscode-editor-background: #1e1e1e; + --vscode-editor-findMatchBackground: #515c6a; + --vscode-editor-findMatchHighlightBackground: rgba(234, 92, 0, 0.33); + --vscode-editor-findRangeHighlightBackground: rgba(58, 61, 65, 0.4); + --vscode-editor-focusedStackFrameHighlightBackground: rgba( + 122, + 189, + 122, + 0.3 + ); + --vscode-editor-foldBackground: rgba(38, 79, 120, 0.3); + --vscode-editor-foreground: #d4d4d4; + --vscode-editor-hoverHighlightBackground: rgba(38, 79, 120, 0.25); + --vscode-editor-inactiveSelectionBackground: #3a3d41; + --vscode-editor-inlineValuesBackground: rgba(255, 200, 0, 0.2); + --vscode-editor-inlineValuesForeground: rgba(255, 255, 255, 0.5); + --vscode-editor-lineHighlightBorder: #282828; + --vscode-editor-linkedEditingBackground: rgba(255, 0, 0, 0.3); + --vscode-editor-rangeHighlightBackground: rgba(255, 255, 255, 0.04); + --vscode-editor-selectionBackground: #264f78; + --vscode-editor-selectionHighlightBackground: rgba(173, 214, 255, 0.15); + --vscode-editor-snippetFinalTabstopHighlightBorder: #525252; + --vscode-editor-snippetTabstopHighlightBackground: rgba(124, 124, 124, 0.3); + --vscode-editor-stackFrameHighlightBackground: rgba(255, 255, 0, 0.2); + --vscode-editor-symbolHighlightBackground: rgba(234, 92, 0, 0.33); + --vscode-editor-wordHighlightBackground: rgba(87, 87, 87, 0.72); + --vscode-editor-wordHighlightStrongBackground: rgba(0, 73, 114, 0.72); + --vscode-editorActiveLineNumber-foreground: #c6c6c6; + --vscode-editorBracketHighlight-foreground1: #ffd700; + --vscode-editorBracketHighlight-foreground2: #da70d6; + --vscode-editorBracketHighlight-foreground3: #179fff; + --vscode-editorBracketHighlight-foreground4: rgba(0, 0, 0, 0); + --vscode-editorBracketHighlight-foreground5: rgba(0, 0, 0, 0); + --vscode-editorBracketHighlight-foreground6: rgba(0, 0, 0, 0); + --vscode-editorBracketHighlight-unexpectedBracket\.foreground: rgba( + 255, + 18, + 18, + 0.8 + ); + --vscode-editorBracketMatch-background: rgba(0, 100, 0, 0.1); + --vscode-editorBracketMatch-border: #888888; + --vscode-editorBracketPairGuide-activeBackground1: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground2: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground3: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground4: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground5: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-activeBackground6: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background1: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background2: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background3: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background4: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background5: rgba(0, 0, 0, 0); + --vscode-editorBracketPairGuide-background6: rgba(0, 0, 0, 0); + --vscode-editorCodeLens-foreground: #999999; + --vscode-editorCommentsWidget-rangeActiveBackground: rgba(55, 148, 255, 0.1); + --vscode-editorCommentsWidget-rangeActiveBorder: rgba(55, 148, 255, 0.4); + --vscode-editorCommentsWidget-rangeBackground: rgba(55, 148, 255, 0.1); + --vscode-editorCommentsWidget-rangeBorder: rgba(55, 148, 255, 0.4); + --vscode-editorCommentsWidget-resolvedBorder: rgba(204, 204, 204, 0.5); + --vscode-editorCommentsWidget-unresolvedBorder: #3794ff; + --vscode-editorCursor-foreground: #aeafad; + --vscode-editorError-foreground: #f14c4c; + --vscode-editorGhostText-foreground: rgba(255, 255, 255, 0.34); + --vscode-editorGroup-border: #444444; + --vscode-editorGroup-dropBackground: rgba(83, 89, 93, 0.5); + --vscode-editorGroup-dropIntoPromptBackground: #252526; + --vscode-editorGroup-dropIntoPromptForeground: #cccccc; + --vscode-editorGroupHeader-noTabsBackground: #1e1e1e; + --vscode-editorGroupHeader-tabsBackground: #252526; + --vscode-editorGutter-addedBackground: #487e02; + --vscode-editorGutter-background: #1e1e1e; + --vscode-editorGutter-commentRangeForeground: #37373d; + --vscode-editorGutter-deletedBackground: #f14c4c; + --vscode-editorGutter-foldingControlForeground: #c5c5c5; + --vscode-editorGutter-modifiedBackground: #1b81a8; + --vscode-editorHint-foreground: rgba(238, 238, 238, 0.7); + --vscode-editorHoverWidget-background: #252526; + --vscode-editorHoverWidget-border: #454545; + --vscode-editorHoverWidget-foreground: #cccccc; + --vscode-editorHoverWidget-highlightForeground: #2aaaff; + --vscode-editorHoverWidget-statusBarBackground: #2c2c2d; + --vscode-editorIndentGuide-activeBackground: #707070; + --vscode-editorIndentGuide-background: #404040; + --vscode-editorInfo-foreground: #3794ff; + --vscode-editorInlayHint-background: rgba(77, 77, 77, 0.8); + --vscode-editorInlayHint-foreground: #ffffff; + --vscode-editorInlayHint-parameterBackground: rgba(77, 77, 77, 0.8); + --vscode-editorInlayHint-parameterForeground: #ffffff; + --vscode-editorInlayHint-typeBackground: rgba(77, 77, 77, 0.8); + --vscode-editorInlayHint-typeForeground: #ffffff; + --vscode-editorLightBulb-foreground: #ffcc00; + --vscode-editorLightBulbAutoFix-foreground: #75beff; + --vscode-editorLineNumber-activeForeground: #c6c6c6; + --vscode-editorLineNumber-foreground: #858585; + --vscode-editorLink-activeForeground: #4e94ce; + --vscode-editorMarkerNavigation-background: #1e1e1e; + --vscode-editorMarkerNavigationError-background: #f14c4c; + --vscode-editorMarkerNavigationInfo-background: #3794ff; + --vscode-editorMarkerNavigationWarning-background: #cca700; + --vscode-editorMarkerNavigationWarning-headerBackground: rgba( + 204, + 167, + 0, + 0.1 + ); + --vscode-editorOverviewRuler-addedForeground: rgba(72, 126, 2, 0.6); + --vscode-editorOverviewRuler-border: rgba(127, 127, 127, 0.3); + --vscode-editorOverviewRuler-bracketMatchForeground: #a0a0a0; + --vscode-editorOverviewRuler-commonContentForeground: rgba(96, 96, 96, 0.4); + --vscode-editorOverviewRuler-currentContentForeground: rgba( + 64, + 200, + 174, + 0.5 + ); + --vscode-editorOverviewRuler-deletedForeground: rgba(241, 76, 76, 0.6); + --vscode-editorOverviewRuler-errorForeground: rgba(255, 18, 18, 0.7); + --vscode-editorOverviewRuler-findMatchForeground: rgba(209, 134, 22, 0.49); + --vscode-editorOverviewRuler-incomingContentForeground: rgba( + 64, + 166, + 255, + 0.5 + ); + --vscode-editorOverviewRuler-infoForeground: #3794ff; + --vscode-editorOverviewRuler-modifiedForeground: rgba(27, 129, 168, 0.6); + --vscode-editorOverviewRuler-rangeHighlightForeground: rgba(0, 122, 204, 0.6); + --vscode-editorOverviewRuler-selectionHighlightForeground: rgba( + 160, + 160, + 160, + 0.8 + ); + --vscode-editorOverviewRuler-warningForeground: #cca700; + --vscode-editorOverviewRuler-wordHighlightForeground: rgba( + 160, + 160, + 160, + 0.8 + ); + --vscode-editorOverviewRuler-wordHighlightStrongForeground: rgba( + 192, + 160, + 192, + 0.8 + ); + --vscode-editorPane-background: #1e1e1e; + --vscode-editorRuler-foreground: #5a5a5a; + --vscode-editorStickyScroll-background: #1e1e1e; + --vscode-editorStickyScrollHover-background: #2a2d2e; + --vscode-editorSuggestWidget-background: #252526; + --vscode-editorSuggestWidget-border: #454545; + --vscode-editorSuggestWidget-focusHighlightForeground: #2aaaff; + --vscode-editorSuggestWidget-foreground: #d4d4d4; + --vscode-editorSuggestWidget-highlightForeground: #2aaaff; + --vscode-editorSuggestWidget-selectedBackground: #04395e; + --vscode-editorSuggestWidget-selectedForeground: #ffffff; + --vscode-editorSuggestWidget-selectedIconForeground: #ffffff; + --vscode-editorSuggestWidgetStatus-foreground: rgba(212, 212, 212, 0.5); + --vscode-editorUnicodeHighlight-background: rgba(189, 155, 3, 0.15); + --vscode-editorUnicodeHighlight-border: #bd9b03; + --vscode-editorUnnecessaryCode-opacity: rgba(0, 0, 0, 0.67); + --vscode-editorWarning-foreground: #cca700; + --vscode-editorWhitespace-foreground: rgba(227, 228, 226, 0.16); + --vscode-editorWidget-background: #252526; + --vscode-editorWidget-border: #454545; + --vscode-editorWidget-foreground: #cccccc; + --vscode-errorForeground: #f48771; + --vscode-extensionBadge-remoteBackground: #007acc; + --vscode-extensionBadge-remoteForeground: #ffffff; + --vscode-extensionButton-prominentBackground: #0e639c; + --vscode-extensionButton-prominentForeground: #ffffff; + --vscode-extensionButton-prominentHoverBackground: #1177bb; + --vscode-extensionIcon-preReleaseForeground: #1d9271; + --vscode-extensionIcon-sponsorForeground: #d758b3; + --vscode-extensionIcon-starForeground: #ff8e00; + --vscode-extensionIcon-verifiedForeground: #3794ff; + --vscode-focusBorder: #007fd4; + --vscode-gitDecoration-addedResourceForeground: #81b88b; + --vscode-gitDecoration-conflictingResourceForeground: #e4676b; + --vscode-gitDecoration-deletedResourceForeground: #c74e39; + --vscode-gitDecoration-ignoredResourceForeground: #8c8c8c; + --vscode-gitDecoration-modifiedResourceForeground: #e2c08d; + --vscode-gitDecoration-renamedResourceForeground: #73c991; + --vscode-gitDecoration-stageDeletedResourceForeground: #c74e39; + --vscode-gitDecoration-stageModifiedResourceForeground: #e2c08d; + --vscode-gitDecoration-submoduleResourceForeground: #8db9e2; + --vscode-gitDecoration-untrackedResourceForeground: #73c991; + --vscode-icon-foreground: #c5c5c5; + --vscode-input-background: #3c3c3c; + --vscode-input-foreground: #cccccc; + --vscode-input-placeholderForeground: #a6a6a6; + --vscode-inputOption-activeBackground: rgba(0, 127, 212, 0.4); + --vscode-inputOption-activeBorder: rgba(0, 122, 204, 0); + --vscode-inputOption-activeForeground: #ffffff; + --vscode-inputOption-hoverBackground: rgba(90, 93, 94, 0.5); + --vscode-inputValidation-errorBackground: #5a1d1d; + --vscode-inputValidation-errorBorder: #be1100; + --vscode-inputValidation-infoBackground: #063b49; + --vscode-inputValidation-infoBorder: #007acc; + --vscode-inputValidation-warningBackground: #352a05; + --vscode-inputValidation-warningBorder: #b89500; + --vscode-interactive-activeCodeBorder: #3794ff; + --vscode-interactive-inactiveCodeBorder: #37373d; + --vscode-keybindingLabel-background: rgba(128, 128, 128, 0.17); + --vscode-keybindingLabel-border: rgba(51, 51, 51, 0.6); + --vscode-keybindingLabel-bottomBorder: rgba(68, 68, 68, 0.6); + --vscode-keybindingLabel-foreground: #cccccc; + --vscode-keybindingTable-headerBackground: rgba(204, 204, 204, 0.04); + --vscode-keybindingTable-rowsBackground: rgba(204, 204, 204, 0.04); + --vscode-list-activeSelectionBackground: #04395e; + --vscode-list-activeSelectionForeground: #ffffff; + --vscode-list-activeSelectionIconForeground: #ffffff; + --vscode-list-deemphasizedForeground: #8c8c8c; + --vscode-list-dropBackground: #383b3d; + --vscode-list-errorForeground: #f88070; + --vscode-list-filterMatchBackground: rgba(234, 92, 0, 0.33); + --vscode-list-focusHighlightForeground: #2aaaff; + --vscode-list-focusOutline: #007fd4; + --vscode-list-highlightForeground: #2aaaff; + --vscode-list-hoverBackground: #2a2d2e; + --vscode-list-inactiveSelectionBackground: #37373d; + --vscode-list-invalidItemForeground: #b89500; + --vscode-list-warningForeground: #cca700; + --vscode-listFilterWidget-background: #252526; + --vscode-listFilterWidget-noMatchesOutline: #be1100; + --vscode-listFilterWidget-outline: rgba(0, 0, 0, 0); + --vscode-listFilterWidget-shadow: rgba(0, 0, 0, 0.36); + --vscode-menu-background: #303031; + --vscode-menu-foreground: #cccccc; + --vscode-menu-selectionBackground: #04395e; + --vscode-menu-selectionForeground: #ffffff; + --vscode-menu-separatorBackground: #606060; + --vscode-menubar-selectionBackground: rgba(90, 93, 94, 0.31); + --vscode-menubar-selectionForeground: #cccccc; + --vscode-merge-commonContentBackground: rgba(96, 96, 96, 0.16); + --vscode-merge-commonHeaderBackground: rgba(96, 96, 96, 0.4); + --vscode-merge-currentContentBackground: rgba(64, 200, 174, 0.2); + --vscode-merge-currentHeaderBackground: rgba(64, 200, 174, 0.5); + --vscode-merge-incomingContentBackground: rgba(64, 166, 255, 0.2); + --vscode-merge-incomingHeaderBackground: rgba(64, 166, 255, 0.5); + --vscode-mergeEditor-change\.background: rgba(155, 185, 85, 0.2); + --vscode-mergeEditor-change\.word\.background: rgba(156, 204, 44, 0.2); + --vscode-mergeEditor-conflict\.handledFocused\.border: rgba( + 193, + 193, + 193, + 0.8 + ); + --vscode-mergeEditor-conflict\.handledUnfocused\.border: rgba( + 134, + 134, + 134, + 0.29 + ); + --vscode-mergeEditor-conflict\.handled\.minimapOverViewRuler: rgba( + 173, + 172, + 168, + 0.93 + ); + --vscode-mergeEditor-conflict\.unhandledFocused\.border: #ffa600; + --vscode-mergeEditor-conflict\.unhandledUnfocused\.border: rgba( + 255, + 166, + 0, + 0.48 + ); + --vscode-mergeEditor-conflict\.unhandled\.minimapOverViewRuler: #fcba03; + --vscode-mergeEditor-conflictingLines\.background: rgba(255, 234, 0, 0.28); + --vscode-minimap-errorHighlight: rgba(255, 18, 18, 0.7); + --vscode-minimap-findMatchHighlight: #d18616; + --vscode-minimap-foregroundOpacity: #000000; + --vscode-minimap-selectionHighlight: #264f78; + --vscode-minimap-selectionOccurrenceHighlight: #676767; + --vscode-minimap-warningHighlight: #cca700; + --vscode-minimapGutter-addedBackground: #487e02; + --vscode-minimapGutter-deletedBackground: #f14c4c; + --vscode-minimapGutter-modifiedBackground: #1b81a8; + --vscode-minimapSlider-activeBackground: rgba(191, 191, 191, 0.2); + --vscode-minimapSlider-background: rgba(121, 121, 121, 0.2); + --vscode-minimapSlider-hoverBackground: rgba(100, 100, 100, 0.35); + --vscode-notebook-cellBorderColor: #37373d; + --vscode-notebook-cellEditorBackground: #252526; + --vscode-notebook-cellInsertionIndicator: #007fd4; + --vscode-notebook-cellStatusBarItemHoverBackground: rgba(255, 255, 255, 0.15); + --vscode-notebook-cellToolbarSeparator: rgba(128, 128, 128, 0.35); + --vscode-notebook-editorBackground: #1e1e1e; + --vscode-notebook-focusedCellBorder: #007fd4; + --vscode-notebook-focusedEditorBorder: #007fd4; + --vscode-notebook-inactiveFocusedCellBorder: #37373d; + --vscode-notebook-selectedCellBackground: #37373d; + --vscode-notebook-selectedCellBorder: #37373d; + --vscode-notebook-symbolHighlightBackground: rgba(255, 255, 255, 0.04); + --vscode-notebookScrollbarSlider-activeBackground: rgba(191, 191, 191, 0.4); + --vscode-notebookScrollbarSlider-background: rgba(121, 121, 121, 0.4); + --vscode-notebookScrollbarSlider-hoverBackground: rgba(100, 100, 100, 0.7); + --vscode-notebookStatusErrorIcon-foreground: #f48771; + --vscode-notebookStatusRunningIcon-foreground: #cccccc; + --vscode-notebookStatusSuccessIcon-foreground: #89d185; + --vscode-notificationCenterHeader-background: #303031; + --vscode-notificationLink-foreground: #3794ff; + --vscode-notifications-background: #252526; + --vscode-notifications-border: #303031; + --vscode-notifications-foreground: #cccccc; + --vscode-notificationsErrorIcon-foreground: #f14c4c; + --vscode-notificationsInfoIcon-foreground: #3794ff; + --vscode-notificationsWarningIcon-foreground: #cca700; + --vscode-panel-background: #1e1e1e; + --vscode-panel-border: rgba(128, 128, 128, 0.35); + --vscode-panel-dropBorder: #e7e7e7; + --vscode-panelSection-border: rgba(128, 128, 128, 0.35); + --vscode-panelSection-dropBackground: rgba(83, 89, 93, 0.5); + --vscode-panelSectionHeader-background: rgba(128, 128, 128, 0.2); + --vscode-panelTitle-activeBorder: #e7e7e7; + --vscode-panelTitle-activeForeground: #e7e7e7; + --vscode-panelTitle-inactiveForeground: rgba(231, 231, 231, 0.6); + --vscode-peekView-border: #3794ff; + --vscode-peekViewEditor-background: #001f33; + --vscode-peekViewEditor-matchHighlightBackground: rgba(255, 143, 0, 0.6); + --vscode-peekViewEditorGutter-background: #001f33; + --vscode-peekViewResult-background: #252526; + --vscode-peekViewResult-fileForeground: #ffffff; + --vscode-peekViewResult-lineForeground: #bbbbbb; + --vscode-peekViewResult-matchHighlightBackground: rgba(234, 92, 0, 0.3); + --vscode-peekViewResult-selectionBackground: rgba(51, 153, 255, 0.2); + --vscode-peekViewResult-selectionForeground: #ffffff; + --vscode-peekViewTitle-background: rgba(55, 148, 255, 0.1); + --vscode-peekViewTitleDescription-foreground: rgba(204, 204, 204, 0.7); + --vscode-peekViewTitleLabel-foreground: #ffffff; + --vscode-pickerGroup-border: #3f3f46; + --vscode-pickerGroup-foreground: #3794ff; + --vscode-ports-iconRunningProcessForeground: #369432; + --vscode-problemsErrorIcon-foreground: #f14c4c; + --vscode-problemsInfoIcon-foreground: #3794ff; + --vscode-problemsWarningIcon-foreground: #cca700; + --vscode-progressBar-background: #0e70c0; + --vscode-quickInput-background: #252526; + --vscode-quickInput-foreground: #cccccc; + --vscode-quickInputList-focusBackground: #04395e; + --vscode-quickInputList-focusForeground: #ffffff; + --vscode-quickInputList-focusIconForeground: #ffffff; + --vscode-quickInputTitle-background: rgba(255, 255, 255, 0.1); + --vscode-sash-hoverBorder: #007fd4; + --vscode-scm-providerBorder: #454545; + --vscode-scrollbar-shadow: #000000; + --vscode-scrollbarSlider-activeBackground: rgba(191, 191, 191, 0.4); + --vscode-scrollbarSlider-background: rgba(121, 121, 121, 0.4); + --vscode-scrollbarSlider-hoverBackground: rgba(100, 100, 100, 0.7); + --vscode-searchEditor-findMatchBackground: rgba(234, 92, 0, 0.22); + --vscode-settings-checkboxBackground: #3c3c3c; + --vscode-settings-checkboxBorder: #3c3c3c; + --vscode-settings-checkboxForeground: #f0f0f0; + --vscode-settings-dropdownBackground: #3c3c3c; + --vscode-settings-dropdownBorder: #3c3c3c; + --vscode-settings-dropdownForeground: #f0f0f0; + --vscode-settings-dropdownListBorder: #454545; + --vscode-settings-focusedRowBackground: rgba(42, 45, 46, 0.6); + --vscode-settings-focusedRowBorder: rgba(255, 255, 255, 0.12); + --vscode-settings-headerBorder: rgba(128, 128, 128, 0.35); + --vscode-settings-headerForeground: #e7e7e7; + --vscode-settings-modifiedItemIndicator: #0c7d9d; + --vscode-settings-numberInputBackground: #3c3c3c; + --vscode-settings-numberInputForeground: #cccccc; + --vscode-settings-rowHoverBackground: rgba(42, 45, 46, 0.3); + --vscode-settings-sashBorder: rgba(128, 128, 128, 0.35); + --vscode-settings-textInputBackground: #3c3c3c; + --vscode-settings-textInputForeground: #cccccc; + --vscode-sideBar-background: #252526; + --vscode-sideBar-dropBackground: rgba(83, 89, 93, 0.5); + --vscode-sideBarSectionHeader-background: rgba(0, 0, 0, 0); + --vscode-sideBarSectionHeader-border: rgba(204, 204, 204, 0.2); + --vscode-sideBarTitle-foreground: #bbbbbb; + --vscode-sideBySideEditor-horizontalBorder: #444444; + --vscode-sideBySideEditor-verticalBorder: #444444; + --vscode-statusBar-background: #007acc; + --vscode-statusBar-debuggingBackground: #cc6633; + --vscode-statusBar-debuggingForeground: #ffffff; + --vscode-statusBar-focusBorder: #ffffff; + --vscode-statusBar-foreground: #ffffff; + --vscode-statusBar-noFolderBackground: #68217a; + --vscode-statusBar-noFolderForeground: #ffffff; + --vscode-statusBarItem-activeBackground: rgba(255, 255, 255, 0.18); + --vscode-statusBarItem-compactHoverBackground: rgba(255, 255, 255, 0.2); + --vscode-statusBarItem-errorBackground: #c72e0f; + --vscode-statusBarItem-errorForeground: #ffffff; + --vscode-statusBarItem-focusBorder: #ffffff; + --vscode-statusBarItem-hoverBackground: rgba(255, 255, 255, 0.12); + --vscode-statusBarItem-prominentBackground: rgba(0, 0, 0, 0.5); + --vscode-statusBarItem-prominentForeground: #ffffff; + --vscode-statusBarItem-prominentHoverBackground: rgba(0, 0, 0, 0.3); + --vscode-statusBarItem-remoteBackground: #16825d; + --vscode-statusBarItem-remoteForeground: #ffffff; + --vscode-statusBarItem-warningBackground: #7a6400; + --vscode-statusBarItem-warningForeground: #ffffff; + --vscode-symbolIcon-arrayForeground: #cccccc; + --vscode-symbolIcon-booleanForeground: #cccccc; + --vscode-symbolIcon-classForeground: #ee9d28; + --vscode-symbolIcon-colorForeground: #cccccc; + --vscode-symbolIcon-constantForeground: #cccccc; + --vscode-symbolIcon-constructorForeground: #b180d7; + --vscode-symbolIcon-enumeratorForeground: #ee9d28; + --vscode-symbolIcon-enumeratorMemberForeground: #75beff; + --vscode-symbolIcon-eventForeground: #ee9d28; + --vscode-symbolIcon-fieldForeground: #75beff; + --vscode-symbolIcon-fileForeground: #cccccc; + --vscode-symbolIcon-folderForeground: #cccccc; + --vscode-symbolIcon-functionForeground: #b180d7; + --vscode-symbolIcon-interfaceForeground: #75beff; + --vscode-symbolIcon-keyForeground: #cccccc; + --vscode-symbolIcon-keywordForeground: #cccccc; + --vscode-symbolIcon-methodForeground: #b180d7; + --vscode-symbolIcon-moduleForeground: #cccccc; + --vscode-symbolIcon-namespaceForeground: #cccccc; + --vscode-symbolIcon-nullForeground: #cccccc; + --vscode-symbolIcon-numberForeground: #cccccc; + --vscode-symbolIcon-objectForeground: #cccccc; + --vscode-symbolIcon-operatorForeground: #cccccc; + --vscode-symbolIcon-packageForeground: #cccccc; + --vscode-symbolIcon-propertyForeground: #cccccc; + --vscode-symbolIcon-referenceForeground: #cccccc; + --vscode-symbolIcon-snippetForeground: #cccccc; + --vscode-symbolIcon-stringForeground: #cccccc; + --vscode-symbolIcon-structForeground: #cccccc; + --vscode-symbolIcon-textForeground: #cccccc; + --vscode-symbolIcon-typeParameterForeground: #cccccc; + --vscode-symbolIcon-unitForeground: #cccccc; + --vscode-symbolIcon-variableForeground: #75beff; + --vscode-tab-activeBackground: #1e1e1e; + --vscode-tab-activeForeground: #ffffff; + --vscode-tab-activeModifiedBorder: #3399cc; + --vscode-tab-border: #252526; + --vscode-tab-inactiveBackground: #2d2d2d; + --vscode-tab-inactiveForeground: rgba(255, 255, 255, 0.5); + --vscode-tab-inactiveModifiedBorder: rgba(51, 153, 204, 0.5); + --vscode-tab-lastPinnedBorder: rgba(204, 204, 204, 0.2); + --vscode-tab-unfocusedActiveBackground: #1e1e1e; + --vscode-tab-unfocusedActiveForeground: rgba(255, 255, 255, 0.5); + --vscode-tab-unfocusedActiveModifiedBorder: rgba(51, 153, 204, 0.5); + --vscode-tab-unfocusedInactiveBackground: #2d2d2d; + --vscode-tab-unfocusedInactiveForeground: rgba(255, 255, 255, 0.25); + --vscode-tab-unfocusedInactiveModifiedBorder: rgba(51, 153, 204, 0.25); + --vscode-terminal-ansiBlack: #000000; + --vscode-terminal-ansiBlue: #2472c8; + --vscode-terminal-ansiBrightBlack: #666666; + --vscode-terminal-ansiBrightBlue: #3b8eea; + --vscode-terminal-ansiBrightCyan: #29b8db; + --vscode-terminal-ansiBrightGreen: #23d18b; + --vscode-terminal-ansiBrightMagenta: #d670d6; + --vscode-terminal-ansiBrightRed: #f14c4c; + --vscode-terminal-ansiBrightWhite: #e5e5e5; + --vscode-terminal-ansiBrightYellow: #f5f543; + --vscode-terminal-ansiCyan: #11a8cd; + --vscode-terminal-ansiGreen: #0dbc79; + --vscode-terminal-ansiMagenta: #bc3fbc; + --vscode-terminal-ansiRed: #cd3131; + --vscode-terminal-ansiWhite: #e5e5e5; + --vscode-terminal-ansiYellow: #e5e510; + --vscode-terminal-border: rgba(128, 128, 128, 0.35); + --vscode-terminal-dropBackground: rgba(83, 89, 93, 0.5); + --vscode-terminal-findMatchBackground: #515c6a; + --vscode-terminal-findMatchHighlightBackground: rgba(234, 92, 0, 0.33); + --vscode-terminal-foreground: #cccccc; + --vscode-terminal-inactiveSelectionBackground: #3a3d41; + --vscode-terminal-selectionBackground: #264f78; + --vscode-terminalCommandDecoration-defaultBackground: rgba( + 255, + 255, + 255, + 0.25 + ); + --vscode-terminalCommandDecoration-errorBackground: #f14c4c; + --vscode-terminalCommandDecoration-successBackground: #1b81a8; + --vscode-terminalOverviewRuler-cursorForeground: rgba(160, 160, 160, 0.8); + --vscode-terminalOverviewRuler-findMatchForeground: rgba(209, 134, 22, 0.49); + --vscode-testing-iconErrored: #f14c4c; + --vscode-testing-iconFailed: #f14c4c; + --vscode-testing-iconPassed: #73c991; + --vscode-testing-iconQueued: #cca700; + --vscode-testing-iconSkipped: #848484; + --vscode-testing-iconUnset: #848484; + --vscode-testing-message\.error\.decorationForeground: #f14c4c; + --vscode-testing-message\.error\.lineBackground: rgba(255, 0, 0, 0.2); + --vscode-testing-message\.info\.decorationForeground: rgba( + 212, + 212, + 212, + 0.5 + ); + --vscode-testing-peekBorder: #f14c4c; + --vscode-testing-peekHeaderBackground: rgba(241, 76, 76, 0.1); + --vscode-testing-runAction: #73c991; + --vscode-textBlockQuote-background: rgba(127, 127, 127, 0.1); + --vscode-textBlockQuote-border: rgba(0, 122, 204, 0.5); + --vscode-textCodeBlock-background: rgba(10, 10, 10, 0.4); + --vscode-textLink-activeForeground: #3794ff; + --vscode-textLink-foreground: #3794ff; + --vscode-textPreformat-foreground: #d7ba7d; + --vscode-textSeparator-foreground: rgba(255, 255, 255, 0.18); + --vscode-titleBar-activeBackground: #3c3c3c; + --vscode-titleBar-activeForeground: #cccccc; + --vscode-titleBar-inactiveBackground: rgba(60, 60, 60, 0.6); + --vscode-titleBar-inactiveForeground: rgba(204, 204, 204, 0.6); + --vscode-toolbar-activeBackground: rgba(99, 102, 103, 0.31); + --vscode-toolbar-hoverBackground: rgba(90, 93, 94, 0.31); + --vscode-tree-indentGuidesStroke: #585858; + --vscode-tree-tableColumnsBorder: rgba(204, 204, 204, 0.13); + --vscode-tree-tableOddRowsBackground: rgba(204, 204, 204, 0.04); + --vscode-welcomePage-progress\.background: #3c3c3c; + --vscode-welcomePage-progress\.foreground: #3794ff; + --vscode-welcomePage-tileBackground: #252526; + --vscode-welcomePage-tileHoverBackground: #2c2c2d; + --vscode-welcomePage-tileShadow: rgba(0, 0, 0, 0.36); + --vscode-widget-shadow: rgba(0, 0, 0, 0.36); +} diff --git a/web-ide-main/extension/views/hdl/scripts/build-react-no-split.js b/web-ide-main/extension/views/hdl/scripts/build-react-no-split.js new file mode 100644 index 0000000..71673f1 --- /dev/null +++ b/web-ide-main/extension/views/hdl/scripts/build-react-no-split.js @@ -0,0 +1,22 @@ +#!/usr/bin/env node + +const rewire = require("rewire"); +const defaults = rewire("react-scripts/scripts/build.js"); +const config = defaults.__get__("config"); + +// Disable code splitting +config.optimization.splitChunks = { + cacheGroups: { + default: false, + }, +}; + +// Disable code chunks +config.optimization.runtimeChunk = false; + +// Rename main.{hash}.js to main.js +config.output.filename = "static/js/[name].js"; + +// Rename main.{hash}.css to main.css +config.plugins[5].options.filename = "static/css/[name].css"; +config.plugins[5].options.moduleFilename = () => "static/css/main.css"; diff --git a/web-ide-main/extension/views/hdl/src/App.tsx b/web-ide-main/extension/views/hdl/src/App.tsx new file mode 100644 index 0000000..f49317f --- /dev/null +++ b/web-ide-main/extension/views/hdl/src/App.tsx @@ -0,0 +1,160 @@ +import { makeVisualizationsWithId } from "@nand2tetris/components/chips/visualizations.js"; +import { Clockface } from "@nand2tetris/components/clockface.js"; +import { FullPinout } from "@nand2tetris/components/pinout.js"; +import { useChipPageStore } from "@nand2tetris/components/stores/chip.store.js"; +import * as Not from "@nand2tetris/projects/project_01/01_not.js"; +import { VSCodeButton, VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"; +import { + ReactNode, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from "react"; +import { VSCodeContext } from "./vscode"; + +function App() { + const { state, actions, dispatch } = useChipPageStore(); + const { api } = useContext(VSCodeContext); + + const [hdl, setHdl] = useState(Not.hdl); + const [loaded, setLoaded] = useState(false); + + const compile = useCallback( + async (hdl: string) => { + setHdl(hdl); + await actions.updateFiles({ hdl, tst: "// No test", cmp: "" }); + }, + [setHdl, actions], + ); + + const onMessage = useCallback( + ( + event: MessageEvent< + Partial<{ nand2tetris: boolean; hdl: string; chipName: string }> + >, + ) => { + if (!event.data?.nand2tetris) return; + if (event.data.hdl) compile(event.data.hdl ?? ""); + if (event.data.chipName) + dispatch.current({ + action: "updateChip", + payload: { + chipName: event.data.chipName, + }, + }); + setLoaded(true); + }, + [compile, dispatch], + ); + + useEffect(() => { + window.addEventListener("message", onMessage); + return () => { + window.removeEventListener("message", onMessage); + }; + }, [onMessage]); + + useEffect(() => { + api.postMessage({ nand2tetris: true, ready: true }); + }, [api]); + + const [useBuiltin, setUseBuiltin] = useState(false); + const toggleUseBuiltin = async () => { + if (useBuiltin) { + compile(hdl); + setUseBuiltin(false); + } else { + actions.toggleBuiltin(); + setUseBuiltin(true); + } + }; + + const clockActions = useMemo( + () => ({ + toggle() { + actions.clock(); + }, + reset() { + actions.reset(); + }, + }), + [actions], + ); + + const chipButtons = state.controls.error ? ( +

{state.controls.error?.message}

+ ) : ( + <> + Use Builtin +
+ + Eval + + + Clock:{"\u00a0"} + + + + Reset + +
+ + ); + + const visualizations: [string, ReactNode][] = makeVisualizationsWithId({ + parts: state.sim.chip, + }); + + const pinsPanel = ( + <> +

Chip {state.controls.chipName}

+ {chipButtons} + {state.sim.invalid ? ( +

Invalid Chip

+ ) : ( + <> + { + console.log("TODO: Handle Input Valid"); + }} + /> +

Visualizations

+ {visualizations.length > 0 ? ( + visualizations.map(([p, v]) =>
{v}
) + ) : ( +

None

+ )} + + )} + {/* DEBUG */} + + + ); + + return loaded ? ( + pinsPanel + ) : ( + <> +

HDL

+

Open an HDL chip to begin

+ + ); +} + +export default App; diff --git a/web-ide-main/extension/views/hdl/src/index.tsx b/web-ide-main/extension/views/hdl/src/index.tsx new file mode 100644 index 0000000..9029daa --- /dev/null +++ b/web-ide-main/extension/views/hdl/src/index.tsx @@ -0,0 +1,47 @@ +import { + FileSystem, + ObjectFileSystemAdapter, +} from "@davidsouther/jiffies/lib/esm/fs.js"; +import { useDialog } from "@nand2tetris/components/dialog"; +import { BaseContext } from "@nand2tetris/components/stores/base.context.js"; +import * as Not from "@nand2tetris/projects/project_01/01_not.js"; +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App"; +import { StatusSeverity } from "@nand2tetris/components/stores/base.context"; + +const baseContext: BaseContext = { + fs: new FileSystem( + new ObjectFileSystemAdapter({ "projects/01/Not.hdl": Not.hdl }), + ), + canUpgradeFs: false, + async upgradeFs() {}, + closeFs() {}, + storage: {}, + status: { message: "", severity: "INFO" }, + setStatus: (status: string | { message: string; severity?: StatusSeverity }): void => { + // api.postMessage({ nand2tetris: true, showMessage: status }); + if (typeof status === "string") { + console.log(status); + } else { + console.log(`${status.severity}: ${status.message}`); + } + + }, + permissionPrompt: {} as ReturnType, + // eslint-disable-next-line @typescript-eslint/no-empty-function + async requestPermission() {}, + // eslint-disable-next-line @typescript-eslint/no-empty-function + loadFs() {}, +}; + +const root = ReactDOM.createRoot( + document.getElementById("root") as HTMLElement, +); +root.render( + + + + + , +); diff --git a/web-ide-main/extension/views/hdl/src/react-app-env.d.ts b/web-ide-main/extension/views/hdl/src/react-app-env.d.ts new file mode 100644 index 0000000..6431bc5 --- /dev/null +++ b/web-ide-main/extension/views/hdl/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/web-ide-main/extension/views/hdl/src/setupTests.ts b/web-ide-main/extension/views/hdl/src/setupTests.ts new file mode 100644 index 0000000..1dd407a --- /dev/null +++ b/web-ide-main/extension/views/hdl/src/setupTests.ts @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import "@testing-library/jest-dom"; diff --git a/web-ide-main/extension/views/hdl/src/vscode.ts b/web-ide-main/extension/views/hdl/src/vscode.ts new file mode 100644 index 0000000..583c92e --- /dev/null +++ b/web-ide-main/extension/views/hdl/src/vscode.ts @@ -0,0 +1,6 @@ +import { createContext } from "react"; +import type { WebviewApi } from "vscode-webview"; + +const api: WebviewApi = acquireVsCodeApi?.(); + +export const VSCodeContext = createContext({ api }); diff --git a/web-ide-main/extension/views/hdl/tsconfig.json b/web-ide-main/extension/views/hdl/tsconfig.json new file mode 100644 index 0000000..f84bd12 --- /dev/null +++ b/web-ide-main/extension/views/hdl/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "outDir": "build", + "rootDir": "src" + }, + "include": ["src"] +} diff --git a/web-ide-main/package-lock.json b/web-ide-main/package-lock.json new file mode 100644 index 0000000..8a81638 --- /dev/null +++ b/web-ide-main/package-lock.json @@ -0,0 +1,29279 @@ +{ + "name": "@nand2tetris/web-ide", + "version": "2025.49.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@nand2tetris/web-ide", + "version": "2025.49.0", + "license": "ISC", + "workspaces": [ + "cli", + "components", + "extension", + "extension/views/hdl", + "projects", + "runner", + "simulator", + "web" + ], + "dependencies": { + "typescript": "^5.9.2" + }, + "devDependencies": { + "@biomejs/biome": "^2.1.4", + "concurrently": "^9.0.1", + "cross-env": "^7.0.3", + "shx": "^0.3.4" + }, + "engines": { + "node": ">=16", + "npm": ">=7" + } + }, + "cli": { + "name": "@nand2tetris/cli", + "license": "ISC", + "dependencies": { + "@types/node": "^20.14.2", + "@types/yargs": "^17.0.32", + "yargs": "^17.7.2" + }, + "bin": { + "nand2tetris": "dist/index.js" + }, + "devDependencies": { + "@davidsouther/jiffies": "^2.2.5", + "@nand2tetris/runner": "file:../runner", + "@nand2tetris/simulator": "file:../simulator" + } + }, + "components": { + "name": "@nand2tetris/components", + "version": "0.0.0", + "license": "ISC", + "dependencies": { + "@vscode/webview-ui-toolkit": "^1.4.0" + }, + "devDependencies": { + "@davidsouther/jiffies": "^2.2.5", + "@monaco-editor/react": "^4.6.0", + "@nand2tetris/projects": "file:../projects", + "@nand2tetris/simulator": "file:../simulator", + "@testing-library/jest-dom": "^6.4.5", + "@testing-library/react": "^16.0.0", + "@types/error-cause": "^1.0.4", + "@types/jest": "^29.5.12", + "@types/node": "^20.14.2", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/vscode": "^1.89.0", + "@types/wicg-file-system-access": "^2023.10.5", + "immer": "^10.1.1", + "make-plural": "^7.4.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.23.1", + "react-scripts": "^5.0.1", + "rxjs": "^7.8.1", + "sass": "^1.77.4", + "source-map-explorer": "^2.5.3" + } + }, + "components/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "components/node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "components/node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "components/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "components/node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "components/node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "components/node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "components/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "components/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "extension": { + "name": "@nand2tetris/vscode", + "version": "0.0.0", + "license": "ISC", + "dependencies": { + "gh-pages": "6.1.1", + "react-scripts": "5.0.1" + }, + "devDependencies": { + "@davidsouther/jiffies": "^2.0.6", + "@nand2tetris/simulator": "file:../simulator", + "@types/error-cause": "^1.0.1", + "@types/node": "^16.11.41", + "@types/vscode": "^1.74.0", + "@vscode/vsce": "^2.27.0", + "@vscode/webview-ui-toolkit": "^1.2.1", + "esbuild": "^0.15.18", + "ohm-js": "^17.1.0" + }, + "engines": { + "vscode": "^1.61.0" + }, + "optionalDependencies": { + "esbuild-windows-64": "^0.15.18" + } + }, + "extension/node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "extension/node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "extension/node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "extension/node_modules/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "extension/node_modules/@types/jest": { + "version": "27.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", + "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "extension/node_modules/@types/node": { + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", + "dev": true, + "license": "MIT" + }, + "extension/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "extension/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "extension/node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "extension/node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "extension/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "extension/node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "extension/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "extension/node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "extension/node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "extension/node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "extension/node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "extension/node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "extension/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "extension/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "extension/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "extension/views/hdl": { + "version": "0.0.0", + "dependencies": { + "@nand2tetris/components": "0.0.0", + "@nand2tetris/simulator": "0.0.0", + "gh-pages": "6.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "rewire": "^6.0.0", + "vsce": "^2.15.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^16.11.66", + "@types/react": "^18.0.26", + "@types/react-dom": "^18.0.10", + "@types/vscode-webview": "^1.57.1", + "react-scripts": "^5.0.1" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.0.tgz", + "integrity": "sha512-88Djs5vBvGbHQHf5ZZcaoNHo6Y8BKZkt3cw2iuJIQzLEgH4Ox6Tm4hjFhbqOxyYsgIG/eJbFEHpxRIfEEWv5Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.0.tgz", + "integrity": "sha512-O4aP3CLFNodg8eTHXECaH3B3CjicfzkxVtnrfLkOq0XNP7TIECGfHpK/C6vADZkWP75wzmdBnsIA8ksuJMk18g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.20.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.0.tgz", + "integrity": "sha512-OKHmb3/Kpm06HypvB3g6Q3zJuvyXcpxDpCS1PnU8OV6AJgSFaee/covXBcPbWc6XDDxtEPlbi3EMQ6nUiPaQtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.8.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.0.tgz", + "integrity": "sha512-+XvmZLLWPe67WXNZo9Oc9CrPj/Tm8QnHR92fFAFdnbzwNdCH1h+7UdpaQgRSBsMY+oW1kHXNUZQLdZ1gHX3ROw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.0.tgz", + "integrity": "sha512-o0psW8QWQ58fq3i24Q1K2XfS/jYTxr7O1HRcyUE9bV9NttLU+kYOH82Ixj8DGlMTOWgxm1Sss2QAfKK5UkSPxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.11.1.tgz", + "integrity": "sha512-0ZdsLRaOyLxtCYgyuqyWqGU5XQ9gGnjxgfoNTt1pvELGkkUFrMATABZFIq8gusM7N1qbqpVtwLOhk0d/3kacLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^4.2.0", + "@azure/msal-node": "^3.5.0", + "open": "^10.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", + "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.22.0.tgz", + "integrity": "sha512-JLWHzAW1aZ/L190Th56jN+2t3T1dMvXOs1obXYLEr3ZWi81vVmBCt0di3mPvTTOiWoE0Cf/4hVQ/LINilqjObA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/msal-common": "15.12.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.12.0.tgz", + "integrity": "sha512-4ucXbjVw8KJ5QBgnGJUeA07c8iznwlk5ioHIhI4ASXcXgcf2yRFhWzYOyWg/cI49LC9ekpFJeQtO3zjDTbl6TQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.7.3.tgz", + "integrity": "sha512-MoJxkKM/YpChfq4g2o36tElyzNUMG8mfD6u8NbuaPAsqfGpaw249khAcJYNoIOigUzRw45OjXCOrexE6ImdUxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/msal-common": "15.12.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz", + "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "license": "MIT" + }, + "node_modules/@biomejs/biome": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.3.tgz", + "integrity": "sha512-9w0uMTvPrIdvUrxazZ42Ib7t8Y2yoGLKLdNne93RLICmaHw7mcLv4PPb5LvZLJF3141gQHiCColOh/v6VWlWmg==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.2.3", + "@biomejs/cli-darwin-x64": "2.2.3", + "@biomejs/cli-linux-arm64": "2.2.3", + "@biomejs/cli-linux-arm64-musl": "2.2.3", + "@biomejs/cli-linux-x64": "2.2.3", + "@biomejs/cli-linux-x64-musl": "2.2.3", + "@biomejs/cli-win32-arm64": "2.2.3", + "@biomejs/cli-win32-x64": "2.2.3" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.3.tgz", + "integrity": "sha512-OrqQVBpadB5eqzinXN4+Q6honBz+tTlKVCsbEuEpljK8ASSItzIRZUA02mTikl3H/1nO2BMPFiJ0nkEZNy3B1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.3.tgz", + "integrity": "sha512-OCdBpb1TmyfsTgBAM1kPMXyYKTohQ48WpiN9tkt9xvU6gKVKHY4oVwteBebiOqyfyzCNaSiuKIPjmHjUZ2ZNMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.3.tgz", + "integrity": "sha512-g/Uta2DqYpECxG+vUmTAmUKlVhnGEcY7DXWgKP8ruLRa8Si1QHsWknPY3B/wCo0KgYiFIOAZ9hjsHfNb9L85+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.3.tgz", + "integrity": "sha512-q3w9jJ6JFPZPeqyvwwPeaiS/6NEszZ+pXKF+IczNo8Xj6fsii45a4gEEicKyKIytalV+s829ACZujQlXAiVLBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.3.tgz", + "integrity": "sha512-LEtyYL1fJsvw35CxrbQ0gZoxOG3oZsAjzfRdvRBRHxOpQ91Q5doRVjvWW/wepgSdgk5hlaNzfeqpyGmfSD0Eyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.3.tgz", + "integrity": "sha512-y76Dn4vkP1sMRGPFlNc+OTETBhGPJ90jY3il6jAfur8XWrYBQV3swZ1Jo0R2g+JpOeeoA0cOwM7mJG6svDz79w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.3.tgz", + "integrity": "sha512-Ms9zFYzjcJK7LV+AOMYnjN3pV3xL8Prxf9aWdDVL74onLn5kcvZ1ZMQswE5XHtnd/r/0bnUd928Rpbs14BzVmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.3.tgz", + "integrity": "sha512-gvCpewE7mBwBIpqk1YrUqNR4mCiyJm6UI3YWQQXkedSSEwzRdodRpaKhbdbHw1/hmTWOVXQ+Eih5Qctf4TCVOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", + "license": "CC0-1.0" + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "license": "CC0-1.0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@davidsouther/jiffies": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@davidsouther/jiffies/-/jiffies-2.2.5.tgz", + "integrity": "sha512-ZbuL28BWr7NfkRiW0PUSZJn5INGGRGHckqB1k05O+TPAXY1iiYaDhGaeYfxREjvlgfUQr+qXjwOawFafXjLlZw==", + "dependencies": { + "sass": "^1.49.9", + "typescript": "^4.7.1" + }, + "engines": { + "node": ">=20.0.9" + } + }, + "node_modules/@davidsouther/jiffies/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/core/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/expect/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@jest/expect/node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/expect/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/expect/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@lingui/babel-plugin-extract-messages": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-4.14.1.tgz", + "integrity": "sha512-X/2bKavX5HGaiLyGpGvw98XqrqKuTntD4IdLmwvCOh7c/pgM8u95brONixLFEBeLujba4IF+fvHo0RdlyOFKpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/cli": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-4.14.1.tgz", + "integrity": "sha512-4DUtjHg5fumZ+hX8bcGYGZw9A6F5JURTMrI8Z6MSkO26OeSHEtPcheGFiPYfNhFeON6fZWZmwgyV9kkb0+psug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.0", + "@babel/generator": "^7.21.1", + "@babel/parser": "^7.22.0", + "@babel/runtime": "^7.21.0", + "@babel/types": "^7.21.2", + "@lingui/babel-plugin-extract-messages": "4.14.1", + "@lingui/conf": "4.14.1", + "@lingui/core": "4.14.1", + "@lingui/format-po": "4.14.1", + "@lingui/message-utils": "4.14.1", + "babel-plugin-macros": "^3.0.1", + "chalk": "^4.1.0", + "chokidar": "3.5.1", + "cli-table": "^0.3.11", + "commander": "^10.0.0", + "convert-source-map": "^2.0.0", + "date-fns": "^3.6.0", + "esbuild": "^0.17.10", + "glob": "^7.1.4", + "inquirer": "^7.3.3", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "ora": "^5.1.0", + "pathe": "^1.1.0", + "pkg-up": "^3.1.0", + "pofile": "^1.1.4", + "pseudolocale": "^2.0.0", + "ramda": "^0.27.1", + "source-map": "^0.8.0-beta.0" + }, + "bin": { + "lingui": "dist/lingui.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lingui/cli/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/@lingui/cli/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@lingui/cli/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/@lingui/cli/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@lingui/cli/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/@lingui/conf": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-4.14.1.tgz", + "integrity": "sha512-LE/1RrVoMebQK+u4y6VQJdSwjOsMu4go/VR8m1eH0THn8vfkuLOYlPTIAHTWcoO+Ogi15p5TqHPfJcgVBy/NpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "jest-validate": "^29.4.3", + "jiti": "^1.17.1", + "lodash.get": "^4.4.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/conf/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@lingui/conf/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@lingui/conf/node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@lingui/conf/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@lingui/conf/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lingui/core": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@lingui/core/-/core-4.14.1.tgz", + "integrity": "sha512-3O6bnNzApWjb+jIdXa7G2VbrP6jZ5nfCeYSVloEYg6YFIfsQ3GunccK6I2nL80mWgr2qGP4VilGD+ODCeXHITA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/message-utils": "4.14.1", + "unraw": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/format-po": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@lingui/format-po/-/format-po-4.14.1.tgz", + "integrity": "sha512-SfT3/4LspwDq5KNyN+HUsDiF2IVMBk0LS6ruEG+vGOKNXzdSpnuxAT5E6wgGA/4/MG2UF9WKBzfkfOsYeXmSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lingui/conf": "4.14.1", + "@lingui/message-utils": "4.14.1", + "date-fns": "^3.6.0", + "pofile": "^1.1.4" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/macro": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-4.14.1.tgz", + "integrity": "sha512-kVAe78Sj4a74GJTOOqoAzxZgsgqPfcBFQC1akXMlAv9r4bX7zvbMov2cQVWjvix0waetwxo3oVqlSozsa8UPAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@babel/types": "^7.20.7", + "@lingui/conf": "4.14.1", + "@lingui/core": "4.14.1", + "@lingui/message-utils": "4.14.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@lingui/react": "^4.0.0", + "babel-plugin-macros": "2 || 3" + } + }, + "node_modules/@lingui/message-utils": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@lingui/message-utils/-/message-utils-4.14.1.tgz", + "integrity": "sha512-J6MzyTLNCzEnyR1Da188G81cRcQMbk/lyYnLWMzQjIELDX8bBBwNea91Sf5Zm+BB+ADWmmGTdUqRPAjDqT9Y5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@messageformat/parser": "^5.0.0", + "js-sha256": "^0.10.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/react": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@lingui/react/-/react-4.14.1.tgz", + "integrity": "sha512-oZ9Rw+vOXJuaZvI1o4ASAIbCSe7AchCxsKGc0Y3csduTEOisvhsLgh8UDA8LW1mRgVPh5yZYB+VbfDMDQSzHpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/core": "4.14.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@messageformat/parser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.1.tgz", + "integrity": "sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "moo": "^0.5.1" + } + }, + "node_modules/@microsoft/fast-element": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@microsoft/fast-element/-/fast-element-1.14.0.tgz", + "integrity": "sha512-zXvuSOzvsu8zDTy9eby8ix8VqLop2rwKRgp++ZN2kTCsoB3+QJVoaGD2T/Cyso2ViZQFXNpiNCVKfnmxBvmWkQ==", + "license": "MIT" + }, + "node_modules/@microsoft/fast-foundation": { + "version": "2.50.0", + "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.50.0.tgz", + "integrity": "sha512-8mFYG88Xea1jZf2TI9Lm/jzZ6RWR8x29r24mGuLojNYqIR2Bl8+hnswoV6laApKdCbGMPKnsAL/O68Q0sRxeVg==", + "license": "MIT", + "dependencies": { + "@microsoft/fast-element": "^1.14.0", + "@microsoft/fast-web-utilities": "^5.4.1", + "tabbable": "^5.2.0", + "tslib": "^1.13.0" + } + }, + "node_modules/@microsoft/fast-foundation/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@microsoft/fast-react-wrapper": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.3.25.tgz", + "integrity": "sha512-jKzmk2xJV93RL/jEFXEZgBvXlKIY4N4kXy3qrjmBfFpqNi3VjY+oUTWyMnHRMC5EUhIFxD+Y1VD4u9uIPX3jQw==", + "license": "MIT", + "dependencies": { + "@microsoft/fast-element": "^1.14.0", + "@microsoft/fast-foundation": "^2.50.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@microsoft/fast-web-utilities": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz", + "integrity": "sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==", + "license": "MIT", + "dependencies": { + "exenv-es6": "^1.1.1" + } + }, + "node_modules/@monaco-editor/loader": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.5.0.tgz", + "integrity": "sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "state-local": "^1.0.6" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.5.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@nand2tetris/cli": { + "resolved": "cli", + "link": true + }, + "node_modules/@nand2tetris/components": { + "resolved": "components", + "link": true + }, + "node_modules/@nand2tetris/projects": { + "resolved": "projects", + "link": true + }, + "node_modules/@nand2tetris/runner": { + "resolved": "runner", + "link": true + }, + "node_modules/@nand2tetris/simulator": { + "resolved": "simulator", + "link": true + }, + "node_modules/@nand2tetris/vscode": { + "resolved": "extension", + "link": true + }, + "node_modules/@nand2tetris/web": { + "resolved": "web", + "link": true + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz", + "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==", + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-babel/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-babel/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-babel/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-babel/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-replace/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-replace/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz", + "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==", + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "license": "MIT", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz", + "integrity": "sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", + "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/error-cause": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/error-cause/-/error-cause-1.0.4.tgz", + "integrity": "sha512-lMI90Dw+/Spic9xJ9UKysqa7a9izxxMpE3IUcMmsNvsbTOIBjW6b3FYc0roIJDlH+/I5kgaBezKJEUV5PWFqIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.13.tgz", + "integrity": "sha512-yCAeZl7a0DxgNVteXFHt9+uyFbqXGy/ShC4BlcHkoE0AfGXYv/BUiplV72DjMYXHDBXFjhvr6DD1NiRVfB4j8g==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.24", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz", + "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-1.0.6.tgz", + "integrity": "sha512-230RC8sFeHoT6sSUlRO6a8cAnclO06eeiq1QDfiv2FGCLWFvvERWgwIQD4FWqD9A69BN7Lzee4OXwoMVnnsWDw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/vscode": { + "version": "1.103.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.103.0.tgz", + "integrity": "sha512-o4hanZAQdNfsKecexq9L3eHICd0AAvdbLk6hA60UzGXbGH/q8b/9xv2RgR7vV3ZcHuyKVq7b37IGd/+gM4Tu+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/vscode-webview": { + "version": "1.57.5", + "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.5.tgz", + "integrity": "sha512-iBAUYNYkz+uk1kdsq05fEcoh8gJmwT3lqqFPN7MGyjQ3HVloViMdo7ZJ8DFIP8WOK74PjOEilosqAyxV2iUFUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/wicg-file-system-access": { + "version": "2023.10.6", + "resolved": "https://registry.npmjs.org/@types/wicg-file-system-access/-/wicg-file-system-access-2023.10.6.tgz", + "integrity": "sha512-YO/183gNRzZFSdKu+ikkD7ambAj4PhgjFAF2A/Mw/7wroSF6ne8r804RkpZzqrJ/F6DO2/IYlQF/ULOZ/bhKyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.0.tgz", + "integrity": "sha512-sOx1PKSuFwnIl7z4RN0Ls7N9AQawmR9r66eI5rFCzLDIs8HTIYrIpH9QjYWoX0lkgGrkLxXhi4QnK7MizPRrIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@vscode/vsce": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.32.0.tgz", + "integrity": "sha512-3EFJfsgrSftIqt3EtdRcAygy/OJ3hstyI1cDmIgkU9CFZW5C+3djr6mfosndCUqcVYuyjmxOK1xmFp/Bq7+NIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/identity": "^4.1.0", + "@vscode/vsce-sign": "^2.0.0", + "azure-devops-node-api": "^12.5.0", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "cockatiel": "^3.1.2", + "commander": "^6.2.1", + "form-data": "^4.0.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^7.5.2", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 16" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "node_modules/@vscode/vsce-sign": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.6.tgz", + "integrity": "sha512-j9Ashk+uOWCDHYDxgGsqzKq5FXW9b9MW7QqOIYZ8IYpneJclWTBeHZz2DJCSKQgo+JAqNcaRRE1hzIx0dswqAw==", + "dev": true, + "hasInstallScript": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optionalDependencies": { + "@vscode/vsce-sign-alpine-arm64": "2.0.5", + "@vscode/vsce-sign-alpine-x64": "2.0.5", + "@vscode/vsce-sign-darwin-arm64": "2.0.5", + "@vscode/vsce-sign-darwin-x64": "2.0.5", + "@vscode/vsce-sign-linux-arm": "2.0.5", + "@vscode/vsce-sign-linux-arm64": "2.0.5", + "@vscode/vsce-sign-linux-x64": "2.0.5", + "@vscode/vsce-sign-win32-arm64": "2.0.5", + "@vscode/vsce-sign-win32-x64": "2.0.5" + } + }, + "node_modules/@vscode/vsce-sign-alpine-arm64": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.5.tgz", + "integrity": "sha512-XVmnF40APwRPXSLYA28Ye+qWxB25KhSVpF2eZVtVOs6g7fkpOxsVnpRU1Bz2xG4ySI79IRuapDJoAQFkoOgfdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-alpine-x64": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.5.tgz", + "integrity": "sha512-JuxY3xcquRsOezKq6PEHwCgd1rh1GnhyH6urVEWUzWn1c1PC4EOoyffMD+zLZtFuZF5qR1I0+cqDRNKyPvpK7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-arm64": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.5.tgz", + "integrity": "sha512-z2Q62bk0ptADFz8a0vtPvnm6vxpyP3hIEYMU+i1AWz263Pj8Mc38cm/4sjzxu+LIsAfhe9HzvYNS49lV+KsatQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-x64": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.5.tgz", + "integrity": "sha512-ma9JDC7FJ16SuPXlLKkvOD2qLsmW/cKfqK4zzM2iJE1PbckF3BlR08lYqHV89gmuoTpYB55+z8Y5Fz4wEJBVDA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.5.tgz", + "integrity": "sha512-cdCwtLGmvC1QVrkIsyzv01+o9eR+wodMJUZ9Ak3owhcGxPRB53/WvrDHAFYA6i8Oy232nuen1YqWeEohqBuSzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm64": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.5.tgz", + "integrity": "sha512-Hr1o0veBymg9SmkCqYnfaiUnes5YK6k/lKFA5MhNmiEN5fNqxyPUCdRZMFs3Ajtx2OFW4q3KuYVRwGA7jdLo7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-x64": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.5.tgz", + "integrity": "sha512-XLT0gfGMcxk6CMRLDkgqEPTyG8Oa0OFe1tPv2RVbphSOjFWJwZgK3TYWx39i/7gqpDHlax0AP6cgMygNJrA6zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-win32-arm64": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.5.tgz", + "integrity": "sha512-hco8eaoTcvtmuPhavyCZhrk5QIcLiyAUhEso87ApAWDllG7djIrWiOCtqn48k4pHz+L8oCQlE0nwNHfcYcxOPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vscode/vsce-sign-win32-x64": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.5.tgz", + "integrity": "sha512-1ixKFGM2FwM+6kQS2ojfY3aAelICxjiCzeg4nTHpkeU1Tfs4RC+lVLrgq5NwcBC7ZLr6UfY3Ct3D6suPeOf7BQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vscode/vsce/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@vscode/vsce/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vscode/vsce/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@vscode/vsce/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@vscode/vsce/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/webview-ui-toolkit": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.4.0.tgz", + "integrity": "sha512-modXVHQkZLsxgmd5yoP3ptRC/G8NBDD+ob+ngPiWNQdlrH6H1xR/qgOBD85bfU3BhOB5sZzFWBwwhp9/SfoHww==", + "deprecated": "This package has been deprecated, https://github.com/microsoft/vscode-webview-ui-toolkit/issues/561", + "license": "MIT", + "dependencies": { + "@microsoft/fast-element": "^1.12.0", + "@microsoft/fast-foundation": "^2.49.4", + "@microsoft/fast-react-wrapper": "^0.3.22", + "tslib": "^2.6.2" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "license": "MIT" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/azure-devops-node-api": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", + "dev": true, + "license": "MIT", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-jest/node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-jest/node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-jest/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/babel-jest/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-jest/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-jest/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-jest/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/babel-jest/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "license": "MIT" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", + "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "license": "BSD-2-Clause" + }, + "node_modules/browserslist": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001741", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", + "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "license": "MIT" + }, + "node_modules/cheerio": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.12.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "license": "MIT", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cockatiel": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", + "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", + "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/create-jest/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/create-jest/node_modules/dedent": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/create-jest/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/create-jest/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/create-jest/node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/create-jest/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/create-jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest/node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/create-jest/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/create-jest/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-jest/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "license": "MIT", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "license": "CC0-1.0", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "license": "MIT" + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "license": "BSD-2-Clause" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.215", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.215.tgz", + "integrity": "sha512-TIvGp57UpeNetj/wV/xpFNpWGb0b/ROw372lHPx5Aafx02gjTBtWnEEcaSX3W2dLM3OSdGGyHX/cHl01JQsLaQ==", + "license": "ISC" + }, + "node_modules/email-addresses": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz", + "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==", + "license": "MIT" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exenv-es6": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exenv-es6/-/exenv-es6-1.1.1.tgz", + "integrity": "sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==", + "license": "MIT" + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expect/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/expect/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "license": "MIT" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gh-pages": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.1.1.tgz", + "integrity": "sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==", + "license": "MIT", + "dependencies": { + "async": "^3.2.4", + "commander": "^11.0.0", + "email-addresses": "^5.0.0", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^11.1.1", + "globby": "^6.1.0" + }, + "bin": { + "gh-pages": "bin/gh-pages.js", + "gh-pages-clean": "bin/gh-pages-clean.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gh-pages/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/gh-pages/node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/gh-pages/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hdl": { + "resolved": "extension/views/hdl", + "link": true + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-encoding-sniffer/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/html-encoding-sniffer/node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/immer": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.3.tgz", + "integrity": "sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "license": "MIT", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.1.3.tgz", + "integrity": "sha512-DI4PtTqzw9GwELFS41sdMK32Ajp3XZQ8iygeDMWkxlRhm7uUTOFSZFVZABFuxr0jvspn8MAYy54NxZCsuCTSOw==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.1.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.0.5", + "jest-validate": "30.1.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", + "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "devOptional": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/jest-haste-map": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.1.0.tgz", + "integrity": "sha512-JLeM84kNjpRkggcGpQLsV7B8W4LNUWz7oDNVnY1Vjj22b5/fAb3kk3htiD+4Na8bmJmjJR7rBtS2Rmq/NEcADg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.0.5", + "jest-worker": "30.1.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-resolve/node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-validate": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.1.0.tgz", + "integrity": "sha512-7P3ZlCFW/vhfQ8pE7zW6Oi4EzvuB4sgR72Q1INfW9m0FGo0GADYlPwIkf4CyPq7wq85g+kPMtPOHNAdWHeBOaA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.0.5", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-worker": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.1.0.tgz", + "integrity": "sha512-uvWcSjlwAAgIu133Tt77A05H7RIk3Ho8tZL50bQM2AkvLdluw9NG48lRCl3Dt+MOH719n/0nnb5YxUwcuJiKRA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.0.5", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "devOptional": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-ts-webcompat-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jest-ts-webcompat-resolver/-/jest-ts-webcompat-resolver-1.0.1.tgz", + "integrity": "sha512-6rz4gejsOd0SYq5F/DmVGvJlFPmiCqkoXhkNKhyL1Uaqz4GyFMBbGUoBK+koXHThQdq97Ev7XJiyZ8iusMpWgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "jest-resolve": "*" + } + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "license": "MIT", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "license": "MIT" + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watcher/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-watcher/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest/node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/jest/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest/node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/dedent": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest/node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest/node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-sha256": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", + "integrity": "sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/jsdom/node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/jsdom/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-plural": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.4.0.tgz", + "integrity": "sha512-4/gC9KVNTV6pvYg2gFeQYTW3mWaoJt7WZE5vrp1KnQDgW92JtYZnzmZT81oj/dUTqAIu0ufI2x3dkgu3bB1tYg==", + "dev": true, + "license": "Unicode-DFS-2016" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/monaco-editor": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.53.0.tgz", + "integrity": "sha512-0WNThgC6CMWNXXBxTbaYYcunj08iB5rnx4/G56UOPeL9UVIUGGHA1GR0EWIh9Ebabj7NpCRawQ5b0hfN1jQmYQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/trusted-types": "^1.0.6" + } + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "license": "ISC" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/napi-postinstall": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", + "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "devOptional": true, + "license": "MIT", + "peer": true, + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-abi": { + "version": "3.77.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.77.0.tgz", + "integrity": "sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "license": "MIT" + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.20.tgz", + "integrity": "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/ohm-js": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/ohm-js/-/ohm-js-17.2.1.tgz", + "integrity": "sha512-4cXF0G09fAYU9z61kTfkNbKK1Kz/sGEZ5NbVWHoe9Qi7VB7y+Spwk051CpUTfUENdlIr+vt8tMV4/LosTE2cDQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.1" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "license": "MIT", + "dependencies": { + "semver": "^5.1.0" + } + }, + "node_modules/parse-semver/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pofile": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", + "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "license": "CC0-1.0", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/postcss-svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/postcss-svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/postcss-svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pseudolocale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pseudolocale/-/pseudolocale-2.1.0.tgz", + "integrity": "sha512-af5fsrRvVwD+MBasBJvuDChT0KDqT0nEwD9NTgbtHJ16FKomWac9ua0z6YVNB4G9x9IOaiGWym62aby6n4tFMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "pseudolocale": "dist/cli.mjs" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/raw-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/raw.macro": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/raw.macro/-/raw.macro-0.5.0.tgz", + "integrity": "sha512-krMrBkTHbnXtEZEES1Ng9b/PYSTaf0eZwUR6WfIQx6+cGF7oPhJ0XDgwIOTkCBCylRz7Su1OoG17rouMt1egaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-macros": "^2.8.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/raw.macro/node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/raw.macro/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "license": "MIT", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/react-dev-utils/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-error-overlay": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==", + "license": "MIT" + }, + "node_modules/react-ga4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz", + "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rewire": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rewire/-/rewire-6.0.0.tgz", + "integrity": "sha512-7sZdz5dptqBCapJYocw9EcppLU62KMEqDLIILJnNET2iqzXHaQfaVP5SOJ06XvjX+dNIDJbzjw0ZWzrgDhtjYg==", + "license": "MIT", + "dependencies": { + "eslint": "^7.32.0" + } + }, + "node_modules/rewire/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/rewire/node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/rewire/node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/rewire/node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, + "node_modules/rewire/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/rewire/node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/rewire/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/rewire/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/rewire/node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/rewire/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/rewire/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/rewire/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", + "license": "CC0-1.0" + }, + "node_modules/sass": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", + "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "license": "MIT", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "license": "ISC" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shx": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", + "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.3", + "shelljs": "^0.8.5" + }, + "bin": { + "shx": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-explorer": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.3.tgz", + "integrity": "sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "btoa": "^1.2.1", + "chalk": "^4.1.0", + "convert-source-map": "^1.7.0", + "ejs": "^3.1.5", + "escape-html": "^1.0.3", + "glob": "^7.1.6", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "open": "^7.3.1", + "source-map": "^0.7.4", + "temp": "^0.9.4", + "yargs": "^16.2.0" + }, + "bin": { + "sme": "bin/cli.js", + "source-map-explorer": "bin/cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/source-map-explorer/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/source-map-explorer/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-explorer/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-explorer/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-explorer/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-explorer/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-explorer/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map-explorer/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "dev": true, + "license": "MIT" + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } + }, + "node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tabbable": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", + "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==", + "license": "MIT" + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/tailwindcss/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tailwindcss/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-fs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "license": "MIT", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.15.0.tgz", + "integrity": "sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "license": "MIT" + }, + "node_modules/unraw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", + "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "license": "MIT" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vsce": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", + "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", + "deprecated": "vsce has been renamed to @vscode/vsce. Install using @vscode/vsce instead.", + "license": "MIT", + "dependencies": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "keytar": "^7.7.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.4.23", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/vsce/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vsce/node_modules/azure-devops-node-api": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", + "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "license": "MIT", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/vsce/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vsce/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/vsce/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/vsce/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/vsce/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/vsce/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/vsce/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/vsce/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vsce/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "license": "MIT", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "license": "MIT", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", + "license": "MIT" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-window/node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "license": "Apache-2.0" + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "projects": { + "name": "@nand2tetris/projects", + "version": "0.0.0", + "license": "ISC", + "dependencies": { + "@davidsouther/jiffies": "^2.2.5" + } + }, + "runner": { + "name": "@nand2tetris/runner", + "version": "0.0.0", + "license": "ISC", + "dependencies": { + "@davidsouther/jiffies": "^2.2.5", + "@nand2tetris/projects": "file:../projects", + "@types/node": "^20.14.2" + } + }, + "simulator": { + "name": "@nand2tetris/simulator", + "version": "0.0.0", + "license": "ISC", + "dependencies": { + "@davidsouther/jiffies": "^2.2.5", + "@nand2tetris/projects": "file:../projects", + "@nand2tetris/runner": "file:../runner", + "@types/node": "^20.14.2", + "ohm-js": "^17.1.0", + "rxjs": "^7.8.1" + }, + "devDependencies": { + "@babel/preset-typescript": "^7.24.7", + "@types/jest": "^29.5.12", + "babel-jest": "^29.7.0", + "jest": "^29.7.0", + "jest-ts-webcompat-resolver": "^1.0.0" + } + }, + "web": { + "name": "@nand2tetris/web", + "version": "0.0.0", + "license": "ISC", + "devDependencies": { + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@davidsouther/jiffies": "^2.2.5", + "@lingui/cli": "^4.11.1", + "@lingui/macro": "^4.11.1", + "@lingui/react": "^4.11.1", + "@monaco-editor/react": "^4.6.0", + "@nand2tetris/components": "file:../components", + "@nand2tetris/projects": "file:../projects", + "@nand2tetris/simulator": "file:../simulator", + "@rollup/plugin-node-resolve": "^15.2.3", + "@testing-library/jest-dom": "^6.4.5", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.2", + "@types/error-cause": "^1.0.4", + "@types/jest": "^29.5.12", + "@types/node": "^20.14.2", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/vscode": "^1.89.0", + "@vscode/vsce": "^2.27.0", + "gh-pages": "^6.1.1", + "immer": "^10.1.1", + "jszip": "^3.10.1", + "make-plural": "^7.4.0", + "ohm-js": "^17.1.0", + "raw-loader": "^4.0.2", + "raw.macro": "^0.5.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-ga4": "^2.1.0", + "react-markdown": "^9.0.1", + "react-router-dom": "^6.23.1", + "react-scripts": "^5.0.1", + "remark-gfm": "^4.0.0", + "rxjs": "^7.8.1", + "sass": "^1.77.4", + "source-map-explorer": "^2.5.3", + "web-vitals": "^2.1.4" + } + }, + "web/node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "web/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "web/node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "web/node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "web/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "web/node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "web/node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "web/node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "web/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "web/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + } + } +} diff --git a/web-ide-main/package.json b/web-ide-main/package.json new file mode 100644 index 0000000..4d5e255 --- /dev/null +++ b/web-ide-main/package.json @@ -0,0 +1,63 @@ +{ + "name": "@nand2tetris/web-ide", + "version": "2025.49.0", + "description": "A Javascript implementation of nand2tetris.org.", + "repository": { + "type": "git", + "url": "git+https://github.com/nand2tetris/web-ide.git" + }, + "author": "David Souther ", + "license": "ISC", + "bugs": { + "url": "https://github.com/nand2tetris/web-ide/issues" + }, + "homepage": "https://github.com/nand2tetris/web-ide", + "scripts": { + "precli": "npm run build -w cli", + "cli": "node cli", + "ci": "cross-env CI=true npm run check && cross-env CI=true npm run test:ci", + "precheck": "npm -w web run extract && npm -w web run lingui", + "check": "npm run check:format && npm run check:types && npm run check:lint", + "clean": "shx rm -rf **/node_modules **/tsconfig.tsbuildinfo **/build", + "format": "biome format --write", + "fix": "biome check --write --unsafe", + "check:format": "biome format", + "check:lint": "biome check", + "precheck:types": "npm run build -w projects && npm run build -w runner && npm run build -w simulator && npm run build -w components", + "check:types": "tsc --build tsconfig.json", + "prebuild": "npm run check", + "build": "cross-env CI=true npm run build -w projects && cross-env CI=true npm run build -w runner && cross-env CI=true npm run build -w simulator && cross-env CI=true npm run build -w cli && cross-env CI=true npm run build -w components && cross-env CI=true npm run build -w web", + "build:extension": "cross-env CI=true npm run build -w extension", + "watch": "concurrently -k --restart-tries 3 \"npm run build -w components -- -w\" \"npm run build -w projects -- -w\" \"npm run build -w runner -- -w\" \"npm run build -w simulator -- -w\"", + "test:ci": "cross-env CI=true npm test -w simulator && cross-env CI=true npm test -w components && cross-env CI=true npm test -w web", + "pretest": "npm run build", + "test": "npm run test:ci", + "web": "npm run start -w web", + "start": "npm run web", + "preinstall-cli": "npm run build -w projects && npm run build -w runner && npm run build -w simulator && npm run build -w cli", + "install-cli": "npm i -g cli" + }, + "workspaces": [ + "cli", + "components", + "extension", + "extension/views/hdl", + "projects", + "runner", + "simulator", + "web" + ], + "engines": { + "node": ">=16", + "npm": ">=7" + }, + "devDependencies": { + "@biomejs/biome": "^2.1.4", + "concurrently": "^9.0.1", + "cross-env": "^7.0.3", + "shx": "^0.3.4" + }, + "dependencies": { + "typescript": "^5.9.2" + } +} diff --git a/web-ide-main/projects/package.json b/web-ide-main/projects/package.json new file mode 100644 index 0000000..32e3908 --- /dev/null +++ b/web-ide-main/projects/package.json @@ -0,0 +1,26 @@ +{ + "name": "@nand2tetris/projects", + "version": "0.0.0", + "private": true, + "description": "", + "author": "David Souther ", + "license": "ISC", + "homepage": "https://davidsouther.github.io/nand2tetris", + "type": "module", + "exports": { + "./*": "./build/*" + }, + "typesVersions": { + "*": { + "*": [ + "build/*" + ] + } + }, + "dependencies": { + "@davidsouther/jiffies": "^2.2.5" + }, + "scripts": { + "build": "tsc" + } +} diff --git a/web-ide-main/projects/src/base.ts b/web-ide-main/projects/src/base.ts new file mode 100644 index 0000000..37f7364 --- /dev/null +++ b/web-ide-main/projects/src/base.ts @@ -0,0 +1,254 @@ +export { FIBONACCI } from "./samples/vm/fibonnaci.js"; + +/** + * Duplicated for web from node:path. + * A parsed path object generated by path.parse() or consumed by path.format(). + */ + +export interface ParsedPath { + /** The root of the path such as '/' or 'c:\' */ + root: string; + /** The full directory path such as '/home/user/dir' or 'c:\path\dir' */ + dir: string; + /** The file name including extension (if any) such as 'index.html' */ + base: string; + /** The file extension (if any) such as '.html' */ + ext: string; + /** The file name without extension (if any) such as 'index' */ + name: string; +} + +export type Assignment = ParsedPath; + +// To rebuild this list of stubs using node.js: +// +// full = await import("./full.js") +// Object.entries(full.Assignments).map(([key, entry]) => ({key, entries: Object.keys(entry).reduce((a, b) => (a[b] = '', a), {})})).reduce(((a, b) => (a[b.key] = b.entries, a)), {}) +export const AssignmentStubs = { + Nand: { "Nand.tst": "", "Nand.cmp": "" }, + Not: { "Not.hdl": "", "Not.tst": "", "Not.cmp": "" }, + And: { "And.hdl": "", "And.tst": "", "And.cmp": "" }, + Or: { "Or.hdl": "", "Or.tst": "", "Or.cmp": "" }, + Xor: { "Xor.hdl": "", "Xor.tst": "", "Xor.cmp": "" }, + Mux: { "Mux.hdl": "", "Mux.tst": "", "Mux.cmp": "" }, + DMux: { "DMux.hdl": "", "DMux.tst": "", "DMux.cmp": "" }, + Not16: { "Not16.hdl": "", "Not16.tst": "", "Not16.cmp": "" }, + And16: { "And16.hdl": "", "And16.tst": "", "And16.cmp": "" }, + Or16: { "Or16.hdl": "", "Or16.tst": "", "Or16.cmp": "" }, + Mux16: { "Mux16.hdl": "", "Mux16.tst": "", "Mux16.cmp": "" }, + Mux4Way16: { "Mux4Way16.hdl": "", "Mux4Way16.tst": "", "Mux4Way16.cmp": "" }, + Mux8Way16: { "Mux8Way16.hdl": "", "Mux8Way16.tst": "", "Mux8Way16.cmp": "" }, + DMux4Way: { "DMux4Way.hdl": "", "DMux4Way.tst": "", "DMux4Way.cmp": "" }, + DMux8Way: { "DMux8Way.hdl": "", "DMux8Way.tst": "", "DMux8Way.cmp": "" }, + Or8Way: { "Or8Way.hdl": "", "Or8Way.tst": "", "Or8Way.cmp": "" }, + HalfAdder: { "HalfAdder.hdl": "", "HalfAdder.tst": "", "HalfAdder.cmp": "" }, + FullAdder: { "FullAdder.hdl": "", "FullAdder.tst": "", "FullAdder.cmp": "" }, + Add16: { "Add16.hdl": "", "Add16.tst": "", "Add16.cmp": "" }, + Inc16: { "Inc16.hdl": "", "Inc16.tst": "", "Inc16.cmp": "" }, + ALU: { + "ALU.hdl": "", + "ALU.tst": "", + "ALU.cmp": "", + "ALU-basic.tst": "", + "ALU-basic.cmp": "", + }, + Bit: { "Bit.hdl": "", "Bit.tst": "", "Bit.cmp": "" }, + Register: { "Register.hdl": "", "Register.tst": "", "Register.cmp": "" }, + PC: { "PC.hdl": "", "PC.tst": "", "PC.cmp": "" }, + RAM8: { "RAM8.hdl": "", "RAM8.tst": "", "RAM8.cmp": "" }, + RAM64: { "RAM64.hdl": "", "RAM64.tst": "", "RAM64.cmp": "" }, + RAM512: { "RAM512.hdl": "", "RAM512.tst": "", "RAM512.cmp": "" }, + RAM4K: { "RAM4K.hdl": "", "RAM4K.tst": "", "RAM4K.cmp": "" }, + RAM16K: { "RAM16K.hdl": "", "RAM16K.tst": "", "RAM16K.cmp": "" }, + Memory: { "Memory.hdl": "", "Memory.tst": "", "Memory.cmp": "" }, + CPU: { + "CPU.hdl": "", + "CPU.tst": "", + "CPU.cmp": "", + "CPU-external.tst": "", + "CPU-external.cmp": "", + }, + Computer: { + "Computer.hdl": "", + "ComputerAdd.tst": "", + "ComputerAdd.cmp": "", + "ComputerMax.tst": "", + "ComputerMax.cmp": "", + "ComputerRect.tst": "", + "ComputerRect.cmp": "", + }, + SimpleAdd: { + "SimpleAdd.vm": "", + "SimpleAddVME.tst": "", + "SimpleAdd.cmp": "", + "SimpleAdd.tst": "", + }, + StackTest: { + "StackTest.vm": "", + "StackTestVME.tst": "", + "StackTest.cmp": "", + "StackTest.tst": "", + }, + BasicTest: { + "BasicTest.vm": "", + "BasicTestVME.tst": "", + "BasicTest.cmp": "", + "BasicTest.tst": "", + }, + PointerTest: { + "PointerTest.vm": "", + "PointerTestVME.tst": "", + "PointerTest.cmp": "", + "PointerTest.tst": "", + }, + StaticTest: { + "StaticTest.vm": "", + "StaticTestVME.tst": "", + "StaticTest.cmp": "", + "StaticTest.tst": "", + }, + BasicLoop: { + "BasicLoop.vm": "", + "BasicLoopVME.tst": "", + "BasicLoop.cmp": "", + "BasicLoop.tst": "", + }, + FibonacciSeries: { + "FibonacciSeries.vm": "", + "FibonacciSeriesVME.tst": "", + "FibonacciSeries.cmp": "", + "FibonacciSeries.tst": "", + }, + SimpleFunction: { + "SimpleFunction.vm": "", + "SimpleFunctionVME.tst": "", + "SimpleFunction.cmp": "", + "SimpleFunction.tst": "", + }, + NestedCall: { + "Sys.vm": "", + "NestedCallVME.tst": "", + "NestedCall.cmp": "", + "NestedCall.tst": "", + }, + FibonacciElement: { + "Sys.vm": "", + "Main.vm": "", + "FibonacciElementVME.tst": "", + "FibonacciElement.cmp": "", + "FibonacciElement.tst": "", + }, + StaticsTest: { + "Class1.vm": "", + "Class2.vm": "", + "Sys.vm": "", + "StaticsTestVME.tst": "", + "StaticsTest.cmp": "", + "StaticsTest.tst": "", + }, +}; + +export const BUILTIN_CHIP_PROJECTS: Record< + "01" | "02" | "03" | "05", + string[] +> = { + "01": ["Nand"], + "02": [], + "03": ["DFF"], + "05": ["Screen", "Keyboard", "DRegister", "ARegister", "ROM32K", "RAM16K"], +}; + +export const CHIP_PROJECTS: Record<"01" | "02" | "03" | "05", string[]> = { + "01": [ + "Not", + "And", + "Or", + "Xor", + "Mux", + "DMux", + "Not16", + "And16", + "Or16", + "Mux16", + "Or8Way", + "Mux4Way16", + "Mux8Way16", + "DMux4Way", + "DMux8Way", + ], + "02": [ + "HalfAdder", + "FullAdder", + "Add16", + "Inc16", + "ALU", + // "ALUAll", // Special secret undocumented ALU tests + ], + "03": ["Bit", "Register", "RAM8", "RAM64", "RAM512", "RAM4K", "RAM16K", "PC"], + "05": ["Memory", "CPU", "Computer"], +}; + +export const CHIP_ORDER: Partial> = + { + "05": [ + "Memory", + "CPU", + "Computer", + "Screen", + "Keyboard", + "DRegister", + "ARegister", + "ROM32K", + "RAM16K", + ], + }; + +export const ASM_PROJECTS: Record<"06", string[]> = { + "06": ["Add", "Max", "Rectangle", "Pong"], +}; + +export const VM_PROJECTS: Record<"07" | "08", string[]> = { + "07": ["SimpleAdd", "StackTest", "BasicTest", "PointerTest", "StaticTest"], + "08": [ + "BasicLoop", + "FibonacciSeries", + "SimpleFunction", + "NestedCall", + "FibonacciElement", + "StaticsTest", + ], +}; + +function partitionChips(project: "01" | "02" | "03" | "05", chips: string[]) { + const base = CHIP_PROJECTS[project]; + // Get all the default project chips, in order, and remove those that aren't in `chips`. + const core = base.filter((name) => chips.includes(name)); + // Get all the chips that aren't in base. + const rest = chips.filter((name) => !base.includes(name)); + rest.sort(); + return [...core, ...rest]; +} + +export function sortChips(project: string, chips: string[]): string[] { + switch (project) { + case "1": + case "01": { + return partitionChips("01", chips); + } + case "2": + case "02": { + return partitionChips("02", chips); + } + case "3": + case "03": { + return partitionChips("03", chips); + } + case "5": + case "05": { + return partitionChips("05", chips); + } + default: + chips.sort(); + return chips; + } +} diff --git a/web-ide-main/projects/src/full.ts b/web-ide-main/projects/src/full.ts new file mode 100644 index 0000000..13a859f --- /dev/null +++ b/web-ide-main/projects/src/full.ts @@ -0,0 +1,74 @@ +import { FileSystem, Tree } from "@davidsouther/jiffies/lib/esm/fs.js"; + +import * as project_01 from "./project_01/index.js"; +import * as project_02 from "./project_02/index.js"; +import * as project_03 from "./project_03/index.js"; +import * as project_04 from "./project_04/index.js"; +import * as project_05 from "./project_05/index.js"; +import * as project_07 from "./project_07/index.js"; +import * as project_08 from "./project_08/index.js"; +import { reset } from "./reset.js"; +import * as project_06 from "./samples/project_06/index.js"; + +export const ChipProjects = { + "01": project_01, + "02": project_02, + "03": project_03, + "05": project_05, +}; + +export const VmProjects = { + "07": project_07, + "08": project_08, +}; + +export const Projects = { + "1": project_01, + "2": project_02, + "3": project_03, + "4": project_04, + "5": project_05, + "6": project_06, + "7": project_07, + "8": project_08, +}; + +export const ProjectIDs: (keyof typeof Projects)[] = Object.keys( + Projects, +) as unknown as (keyof typeof Projects)[]; + +const ProjectFiles: Record = { + "1": project_01.CHIPS, + "2": project_02.CHIPS, + "3": project_03.CHIPS, + "4": project_04.TESTS, + "5": project_05.CHIPS, + "6": project_06.FILES, + "7": project_07.VMS, + "8": project_08.VMS, +}; + +export const resetFiles = async (fs: FileSystem, projects = ProjectIDs) => { + for (const project of projects) { + await Projects[project as keyof typeof Projects].resetFiles(fs); + } +}; + +export const resetTests = async (fs: FileSystem, projects = ProjectIDs) => { + for (const project of projects) { + await Projects[project as keyof typeof Projects].resetTests(fs); + } +}; + +export const createFiles = async (fs: FileSystem) => { + await reset(fs, ProjectFiles, "/", false); +}; + +export const Assignments = { + ...project_01.CHIPS, + ...project_02.CHIPS, + ...project_03.CHIPS, + ...project_05.CHIPS, + ...project_07.VMS, + ...project_08.VMS, +}; diff --git a/web-ide-main/projects/src/loader.ts b/web-ide-main/projects/src/loader.ts new file mode 100644 index 0000000..d575f89 --- /dev/null +++ b/web-ide-main/projects/src/loader.ts @@ -0,0 +1,36 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { type Projects } from "./full.js"; + +export async function resetFiles( + fs: FileSystem, + projects?: (keyof typeof Projects)[], +) { + await (await import("./full.js")).resetFiles(fs, projects); +} + +export async function resetTests( + fs: FileSystem, + projects?: (keyof typeof Projects)[], +) { + await (await import("./full.js")).resetTests(fs, projects); +} + +export async function createFiles(fs: FileSystem) { + await (await import("./full.js")).createFiles(fs); +} + +export async function loadSamples(fs: FileSystem) { + (await import("./samples/index.js")).loadSamples(fs); +} + +export async function loadSolutions(fs: FileSystem) { + (await import("./testing/index.js")).loadSolutions(fs); +} + +export const loaders = { + resetFiles, + loadSolutions, + loadSamples, +}; + +export default loaders; diff --git a/web-ide-main/projects/src/project_01/00_nand.ts b/web-ide-main/projects/src/project_01/00_nand.ts new file mode 100644 index 0000000..95c054b --- /dev/null +++ b/web-ide-main/projects/src/project_01/00_nand.ts @@ -0,0 +1,48 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Nand.hdl +/** + * Nand gate: + * if (a and b) out = 0, else out = 1 + */ +CHIP Nand { + IN a, b; + OUT out; + + PARTS: + BUILTIN Nand; +}`; + +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Nand.tst + +output-list a b out; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output;`; + +export const cmp = `| a | b |out| +| 0 | 0 | 1 | +| 0 | 1 | 1 | +| 1 | 0 | 1 | +| 1 | 1 | 0 |`; diff --git a/web-ide-main/projects/src/project_01/01_not.ts b/web-ide-main/projects/src/project_01/01_not.ts new file mode 100644 index 0000000..f4b1342 --- /dev/null +++ b/web-ide-main/projects/src/project_01/01_not.ts @@ -0,0 +1,34 @@ +export const cmp = `|in |out| +| 0 | 1 | +| 1 | 0 |`; +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Not.hdl +/** + * Not gate: + * if (in) out = 0, else out = 1 + */ +CHIP Not { + IN in; + OUT out; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Not.tst + +load Not.hdl, +compare-to Not.cmp, +output-list in out; + +set in 0, +eval, +output; + +set in 1, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_01/02_and.ts b/web-ide-main/projects/src/project_01/02_and.ts new file mode 100644 index 0000000..8ea9ce3 --- /dev/null +++ b/web-ide-main/projects/src/project_01/02_and.ts @@ -0,0 +1,49 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/And.hdl +/** + * And gate: + * if (a and b) out = 1, else out = 0 + */ +CHIP And { + IN a, b; + OUT out; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/And.tst + +load And.hdl, +compare-to And.cmp, +output-list a b out; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output;`; + +export const cmp = `| a | b |out| +| 0 | 0 | 0 | +| 0 | 1 | 0 | +| 1 | 0 | 0 | +| 1 | 1 | 1 |`; diff --git a/web-ide-main/projects/src/project_01/03_or.ts b/web-ide-main/projects/src/project_01/03_or.ts new file mode 100644 index 0000000..a8af547 --- /dev/null +++ b/web-ide-main/projects/src/project_01/03_or.ts @@ -0,0 +1,48 @@ +export const cmp = `| a | b |out| +| 0 | 0 | 0 | +| 0 | 1 | 1 | +| 1 | 0 | 1 | +| 1 | 1 | 1 |`; +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Or.hdl +/** + * Or gate: + * if (a or b) out = 1, else out = 0 + */ +CHIP Or { + IN a, b; + OUT out; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Or.tst + +load Or.hdl, +compare-to Or.cmp, +output-list a b out; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_01/04_xor.ts b/web-ide-main/projects/src/project_01/04_xor.ts new file mode 100644 index 0000000..5fad3e6 --- /dev/null +++ b/web-ide-main/projects/src/project_01/04_xor.ts @@ -0,0 +1,48 @@ +export const cmp = `| a | b |out| +| 0 | 0 | 0 | +| 0 | 1 | 1 | +| 1 | 0 | 1 | +| 1 | 1 | 0 |`; +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Xor.hdl +/** + * Exclusive-or gate: + * if ((a and Not(b)) or (Not(a) and b)) out = 1, else out = 0 + */ +CHIP Xor { + IN a, b; + OUT out; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Xor.tst + +load Xor.hdl, +compare-to Xor.cmp, +output-list a b out; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_01/05_mux.ts b/web-ide-main/projects/src/project_01/05_mux.ts new file mode 100644 index 0000000..8e3238f --- /dev/null +++ b/web-ide-main/projects/src/project_01/05_mux.ts @@ -0,0 +1,72 @@ +export const cmp = `| a | b |sel|out| +| 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 0 | +| 0 | 1 | 0 | 0 | +| 0 | 1 | 1 | 1 | +| 1 | 0 | 0 | 1 | +| 1 | 0 | 1 | 0 | +| 1 | 1 | 0 | 1 | +| 1 | 1 | 1 | 1 |`; +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Mux.hdl +/** + * Multiplexor: + * if (sel = 0) out = a, else out = b + */ +CHIP Mux { + IN a, b, sel; + OUT out; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Mux.tst + +load Mux.hdl, +compare-to Mux.cmp, +output-list a b sel out; + +set a 0, +set b 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a 0, +set b 1, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a 1, +set b 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a 1, +set b 1, +set sel 0, +eval, +output; + +set sel 1, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_01/06_dmux.ts b/web-ide-main/projects/src/project_01/06_dmux.ts new file mode 100644 index 0000000..8b08908 --- /dev/null +++ b/web-ide-main/projects/src/project_01/06_dmux.ts @@ -0,0 +1,48 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/DMux.hdl +/** + * Demultiplexor: + * [a, b] = [in, 0] if sel = 0 + * [0, in] if sel = 1 + */ +CHIP DMux { + IN in, sel; + OUT a, b; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/DMux.tst + +load DMux.hdl, +compare-to DMux.cmp, +output-list in sel a b; + +set in 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set in 1, +set sel 0, +eval, +output; + +set sel 1, +eval, +output;`; + +export const cmp = `|in |sel| a | b | +| 0 | 0 | 0 | 0 | +| 0 | 1 | 0 | 0 | +| 1 | 0 | 1 | 0 | +| 1 | 1 | 0 | 1 |`; diff --git a/web-ide-main/projects/src/project_01/07_not16.ts b/web-ide-main/projects/src/project_01/07_not16.ts new file mode 100644 index 0000000..4bda9a4 --- /dev/null +++ b/web-ide-main/projects/src/project_01/07_not16.ts @@ -0,0 +1,50 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/01/Not16.hdl +/** + * 16-bit Not gate: + * for i = 0, ..., 15: + * out[i] = Not(a[i]) + */ +CHIP Not16 { + IN in[16]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Not16.tst + +load Not16.hdl, +compare-to Not16.cmp, +output-list in%B1.16.1 out%B1.16.1; + +set in %B0000000000000000, +eval, +output; + +set in %B1111111111111111, +eval, +output; + +set in %B1010101010101010, +eval, +output; + +set in %B0011110011000011, +eval, +output; + +set in %B0001001000110100, +eval, +output;`; +export const cmp = `| in | out | +| 0000000000000000 | 1111111111111111 | +| 1111111111111111 | 0000000000000000 | +| 1010101010101010 | 0101010101010101 | +| 0011110011000011 | 1100001100111100 | +| 0001001000110100 | 1110110111001011 |`; diff --git a/web-ide-main/projects/src/project_01/08_and16.ts b/web-ide-main/projects/src/project_01/08_and16.ts new file mode 100644 index 0000000..f208a22 --- /dev/null +++ b/web-ide-main/projects/src/project_01/08_and16.ts @@ -0,0 +1,62 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/And16.hdl +/** + * 16-bit And gate: + * for i = 0, ..., 15: + * out[i] = a[i] And b[i] + */ +CHIP And16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/And16.tst + +load And16.hdl, +compare-to And16.cmp, +output-list a%B1.16.1 b%B1.16.1 out%B1.16.1; + +set a %B0000000000000000, +set b %B0000000000000000, +eval, +output; + +set a %B0000000000000000, +set b %B1111111111111111, +eval, +output; + +set a %B1111111111111111, +set b %B1111111111111111, +eval, +output; + +set a %B1010101010101010, +set b %B0101010101010101, +eval, +output; + +set a %B0011110011000011, +set b %B0000111111110000, +eval, +output; + +set a %B0001001000110100, +set b %B1001100001110110, +eval, +output;`; + +export const cmp = `| a | b | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0000000000000000 | +| 1111111111111111 | 1111111111111111 | 1111111111111111 | +| 1010101010101010 | 0101010101010101 | 0000000000000000 | +| 0011110011000011 | 0000111111110000 | 0000110011000000 | +| 0001001000110100 | 1001100001110110 | 0001000000110100 |`; diff --git a/web-ide-main/projects/src/project_01/09_or16.ts b/web-ide-main/projects/src/project_01/09_or16.ts new file mode 100644 index 0000000..81852cd --- /dev/null +++ b/web-ide-main/projects/src/project_01/09_or16.ts @@ -0,0 +1,61 @@ +export const cmp = `| a | b | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1111111111111111 | +| 1111111111111111 | 1111111111111111 | 1111111111111111 | +| 1010101010101010 | 0101010101010101 | 1111111111111111 | +| 0011110011000011 | 0000111111110000 | 0011111111110011 | +| 0001001000110100 | 1001100001110110 | 1001101001110110 |`; +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Or16.hdl +/** + * 16-bit Or gate: + * for i = 0, ..., 15: + * out[i] = a[i] Or b[i] + */ +CHIP Or16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Or16.tst + +load Or16.hdl, +compare-to Or16.cmp, +output-list a%B1.16.1 b%B1.16.1 out%B1.16.1; + +set a %B0000000000000000, +set b %B0000000000000000, +eval, +output; + +set a %B0000000000000000, +set b %B1111111111111111, +eval, +output; + +set a %B1111111111111111, +set b %B1111111111111111, +eval, +output; + +set a %B1010101010101010, +set b %B0101010101010101, +eval, +output; + +set a %B0011110011000011, +set b %B0000111111110000, +eval, +output; + +set a %B0001001000110100, +set b %B1001100001110110, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_01/10_mux16.ts b/web-ide-main/projects/src/project_01/10_mux16.ts new file mode 100644 index 0000000..4041639 --- /dev/null +++ b/web-ide-main/projects/src/project_01/10_mux16.ts @@ -0,0 +1,73 @@ +export const cmp = `| a | b |sel| out | +| 0000000000000000 | 0000000000000000 | 0 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 1 | 0000000000000000 | +| 0000000000000000 | 0001001000110100 | 0 | 0000000000000000 | +| 0000000000000000 | 0001001000110100 | 1 | 0001001000110100 | +| 1001100001110110 | 0000000000000000 | 0 | 1001100001110110 | +| 1001100001110110 | 0000000000000000 | 1 | 0000000000000000 | +| 1010101010101010 | 0101010101010101 | 0 | 1010101010101010 | +| 1010101010101010 | 0101010101010101 | 1 | 0101010101010101 |`; +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Mux16.hdl +/** + * 16-bit multiplexor: + * for i = 0, ..., 15: + * if (sel = 0) out[i] = a[i], else out[i] = b[i] + */ +CHIP Mux16 { + IN a[16], b[16], sel; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Mux16.tst + +load Mux16.hdl, +compare-to Mux16.cmp, +output-list a%B1.16.1 b%B1.16.1 sel out%B1.16.1; + +set a 0, +set b 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a %B0000000000000000, +set b %B0001001000110100, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a %B1001100001110110, +set b %B0000000000000000, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a %B1010101010101010, +set b %B0101010101010101, +set sel 0, +eval, +output; + +set sel 1, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_01/11_mux4way16.ts b/web-ide-main/projects/src/project_01/11_mux4way16.ts new file mode 100644 index 0000000..88662c7 --- /dev/null +++ b/web-ide-main/projects/src/project_01/11_mux4way16.ts @@ -0,0 +1,75 @@ +export const cmp = `| a | b | c | d | sel | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 00 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 01 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 10 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 11 | 0000000000000000 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | 0101010101010101 | 00 | 0001001000110100 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | 0101010101010101 | 01 | 1001100001110110 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | 0101010101010101 | 10 | 1010101010101010 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | 0101010101010101 | 11 | 0101010101010101 |`; +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Mux4Way16.hdl +/** + * 4-way 16-bit multiplexor: + * out = a if sel = 00 + * b if sel = 01 + * c if sel = 10 + * d if sel = 11 + */ +CHIP Mux4Way16 { + IN a[16], b[16], c[16], d[16], sel[2]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Mux4Way16.tst + +load Mux4Way16.hdl, +compare-to Mux4Way16.cmp, +output-list a%B1.16.1 b%B1.16.1 c%B1.16.1 d%B1.16.1 sel%B2.2.2 out%B1.16.1; + +set a 0, +set b 0, +set c 0, +set d 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set sel 2, +eval, +output; + +set sel 3, +eval, +output; + +set a %B0001001000110100, +set b %B1001100001110110, +set c %B1010101010101010, +set d %B0101010101010101, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set sel 2, +eval, +output; + +set sel 3, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_01/12_mux8way16.ts b/web-ide-main/projects/src/project_01/12_mux8way16.ts new file mode 100644 index 0000000..71f40cb --- /dev/null +++ b/web-ide-main/projects/src/project_01/12_mux8way16.ts @@ -0,0 +1,129 @@ +export const cmp = `| a | b | c | d | e | f | g | h | sel | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 000 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 001 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 010 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 011 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 100 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 101 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 110 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 111 | 0000000000000000 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 000 | 0001001000110100 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 001 | 0010001101000101 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 010 | 0011010001010110 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 011 | 0100010101100111 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 100 | 0101011001111000 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 101 | 0110011110001001 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 110 | 0111100010011010 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 111 | 1000100110101011 |`; +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Mux8Way16.hdl +/** + * 8-way 16-bit multiplexor: + * out = a if sel = 000 + * b if sel = 001 + * c if sel = 010 + * d if sel = 011 + * e if sel = 100 + * f if sel = 101 + * g if sel = 110 + * h if sel = 111 + */ +CHIP Mux8Way16 { + IN a[16], b[16], c[16], d[16], + e[16], f[16], g[16], h[16], + sel[3]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Mux8Way16.tst + +load Mux8Way16.hdl, +compare-to Mux8Way16.cmp, +output-list a%B1.16.1 b%B1.16.1 c%B1.16.1 d%B1.16.1 e%B1.16.1 f%B1.16.1 g%B1.16.1 h%B1.16.1 sel%B2.3.2 out%B1.16.1; + +set a 0, +set b 0, +set c 0, +set d 0, +set e 0, +set f 0, +set g 0, +set h 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set sel 2, +eval, +output; + +set sel 3, +eval, +output; + +set sel 4, +eval, +output; + +set sel 5, +eval, +output; + +set sel 6, +eval, +output; + +set sel 7, +eval, +output; + +set a %B0001001000110100, +set b %B0010001101000101, +set c %B0011010001010110, +set d %B0100010101100111, +set e %B0101011001111000, +set f %B0110011110001001, +set g %B0111100010011010, +set h %B1000100110101011, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set sel 2, +eval, +output; + +set sel 3, +eval, +output; + +set sel 4, +eval, +output; + +set sel 5, +eval, +output; + +set sel 6, +eval, +output; + +set sel 7, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_01/13_dmux4way.ts b/web-ide-main/projects/src/project_01/13_dmux4way.ts new file mode 100644 index 0000000..d391617 --- /dev/null +++ b/web-ide-main/projects/src/project_01/13_dmux4way.ts @@ -0,0 +1,70 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/DMux4Way.hdl +/** + * 4-way demultiplexor: + * [a, b, c, d] = [in, 0, 0, 0] if sel = 00 + * [0, in, 0, 0] if sel = 01 + * [0, 0, in, 0] if sel = 10 + * [0, 0, 0, in] if sel = 11 + */ +CHIP DMux4Way { + IN in, sel[2]; + OUT a, b, c, d; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/DMux4Way.tst + +load DMux4Way.hdl, +compare-to DMux4Way.cmp, +output-list in sel%B2.2.2 a b c d; + +set in 0, +set sel %B00, +eval, +output; + +set sel %B01, +eval, +output; + +set sel %B10, +eval, +output; + +set sel %B11, +eval, +output; + +set in 1, +set sel %B00, +eval, +output; + +set sel %B01, +eval, +output; + +set sel %B10, +eval, +output; + +set sel %B11, +eval, +output;`; + +export const cmp = `|in | sel | a | b | c | d | +| 0 | 00 | 0 | 0 | 0 | 0 | +| 0 | 01 | 0 | 0 | 0 | 0 | +| 0 | 10 | 0 | 0 | 0 | 0 | +| 0 | 11 | 0 | 0 | 0 | 0 | +| 1 | 00 | 1 | 0 | 0 | 0 | +| 1 | 01 | 0 | 1 | 0 | 0 | +| 1 | 10 | 0 | 0 | 1 | 0 | +| 1 | 11 | 0 | 0 | 0 | 1 |`; diff --git a/web-ide-main/projects/src/project_01/14_dmux8way.ts b/web-ide-main/projects/src/project_01/14_dmux8way.ts new file mode 100644 index 0000000..b554ca8 --- /dev/null +++ b/web-ide-main/projects/src/project_01/14_dmux8way.ts @@ -0,0 +1,115 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/DMux8Way.hdl +/** + * 8-way demultiplexor: + * [a, b, c, d, e, f, g, h] = [in, 0, 0, 0, 0, 0, 0, 0] if sel = 000 + * [0, in, 0, 0, 0, 0, 0, 0] if sel = 001 + * [0, 0, in, 0, 0, 0, 0, 0] if sel = 010 + * [0, 0, 0, in, 0, 0, 0, 0] if sel = 011 + * [0, 0, 0, 0, in, 0, 0, 0] if sel = 100 + * [0, 0, 0, 0, 0, in, 0, 0] if sel = 101 + * [0, 0, 0, 0, 0, 0, in, 0] if sel = 110 + * [0, 0, 0, 0, 0, 0, 0, in] if sel = 111 + */ +CHIP DMux8Way { + IN in, sel[3]; + OUT a, b, c, d, e, f, g, h; + + PARTS: + //// Replace this comment with your code. +}`; + +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/DMux8Way.tst + +load DMux8Way.hdl, +compare-to DMux8Way.cmp, +output-list in sel%B2.3.2 a b c d e f g h; + +set in 0, +set sel %B000, +eval, +output; + +set sel %B001, +eval, +output; + +set sel %B010, +eval, +output; + +set sel %B011, +eval, +output; + +set sel %B100, +eval, +output; + +set sel %B101, +eval, +output; + +set sel %B110, +eval, +output; + +set sel %B111, +eval, +output; + +set in 1, +set sel %B000, +eval, +output; + +set sel %B001, +eval, +output; + +set sel %B010, +eval, +output; + +set sel %B011, +eval, +output; + +set sel %B100, +eval, +output; + +set sel %B101, +eval, +output; + +set sel %B110, +eval, +output; + +set sel %B111, +eval, +output;`; + +export const cmp = `|in | sel | a | b | c | d | e | f | g | h | +| 0 | 000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 001 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 010 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 011 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 100 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 101 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 110 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 111 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 000 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 001 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 010 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | +| 1 | 011 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | +| 1 | 100 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | +| 1 | 101 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | +| 1 | 110 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | +| 1 | 111 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |`; diff --git a/web-ide-main/projects/src/project_01/15_or8way.ts b/web-ide-main/projects/src/project_01/15_or8way.ts new file mode 100644 index 0000000..cf14ce1 --- /dev/null +++ b/web-ide-main/projects/src/project_01/15_or8way.ts @@ -0,0 +1,49 @@ +export const cmp = `| in |out| +| 00000000 | 0 | +| 11111111 | 1 | +| 00010000 | 1 | +| 00000001 | 1 | +| 00100110 | 1 |`; +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Or8Way.hdl +/** + * 8-way Or gate: + * out = in[0] Or in[1] Or ... Or in[7] + */ +CHIP Or8Way { + IN in[8]; + OUT out; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/1/Or8Way.tst + +load Or8Way.hdl, +compare-to Or8Way.cmp, +output-list in%B2.8.2 out; + +set in %B00000000, +eval, +output; + +set in %B11111111, +eval, +output; + +set in %B00010000, +eval, +output; + +set in %B00000001, +eval, +output; + +set in %B00100110, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_01/index.ts b/web-ide-main/projects/src/project_01/index.ts new file mode 100644 index 0000000..9110de3 --- /dev/null +++ b/web-ide-main/projects/src/project_01/index.ts @@ -0,0 +1,86 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; + +import { resetBySuffix } from "../reset.js"; +import * as Nand from "./00_nand.js"; +import * as Not from "./01_not.js"; +import * as And from "./02_and.js"; +import * as Or from "./03_or.js"; +import * as Xor from "./04_xor.js"; +import * as Mux from "./05_mux.js"; +import * as DMux from "./06_dmux.js"; +import * as Not16 from "./07_not16.js"; +import * as And16 from "./08_and16.js"; +import * as Or16 from "./09_or16.js"; +import * as Mux16 from "./10_mux16.js"; +import * as Mux4Way16 from "./11_mux4way16.js"; +import * as Mux8Way16 from "./12_mux8way16.js"; +import * as DMux4Way from "./13_dmux4way.js"; +import * as DMux8Way from "./14_dmux8way.js"; +import * as Or8Way from "./15_or8way.js"; + +export const CHIPS = { + "Nand.tst": Nand.tst, + "Nand.cmp": Nand.cmp, + "Not.hdl": Not.hdl, + "Not.tst": Not.tst, + "Not.cmp": Not.cmp, + "And.hdl": And.hdl, + "And.tst": And.tst, + "And.cmp": And.cmp, + "Or.hdl": Or.hdl, + "Or.tst": Or.tst, + "Or.cmp": Or.cmp, + "Xor.hdl": Xor.hdl, + "Xor.tst": Xor.tst, + "Xor.cmp": Xor.cmp, + "Mux.hdl": Mux.hdl, + "Mux.tst": Mux.tst, + "Mux.cmp": Mux.cmp, + "DMux.hdl": DMux.hdl, + "DMux.tst": DMux.tst, + "DMux.cmp": DMux.cmp, + "Not16.hdl": Not16.hdl, + "Not16.tst": Not16.tst, + "Not16.cmp": Not16.cmp, + "And16.hdl": And16.hdl, + "And16.tst": And16.tst, + "And16.cmp": And16.cmp, + "Or16.hdl": Or16.hdl, + "Or16.tst": Or16.tst, + "Or16.cmp": Or16.cmp, + "Mux16.hdl": Mux16.hdl, + "Mux16.tst": Mux16.tst, + "Mux16.cmp": Mux16.cmp, + "Mux4Way16.hdl": Mux4Way16.hdl, + "Mux4Way16.tst": Mux4Way16.tst, + "Mux4Way16.cmp": Mux4Way16.cmp, + "Mux8Way16.hdl": Mux8Way16.hdl, + "Mux8Way16.tst": Mux8Way16.tst, + "Mux8Way16.cmp": Mux8Way16.cmp, + "DMux4Way.hdl": DMux4Way.hdl, + "DMux4Way.tst": DMux4Way.tst, + "DMux4Way.cmp": DMux4Way.cmp, + "DMux8Way.hdl": DMux8Way.hdl, + "DMux8Way.tst": DMux8Way.tst, + "DMux8Way.cmp": DMux8Way.cmp, + "Or8Way.hdl": Or8Way.hdl, + "Or8Way.tst": Or8Way.tst, + "Or8Way.cmp": Or8Way.cmp, +}; + +export const BUILTIN_CHIPS = { + Nand: Nand.hdl, +}; + +export async function resetFiles(fs: FileSystem): Promise { + await fs.pushd("/projects/01"); + await reset(fs, CHIPS); + await fs.popd(); +} + +export async function resetTests(fs: FileSystem): Promise { + await fs.pushd("/projects/01"); + await resetBySuffix(fs, CHIPS, ".tst"); + await resetBySuffix(fs, CHIPS, ".cmp"); + await fs.popd(); +} diff --git a/web-ide-main/projects/src/project_02/01_half_adder.ts b/web-ide-main/projects/src/project_02/01_half_adder.ts new file mode 100644 index 0000000..0a950fd --- /dev/null +++ b/web-ide-main/projects/src/project_02/01_half_adder.ts @@ -0,0 +1,48 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/HalfAdder.hdl +/** + * Computes the sum of two bits. + */ +CHIP HalfAdder { + IN a, b; // 1-bit inputs + OUT sum, // Right bit of a + b + carry; // Left bit of a + b + + PARTS: + //// Replace this comment with your code. +}`; +export const cmp = `| a | b |sum|car| +| 0 | 0 | 0 | 0 | +| 0 | 1 | 1 | 0 | +| 1 | 0 | 1 | 0 | +| 1 | 1 | 0 | 1 |`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/HalfAdder.tst + +load HalfAdder.hdl, +compare-to HalfAdder.cmp, +output-list a b sum carry; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_02/02_full_adder.ts b/web-ide-main/projects/src/project_02/02_full_adder.ts new file mode 100644 index 0000000..6067822 --- /dev/null +++ b/web-ide-main/projects/src/project_02/02_full_adder.ts @@ -0,0 +1,70 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/FullAdder.hdl +/** + * Computes the sum of three bits. + */ +CHIP FullAdder { + IN a, b, c; // 1-bit inputs + OUT sum, // Right bit of a + b + c + carry; // Left bit of a + b + c + + PARTS: + //// Replace this comment with your code. +}`; +export const cmp = `| a | b | c |sum|carry| +| 0 | 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 1 | 0 | +| 0 | 1 | 0 | 1 | 0 | +| 0 | 1 | 1 | 0 | 1 | +| 1 | 0 | 0 | 1 | 0 | +| 1 | 0 | 1 | 0 | 1 | +| 1 | 1 | 0 | 0 | 1 | +| 1 | 1 | 1 | 1 | 1 |`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/FullAdder.tst + +load FullAdder.hdl, +compare-to FullAdder.cmp, +output-list a b c sum carry%B2.1.2; + +set a 0, +set b 0, +set c 0, +eval, +output; + +set c 1, +eval, +output; + +set b 1, +set c 0, +eval, +output; + +set c 1, +eval, +output; + +set a 1, +set b 0, +set c 0, +eval, +output; + +set c 1, +eval, +output; + +set b 1, +set c 0, +eval, +output; + +set c 1, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_02/03_add16.ts b/web-ide-main/projects/src/project_02/03_add16.ts new file mode 100644 index 0000000..8e17fa1 --- /dev/null +++ b/web-ide-main/projects/src/project_02/03_add16.ts @@ -0,0 +1,60 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/Add16.hdl +/** + * 16-bit adder: Adds two 16-bit two's complement values. + * The most significant carry bit is ignored. + */ +CHIP Add16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const cmp = `| a | b | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1111111111111111 | +| 1111111111111111 | 1111111111111111 | 1111111111111110 | +| 1010101010101010 | 0101010101010101 | 1111111111111111 | +| 0011110011000011 | 0000111111110000 | 0100110010110011 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 |`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/Add16.tst + +load Add16.hdl, +compare-to Add16.cmp, +output-list a%B1.16.1 b%B1.16.1 out%B1.16.1; + +set a %B0000000000000000, +set b %B0000000000000000, +eval, +output; + +set a %B0000000000000000, +set b %B1111111111111111, +eval, +output; + +set a %B1111111111111111, +set b %B1111111111111111, +eval, +output; + +set a %B1010101010101010, +set b %B0101010101010101, +eval, +output; + +set a %B0011110011000011, +set b %B0000111111110000, +eval, +output; + +set a %B0001001000110100, +set b %B1001100001110110, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_02/04_inc16.ts b/web-ide-main/projects/src/project_02/04_inc16.ts new file mode 100644 index 0000000..13624fb --- /dev/null +++ b/web-ide-main/projects/src/project_02/04_inc16.ts @@ -0,0 +1,45 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/Inc16.hdl +/** + * 16-bit incrementer: + * out = in + 1 + */ +CHIP Inc16 { + IN in[16]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const cmp = `| in | out | +| 0000000000000000 | 0000000000000001 | +| 1111111111111111 | 0000000000000000 | +| 0000000000000101 | 0000000000000110 | +| 1111111111111011 | 1111111111111100 | +`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/Inc16.tst + +load Inc16.hdl, +compare-to Inc16.cmp, +output-list in%B1.16.1 out%B1.16.1; + +set in %B0000000000000000, // in = 0 +eval, +output; + +set in %B1111111111111111, // in = -1 +eval, +output; + +set in %B0000000000000101, // in = 5 +eval, +output; + +set in %B1111111111111011, // in = -5 +eval, +output;`; diff --git a/web-ide-main/projects/src/project_02/05_alu_no_stat.ts b/web-ide-main/projects/src/project_02/05_alu_no_stat.ts new file mode 100644 index 0000000..0329feb --- /dev/null +++ b/web-ide-main/projects/src/project_02/05_alu_no_stat.ts @@ -0,0 +1,422 @@ +export const hdl = `/** + * The ALU (Arithmetic Logic Unit). + * Computes one of the following functions: + * x+y, x-y, y-x, 0, 1, -1, x, y, -x, -y, !x, !y, + * x+1, y+1, x-1, y-1, x&y, x|y on two 16-bit inputs, + * according to 6 input bits denoted zx,nx,zy,ny,f,no. + * In addition, the ALU computes two 1-bit outputs: + * if the ALU output == 0, zr is set to 1; otherwise zr is set to 0; + * if the ALU output < 0, ng is set to 1; otherwise ng is set to 0. + */ + +// Implementation: the ALU logic manipulates the x and y inputs +// and operates on the resulting values, as follows: +// if (zx == 1) set x = 0 // 16-bit constant +// if (nx == 1) set x = !x // bitwise not +// if (zy == 1) set y = 0 // 16-bit constant +// if (ny == 1) set y = !y // bitwise not +// if (f == 1) set out = x + y // integer 2's complement addition +// if (f == 0) set out = x & y // bitwise and +// if (no == 1) set out = !out // bitwise not +// if (out == 0) set zr = 1 +// if (out < 0) set ng = 1 + +CHIP ALU { + IN + x[16], y[16], // 16-bit inputs + zx, // zero the x input? + nx, // negate the x input? + zy, // zero the y input? + ny, // negate the y input? + f, // compute out = x + y (if 1) or x & y (if 0) + no; // negate the out output? + + OUT + out[16]; // 16-bit output + + PARTS: +}`; +export const cmp = `| x | y |zx |nx |zy |ny | f |no | out | +| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | +| 0101101110100000 | 0001111011010010 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 0 | 0 | 0101101110100000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 0 | 0 | 0001111011010010 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 0 | 1 | 1010010001011111 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 0 | 1 | 1110000100101101 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 1 | 1 | 1010010001100000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 1 | 1 | 1110000100101110 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 1 | 1 | 1 | 1 | 0101101110100001 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 1 | 1 | 1 | 0001111011010011 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 1 | 0 | 0101101110011111 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 1 | 0 | 0001111011010001 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 0 | 1 | 0 | 0111101001110010 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 0 | 0 | 1 | 1 | 0011110011001110 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 1 | 1 | 1 | 1100001100110010 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 0 | 0 | 0 | 0001101010000000 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 0 | 1 | 0 | 1 | 0101111111110010 | +`; +export const tst = ` +// ALU no stat tst provides a partial test of the ALU chip. +// It IS NOT a replacement for ALU.tst. + +// ALU-nostat.tst tests only the computation part of the ALU. +// The 'zr' and 'ng' status outputs are ignored. + +// This test lets you concentrate on getting the ALU computation right without the +// additional task of handling the status outputs. + +// Once your ALU passes ALU-nostat.tst you need to test it with ALU.tst. +// This way, any comparison failures during ALU.tst will be caused by errors in +// the handling of the 'zr' and 'ng' status outputs. + +output-list x%B1.16.1 y%B1.16.1 zx%B1.1.1 nx%B1.1.1 zy%B1.1.1 + ny%B1.1.1 f%B1.1.1 no%B1.1.1 out%B1.16.1; + +set x %B0000000000000000, +set y %B1111111111111111, + +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set x %B101101110100000, +set y %B001111011010010, + +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output;`; diff --git a/web-ide-main/projects/src/project_02/06_alu.ts b/web-ide-main/projects/src/project_02/06_alu.ts new file mode 100644 index 0000000..3f3d5a1 --- /dev/null +++ b/web-ide-main/projects/src/project_02/06_alu.ts @@ -0,0 +1,834 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/ALU.hdl +/** + * ALU (Arithmetic Logic Unit): + * Computes out = one of the following functions: + * 0, 1, -1, + * x, y, !x, !y, -x, -y, + * x + 1, y + 1, x - 1, y - 1, + * x + y, x - y, y - x, + * x & y, x | y + * on the 16-bit inputs x, y, + * according to the input bits zx, nx, zy, ny, f, no. + * In addition, computes the two output bits: + * if (out == 0) zr = 1, else zr = 0 + * if (out < 0) ng = 1, else ng = 0 + */ +// Implementation: Manipulates the x and y inputs +// and operates on the resulting values, as follows: +// if (zx == 1) sets x = 0 // 16-bit constant +// if (nx == 1) sets x = !x // bitwise not +// if (zy == 1) sets y = 0 // 16-bit constant +// if (ny == 1) sets y = !y // bitwise not +// if (f == 1) sets out = x + y // integer 2's complement addition +// if (f == 0) sets out = x & y // bitwise and +// if (no == 1) sets out = !out // bitwise not + +CHIP ALU { + IN + x[16], y[16], // 16-bit inputs + zx, // zero the x input? + nx, // negate the x input? + zy, // zero the y input? + ny, // negate the y input? + f, // compute (out = x + y) or (out = x & y)? + no; // negate the out output? + OUT + out[16], // 16-bit output + zr, // if (out == 0) equals 1, else 0 + ng; // if (out < 0) equals 1, else 0 + + PARTS: + //// Replace this comment with your code. +}`; +export const cmp = `| x | y |zx |nx |zy |ny | f |no | out |zr |ng | +| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000010001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 0 | 0000000000000011 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111101110 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 1 | 1111111111111100 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 1 | 1111111111101111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 1 | 1111111111111101 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000010010 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000100 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 0 | 0000000000010000 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 0 | 0000000000000010 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 1 | 0 | 0000000000010100 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000001110 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111110010 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 1 | 0 | 1 | 0000000000010011 | 0 | 0 |`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/ALU.tst + +load ALU.hdl, +compare-to ALU.cmp, +output-list x%B1.16.1 y%B1.16.1 zx nx zy ny f no out zr ng; + +set x %B0000000000000000, // x = 0 +set y %B1111111111111111; // y = -1 + +// Compute 0 +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute 1 +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -1 +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +// Compute y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute !x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +// Compute !y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +// Compute -x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute x + 1 +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute y + 1 +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x - 1 +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +// Compute y - 1 +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x + y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x - y +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute y - x +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x & y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute x | y +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set x %B000000000010001, // x = 17 +set y %B000000000000011; // y = 3 + +// Compute 0 +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute 1 +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -1 +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +// Compute y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute !x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +// Compute !y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +// Compute -x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute x + 1 +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute y + 1 +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x - 1 +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +// Compute y - 1 +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x + y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x - y +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute y - x +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x & y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute x | y +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output;`; +export const basic_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/2/ALU-basic.tst + +// Tests the basic version of the ALU chip. +// DOES NOT replace the final test provided by ALU.tst. +// Specifically: Tests the ALU logic that computes the 'out' output; +// The 'zr' and 'ng' output bits are ignored. + +output-list x%B1.16.1 y%B1.16.1 zx nx zy ny f no out%B1.16.1; + +set x %B0000000000000000, +set y %B1111111111111111, + +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set x %B101101110100000, +set y %B001111011010010, + +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output;`; +export const basic_cmp = `| x | y |zx |nx |zy |ny | f |no | out | +| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | +| 0101101110100000 | 0001111011010010 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 0 | 0 | 0101101110100000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 0 | 0 | 0001111011010010 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 0 | 1 | 1010010001011111 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 0 | 1 | 1110000100101101 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 1 | 1 | 1010010001100000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 1 | 1 | 1110000100101110 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 1 | 1 | 1 | 1 | 0101101110100001 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 1 | 1 | 1 | 0001111011010011 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 1 | 0 | 0101101110011111 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 1 | 0 | 0001111011010001 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 0 | 1 | 0 | 0111101001110010 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 0 | 0 | 1 | 1 | 0011110011001110 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 1 | 1 | 1 | 1100001100110010 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 0 | 0 | 0 | 0001101010000000 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 0 | 1 | 0 | 1 | 0101111111110010 |`; diff --git a/web-ide-main/projects/src/project_02/06_alu_all.ts b/web-ide-main/projects/src/project_02/06_alu_all.ts new file mode 100644 index 0000000..0cf4a0a --- /dev/null +++ b/web-ide-main/projects/src/project_02/06_alu_all.ts @@ -0,0 +1,245 @@ +export const hdl = `/** + * The ALU (Arithmetic Logic Unit). + * Computes one of the following functions: + * x+y, x-y, y-x, 0, 1, -1, x, y, -x, -y, !x, !y, + * x+1, y+1, x-1, y-1, x&y, x|y on two 16-bit inputs, + * according to 6 input bits denoted zx,nx,zy,ny,f,no. + * + * All operations: + * Ensure your solution handles these undocumented opcodes: + * + * -2, !(x&y), !(x|y), !x&y, !(!x&y), !(x&!y), x&!y + * x+y+1, x-y-1, -(x+2), -(y+2), -(x+y+2), -(x+y+1), -(x-y+1) + * + * In addition, the ALU computes two 1-bit outputs: + * if the ALU output == 0, zr is set to 1; otherwise zr is set to 0; + * if the ALU output < 0, ng is set to 1; otherwise ng is set to 0. + */ + +// Implementation: the ALU logic manipulates the x and y inputs +// and operates on the resulting values, as follows: +// if (zx == 1) set x = 0 // 16-bit constant +// if (nx == 1) set x = !x // bitwise not +// if (zy == 1) set y = 0 // 16-bit constant +// if (ny == 1) set y = !y // bitwise not +// if (f == 1) set out = x + y // integer 2's complement addition +// if (f == 0) set out = x & y // bitwise and +// if (no == 1) set out = !out // bitwise not +// if (out == 0) set zr = 1 +// if (out < 0) set ng = 1 + +// Testing: the test script below has tests for the undocumented instructions +// listed first, and then has the tests for the documented ALU instructions. + +CHIP ALU { + IN + x[16], y[16], // 16-bit inputs + zx, // zero the x input? + nx, // negate the x input? + zy, // zero the y input? + ny, // negate the y input? + f, // compute out = x + y (if 1) or x & y (if 0) + no; // negate the out output? + + OUT + out[16], // 16-bit output + zr, // 1 if (out == 0), 0 otherwise + ng; // 1 if (out < 0), 0 otherwise + + PARTS: + // Put you code here: +}`; +export const cmp = `| x | y |zx |nx |zy |ny | f |no | out |zr |ng | +| 0000000000000000 | 0000000000000000 | 1 | 1 | 1 | 1 | 1 | 0 | 1111111111111110 | 0 | 1 | +| 0000000000000011 | 0000000000000101 | 0 | 0 | 0 | 0 | 0 | 1 | 1111111111111110 | 0 | 1 | +| 0000000000000011 | 0000000000000101 | 0 | 1 | 0 | 1 | 0 | 0 | 1111111111111000 | 0 | 1 | +| 0000000000000011 | 0000000000000101 | 0 | 1 | 0 | 0 | 0 | 0 | 1111111111110100 | 0 | 1 | +| 0000000000000011 | 0000000000000101 | 0 | 1 | 0 | 0 | 0 | 1 | 1111111111111011 | 0 | 1 | +| 0000000000000011 | 0000000000000101 | 0 | 0 | 0 | 1 | 0 | 1 | 1111111111111101 | 0 | 1 | +| 0000000000000011 | 0000000000000101 | 0 | 0 | 0 | 1 | 0 | 0 | 1111111111110010 | 0 | 1 | +| 0000000000001101 | 0000000000010011 | 0 | 1 | 0 | 1 | 1 | 1 | 0000000000100001 | 0 | 0 | +| 0000000000001101 | 0000000000010011 | 0 | 0 | 0 | 1 | 1 | 0 | 1111111111111001 | 0 | 1 | +| 0000000000001101 | 0000000000010011 | 0 | 1 | 1 | 1 | 1 | 0 | 1111111111110001 | 0 | 1 | +| 0000000000001101 | 0000000000010011 | 1 | 1 | 0 | 1 | 1 | 0 | 1111111111101011 | 0 | 1 | +| 0000000000001101 | 0000000000010011 | 0 | 1 | 0 | 1 | 1 | 0 | 1111111111011110 | 0 | 1 | +| 0000000000001101 | 0000000000010011 | 0 | 0 | 0 | 0 | 1 | 1 | 1111111111011111 | 0 | 1 | +| 0000000000001101 | 0000000000010011 | 0 | 1 | 0 | 0 | 1 | 0 | 0000000000000101 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000010001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 0 | 0000000000000011 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111101110 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 1 | 1111111111111100 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 1 | 1111111111101111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 1 | 1111111111111101 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000010010 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000100 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 0 | 0000000000010000 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 0 | 0000000000000010 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 1 | 0 | 0000000000010100 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000001110 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111110010 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 1 | 0 | 1 | 0000000000010011 | 0 | 0 |`; +export const tst = `output-list x%B1.16.1 y%B1.16.1 zx%B1.1.1 nx%B1.1.1 zy%B1.1.1 +ny%B1.1.1 f%B1.1.1 no%B1.1.1 out%B1.16.1 zr%B1.1.1 +ng%B1.1.1; + +// Compute -2 +set x %B0000000000000000, +set y %B0000000000000000, +set zx 1, set nx 1, set zy 1, set ny 1, set f 1, set no 0, eval, output; + +set x %B0000000000000011, +set y %B0000000000000101; + +set zx 0, set nx 0, set zy 0, set ny 0, set f 0, set no 1, eval, output; +set zx 0, set nx 1, set zy 0, set ny 1, set f 0, set no 0, eval, output; +set zx 0, set nx 1, set zy 0, set ny 0, set f 0, set no 0, eval, output; +set zx 0, set nx 1, set zy 0, set ny 0, set f 0, set no 1, eval, output; +set zx 0, set nx 0, set zy 0, set ny 1, set f 0, set no 1, eval, output; +set zx 0, set nx 0, set zy 0, set ny 1, set f 0, set no 0, eval, output; + +set x %B0000000000001101, // x = 13 +set y %B0000000000010011; // y = 19 + +set zx 0, set nx 1, set zy 0, set ny 1, set f 1, set no 1, eval, output; +set zx 0, set nx 0, set zy 0, set ny 1, set f 1, set no 0, eval, output; +set zx 0, set nx 1, set zy 1, set ny 1, set f 1, set no 0, eval, output; +set zx 1, set nx 1, set zy 0, set ny 1, set f 1, set no 0, eval, output; +set zx 0, set nx 1, set zy 0, set ny 1, set f 1, set no 0, eval, output; +set zx 0, set nx 0, set zy 0, set ny 0, set f 1, set no 1, eval, output; +set zx 0, set nx 1, set zy 0, set ny 0, set f 1, set no 0, eval, output; + +set x %B0000000000000000, // x = 0 +set y %B1111111111111111; // y = -1 + +// Compute 0 +set zx 1, set nx 0, set zy 1, set ny 0, set f 1, set no 0, eval, output; + +// Compute 1 +set zx 1, set nx 1, set zy 1, set ny 1, set f 1, set no 1, eval, output; + +// Compute -1 +set zx 1, set nx 1, set zy 1, set ny 0, set f 1, set no 0, eval, output; + +// Compute x +set zx 0, set nx 0, set zy 1, set ny 1, set f 0, set no 0, eval, output; + +// Compute y +set zx 1, set nx 1, set zy 0, set ny 0, set f 0, set no 0, eval, output; + +// Compute !x +set zx 0, set nx 0, set zy 1, set ny 1, set f 0, set no 1, eval, output; + +// Compute !y +set zx 1, set nx 1, set zy 0, set ny 0, set f 0, set no 1, eval, output; + +// Compute -x +set zx 0, set nx 0, set zy 1, set ny 1, set f 1, set no 1, eval, output; + +// Compute -y +set zx 1, set nx 1, set zy 0, set ny 0, set f 1, set no 1, eval, output; + +// Compute x + 1 +set zx 0, set nx 1, set zy 1, set ny 1, set f 1, set no 1, eval, output; + +// Compute y + 1 +set zx 1, set nx 1, set zy 0, set ny 1, set f 1, set no 1, eval, output; + +// Compute x - 1 +set zx 0, set nx 0, set zy 1, set ny 1, set f 1, set no 0, eval, output; + +// Compute y - 1 +set zx 1, set nx 1, set zy 0, set ny 0, set f 1, set no 0, eval, output; + +// Compute x + y +set zx 0, set nx 0, set zy 0, set ny 0, set f 1, set no 0, eval, output; + +// Compute x - y +set zx 0, set nx 1, set zy 0, set ny 0, set f 1, set no 1, eval, output; + +// Compute y - x +set zx 0, set nx 0, set zy 0, set ny 1, set f 1, set no 1, eval, output; + +// Compute x & y +set zx 0, set nx 0, set zy 0, set ny 0, set f 0, set no 0, eval, output; + +// Compute x | y +set zx 0, set nx 1, set zy 0, set ny 1, set f 0, set no 1, eval, output; + +set x %B000000000010001, // x = 17 +set y %B000000000000011; // y = 3 + +// Compute 0 +set zx 1, set nx 0, set zy 1, set ny 0, set f 1, set no 0, eval, output; + +// Compute 1 +set zx 1, set nx 1, set zy 1, set ny 1, set f 1, set no 1, eval, output; + +// Compute -1 +set zx 1, set nx 1, set zy 1, set ny 0, set f 1, set no 0, eval, output; + +// Compute x +set zx 0, set nx 0, set zy 1, set ny 1, set f 0, set no 0, eval, output; + +// Compute y +set zx 1, set nx 1, set zy 0, set ny 0, set f 0, set no 0, eval, output; + +// Compute !x +set zx 0, set nx 0, set zy 1, set ny 1, set f 0, set no 1, eval, output; + +// Compute !y +set zx 1, set nx 1, set zy 0, set ny 0, set f 0, set no 1, eval, output; + +// Compute -x +set zx 0, set nx 0, set zy 1, set ny 1, set f 1, set no 1, eval, output; + +// Compute -y +set zx 1, set nx 1, set zy 0, set ny 0, set f 1, set no 1, eval, output; + +// Compute x + 1 +set zx 0, set nx 1, set zy 1, set ny 1, set f 1, set no 1, eval, output; + +// Compute y + 1 +set zx 1, set nx 1, set zy 0, set ny 1, set f 1, set no 1, eval, output; + +// Compute x - 1 +set zx 0, set nx 0, set zy 1, set ny 1, set f 1, set no 0, eval, output; + +// Compute y - 1 +set zx 1, set nx 1, set zy 0, set ny 0, set f 1, set no 0, eval, output; + +// Compute x + y +set zx 0, set nx 0, set zy 0, set ny 0, set f 1, set no 0, eval, output; + +// Compute x - y +set zx 0, set nx 1, set zy 0, set ny 0, set f 1, set no 1, eval, output; + +// Compute y - x +set zx 0, set nx 0, set zy 0, set ny 1, set f 1, set no 1, eval, output; + +// Compute x & y +set zx 0, set nx 0, set zy 0, set ny 0, set f 0, set no 0, eval, output; + +// Compute x | y +set zx 0, set nx 1, set zy 0, set ny 1, set f 0, set no 1, eval, output;`; diff --git a/web-ide-main/projects/src/project_02/index.ts b/web-ide-main/projects/src/project_02/index.ts new file mode 100644 index 0000000..9f83555 --- /dev/null +++ b/web-ide-main/projects/src/project_02/index.ts @@ -0,0 +1,43 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; + +import { resetBySuffix } from "../reset.js"; +import * as HalfAdder from "./01_half_adder.js"; +import * as FullAdder from "./02_full_adder.js"; +import * as Add16 from "./03_add16.js"; +import * as Inc16 from "./04_inc16.js"; +import * as Alu from "./06_alu.js"; + +export const CHIPS = { + "HalfAdder.hdl": HalfAdder.hdl, + "HalfAdder.tst": HalfAdder.tst, + "HalfAdder.cmp": HalfAdder.cmp, + "FullAdder.hdl": FullAdder.hdl, + "FullAdder.tst": FullAdder.tst, + "FullAdder.cmp": FullAdder.cmp, + "Add16.hdl": Add16.hdl, + "Add16.tst": Add16.tst, + "Add16.cmp": Add16.cmp, + "Inc16.hdl": Inc16.hdl, + "Inc16.tst": Inc16.tst, + "Inc16.cmp": Inc16.cmp, + "ALU.hdl": Alu.hdl, + "ALU.tst": Alu.tst, + "ALU.cmp": Alu.cmp, + "ALU-basic.tst": Alu.basic_tst, + "ALU-basic.cmp": Alu.basic_cmp, +}; + +export const BUILTIN_CHIPS = {}; + +export async function resetFiles(fs: FileSystem): Promise { + await fs.pushd("/projects/02"); + await reset(fs, CHIPS); + await fs.popd(); +} + +export async function resetTests(fs: FileSystem): Promise { + await fs.pushd("/projects/02"); + await resetBySuffix(fs, CHIPS, ".tst"); + await resetBySuffix(fs, CHIPS, ".cmp"); + await fs.popd(); +} diff --git a/web-ide-main/projects/src/project_03/00_dff.ts b/web-ide-main/projects/src/project_03/00_dff.ts new file mode 100644 index 0000000..e4726f0 --- /dev/null +++ b/web-ide-main/projects/src/project_03/00_dff.ts @@ -0,0 +1,17 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/03/DFF.hdl +/** + * Data Flip-flop: + * maintains its current value: + * out(t+1) = in(t) + */ +CHIP DFF { + IN in; + OUT out; + + PARTS: + BUILTIN DFF; + CLOCKED in; +}`; diff --git a/web-ide-main/projects/src/project_03/01_bit.ts b/web-ide-main/projects/src/project_03/01_bit.ts new file mode 100644 index 0000000..310bbcf --- /dev/null +++ b/web-ide-main/projects/src/project_03/01_bit.ts @@ -0,0 +1,1096 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/a/Bit.hdl +/** + * 1-bit register: + * If load is asserted, the register's value is set to in; + * Otherwise, the register maintains its current value: + * if (load(t)) out(t+1) = in(t), else out(t+1) = out(t) + */ +CHIP Bit { + IN in, load; + OUT out; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/a/Bit.tst + +load Bit.hdl, +compare-to Bit.cmp, +output-list time%S1.4.1 in load%B1.1.2 out; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 1, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 1, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 1, +tick, +output; + +tock, +output; + +set in 1, +set load 1, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 1, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output;`; +export const cmp = `| time |in |load|out| +| 0+ | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | +| 2 | 0 | 1 | 0 | +| 2+ | 1 | 0 | 0 | +| 3 | 1 | 0 | 0 | +| 3+ | 1 | 1 | 0 | +| 4 | 1 | 1 | 1 | +| 4+ | 0 | 0 | 1 | +| 5 | 0 | 0 | 1 | +| 5+ | 1 | 0 | 1 | +| 6 | 1 | 0 | 1 | +| 6+ | 0 | 1 | 1 | +| 7 | 0 | 1 | 0 | +| 7+ | 1 | 1 | 0 | +| 8 | 1 | 1 | 1 | +| 8+ | 0 | 0 | 1 | +| 9 | 0 | 0 | 1 | +| 9+ | 0 | 0 | 1 | +| 10 | 0 | 0 | 1 | +| 10+ | 0 | 0 | 1 | +| 11 | 0 | 0 | 1 | +| 11+ | 0 | 0 | 1 | +| 12 | 0 | 0 | 1 | +| 12+ | 0 | 0 | 1 | +| 13 | 0 | 0 | 1 | +| 13+ | 0 | 0 | 1 | +| 14 | 0 | 0 | 1 | +| 14+ | 0 | 0 | 1 | +| 15 | 0 | 0 | 1 | +| 15+ | 0 | 0 | 1 | +| 16 | 0 | 0 | 1 | +| 16+ | 0 | 0 | 1 | +| 17 | 0 | 0 | 1 | +| 17+ | 0 | 0 | 1 | +| 18 | 0 | 0 | 1 | +| 18+ | 0 | 0 | 1 | +| 19 | 0 | 0 | 1 | +| 19+ | 0 | 0 | 1 | +| 20 | 0 | 0 | 1 | +| 20+ | 0 | 0 | 1 | +| 21 | 0 | 0 | 1 | +| 21+ | 0 | 0 | 1 | +| 22 | 0 | 0 | 1 | +| 22+ | 0 | 0 | 1 | +| 23 | 0 | 0 | 1 | +| 23+ | 0 | 0 | 1 | +| 24 | 0 | 0 | 1 | +| 24+ | 0 | 0 | 1 | +| 25 | 0 | 0 | 1 | +| 25+ | 0 | 0 | 1 | +| 26 | 0 | 0 | 1 | +| 26+ | 0 | 0 | 1 | +| 27 | 0 | 0 | 1 | +| 27+ | 0 | 0 | 1 | +| 28 | 0 | 0 | 1 | +| 28+ | 0 | 0 | 1 | +| 29 | 0 | 0 | 1 | +| 29+ | 0 | 0 | 1 | +| 30 | 0 | 0 | 1 | +| 30+ | 0 | 0 | 1 | +| 31 | 0 | 0 | 1 | +| 31+ | 0 | 0 | 1 | +| 32 | 0 | 0 | 1 | +| 32+ | 0 | 0 | 1 | +| 33 | 0 | 0 | 1 | +| 33+ | 0 | 0 | 1 | +| 34 | 0 | 0 | 1 | +| 34+ | 0 | 0 | 1 | +| 35 | 0 | 0 | 1 | +| 35+ | 0 | 0 | 1 | +| 36 | 0 | 0 | 1 | +| 36+ | 0 | 0 | 1 | +| 37 | 0 | 0 | 1 | +| 37+ | 0 | 0 | 1 | +| 38 | 0 | 0 | 1 | +| 38+ | 0 | 0 | 1 | +| 39 | 0 | 0 | 1 | +| 39+ | 0 | 0 | 1 | +| 40 | 0 | 0 | 1 | +| 40+ | 0 | 0 | 1 | +| 41 | 0 | 0 | 1 | +| 41+ | 0 | 0 | 1 | +| 42 | 0 | 0 | 1 | +| 42+ | 0 | 0 | 1 | +| 43 | 0 | 0 | 1 | +| 43+ | 0 | 0 | 1 | +| 44 | 0 | 0 | 1 | +| 44+ | 0 | 0 | 1 | +| 45 | 0 | 0 | 1 | +| 45+ | 0 | 0 | 1 | +| 46 | 0 | 0 | 1 | +| 46+ | 0 | 0 | 1 | +| 47 | 0 | 0 | 1 | +| 47+ | 0 | 0 | 1 | +| 48 | 0 | 0 | 1 | +| 48+ | 0 | 0 | 1 | +| 49 | 0 | 0 | 1 | +| 49+ | 0 | 0 | 1 | +| 50 | 0 | 0 | 1 | +| 50+ | 0 | 0 | 1 | +| 51 | 0 | 0 | 1 | +| 51+ | 0 | 0 | 1 | +| 52 | 0 | 0 | 1 | +| 52+ | 0 | 0 | 1 | +| 53 | 0 | 0 | 1 | +| 53+ | 0 | 0 | 1 | +| 54 | 0 | 0 | 1 | +| 54+ | 0 | 0 | 1 | +| 55 | 0 | 0 | 1 | +| 55+ | 0 | 0 | 1 | +| 56 | 0 | 0 | 1 | +| 56+ | 0 | 0 | 1 | +| 57 | 0 | 0 | 1 | +| 57+ | 0 | 1 | 1 | +| 58 | 0 | 1 | 0 | +| 58+ | 1 | 0 | 0 | +| 59 | 1 | 0 | 0 | +| 59+ | 1 | 0 | 0 | +| 60 | 1 | 0 | 0 | +| 60+ | 1 | 0 | 0 | +| 61 | 1 | 0 | 0 | +| 61+ | 1 | 0 | 0 | +| 62 | 1 | 0 | 0 | +| 62+ | 1 | 0 | 0 | +| 63 | 1 | 0 | 0 | +| 63+ | 1 | 0 | 0 | +| 64 | 1 | 0 | 0 | +| 64+ | 1 | 0 | 0 | +| 65 | 1 | 0 | 0 | +| 65+ | 1 | 0 | 0 | +| 66 | 1 | 0 | 0 | +| 66+ | 1 | 0 | 0 | +| 67 | 1 | 0 | 0 | +| 67+ | 1 | 0 | 0 | +| 68 | 1 | 0 | 0 | +| 68+ | 1 | 0 | 0 | +| 69 | 1 | 0 | 0 | +| 69+ | 1 | 0 | 0 | +| 70 | 1 | 0 | 0 | +| 70+ | 1 | 0 | 0 | +| 71 | 1 | 0 | 0 | +| 71+ | 1 | 0 | 0 | +| 72 | 1 | 0 | 0 | +| 72+ | 1 | 0 | 0 | +| 73 | 1 | 0 | 0 | +| 73+ | 1 | 0 | 0 | +| 74 | 1 | 0 | 0 | +| 74+ | 1 | 0 | 0 | +| 75 | 1 | 0 | 0 | +| 75+ | 1 | 0 | 0 | +| 76 | 1 | 0 | 0 | +| 76+ | 1 | 0 | 0 | +| 77 | 1 | 0 | 0 | +| 77+ | 1 | 0 | 0 | +| 78 | 1 | 0 | 0 | +| 78+ | 1 | 0 | 0 | +| 79 | 1 | 0 | 0 | +| 79+ | 1 | 0 | 0 | +| 80 | 1 | 0 | 0 | +| 80+ | 1 | 0 | 0 | +| 81 | 1 | 0 | 0 | +| 81+ | 1 | 0 | 0 | +| 82 | 1 | 0 | 0 | +| 82+ | 1 | 0 | 0 | +| 83 | 1 | 0 | 0 | +| 83+ | 1 | 0 | 0 | +| 84 | 1 | 0 | 0 | +| 84+ | 1 | 0 | 0 | +| 85 | 1 | 0 | 0 | +| 85+ | 1 | 0 | 0 | +| 86 | 1 | 0 | 0 | +| 86+ | 1 | 0 | 0 | +| 87 | 1 | 0 | 0 | +| 87+ | 1 | 0 | 0 | +| 88 | 1 | 0 | 0 | +| 88+ | 1 | 0 | 0 | +| 89 | 1 | 0 | 0 | +| 89+ | 1 | 0 | 0 | +| 90 | 1 | 0 | 0 | +| 90+ | 1 | 0 | 0 | +| 91 | 1 | 0 | 0 | +| 91+ | 1 | 0 | 0 | +| 92 | 1 | 0 | 0 | +| 92+ | 1 | 0 | 0 | +| 93 | 1 | 0 | 0 | +| 93+ | 1 | 0 | 0 | +| 94 | 1 | 0 | 0 | +| 94+ | 1 | 0 | 0 | +| 95 | 1 | 0 | 0 | +| 95+ | 1 | 0 | 0 | +| 96 | 1 | 0 | 0 | +| 96+ | 1 | 0 | 0 | +| 97 | 1 | 0 | 0 | +| 97+ | 1 | 0 | 0 | +| 98 | 1 | 0 | 0 | +| 98+ | 1 | 0 | 0 | +| 99 | 1 | 0 | 0 | +| 99+ | 1 | 0 | 0 | +| 100 | 1 | 0 | 0 | +| 100+ | 1 | 0 | 0 | +| 101 | 1 | 0 | 0 | +| 101+ | 1 | 0 | 0 | +| 102 | 1 | 0 | 0 | +| 102+ | 1 | 0 | 0 | +| 103 | 1 | 0 | 0 | +| 103+ | 1 | 0 | 0 | +| 104 | 1 | 0 | 0 | +| 104+ | 1 | 0 | 0 | +| 105 | 1 | 0 | 0 | +| 105+ | 1 | 0 | 0 | +| 106 | 1 | 0 | 0 | +| 106+ | 1 | 0 | 0 | +| 107 | 1 | 0 | 0 |`; diff --git a/web-ide-main/projects/src/project_03/02_register.ts b/web-ide-main/projects/src/project_03/02_register.ts new file mode 100644 index 0000000..3e308ca --- /dev/null +++ b/web-ide-main/projects/src/project_03/02_register.ts @@ -0,0 +1,735 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/a/Register.hdl +/** + * 16-bit register: + * If load is asserted, the register's value is set to in; + * Otherwise, the register maintains its current value: + * if (load(t)) out(t+1) = int(t), else out(t+1) = out(t) + */ +CHIP Register { + IN in[16], load; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/a/Register.tst + +load Register.hdl, +compare-to Register.cmp, +output-list time%S1.3.1 in%D1.6.1 load%B2.1.1 out%D1.6.1; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 1, +tick, +output; + +tock, +output; + +set in -32123, +set load 0, +tick, +output; + +tock, +output; + +set in 11111, +set load 0, +tick, +output; + +tock, +output; + +set in -32123, +set load 1, +tick, +output; + +tock, +output; + +set in -32123, +set load 1, +tick, +output; + +tock, +output; + +set in -32123, +set load 0, +tick, +output; + +tock, +output; + +set in 12345, +set load 1, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000000001, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000000010, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000000100, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000001000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000010000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000100000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000001000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000010000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000100000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000001000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000010000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000100000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0001000000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0010000000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0100000000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1000000000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111111110, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111111101, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111111011, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111110111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111101111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111011111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111110111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111101111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111011111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111110111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111101111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111011111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1110111111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1101111111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1011111111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0111111111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output;`; + +export const cmp = `|time | in |load| out | +| 0+ | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | +| 2 | 0 | 1 | 0 | +| 2+ | -32123 | 0 | 0 | +| 3 | -32123 | 0 | 0 | +| 3+ | 11111 | 0 | 0 | +| 4 | 11111 | 0 | 0 | +| 4+ | -32123 | 1 | 0 | +| 5 | -32123 | 1 | -32123 | +| 5+ | -32123 | 1 | -32123 | +| 6 | -32123 | 1 | -32123 | +| 6+ | -32123 | 0 | -32123 | +| 7 | -32123 | 0 | -32123 | +| 7+ | 12345 | 1 | -32123 | +| 8 | 12345 | 1 | 12345 | +| 8+ | 0 | 0 | 12345 | +| 9 | 0 | 0 | 12345 | +| 9+ | 0 | 1 | 12345 | +| 10 | 0 | 1 | 0 | +| 10+ | 1 | 0 | 0 | +| 11 | 1 | 0 | 0 | +| 11+ | 1 | 1 | 0 | +| 12 | 1 | 1 | 1 | +| 12+ | 2 | 0 | 1 | +| 13 | 2 | 0 | 1 | +| 13+ | 2 | 1 | 1 | +| 14 | 2 | 1 | 2 | +| 14+ | 4 | 0 | 2 | +| 15 | 4 | 0 | 2 | +| 15+ | 4 | 1 | 2 | +| 16 | 4 | 1 | 4 | +| 16+ | 8 | 0 | 4 | +| 17 | 8 | 0 | 4 | +| 17+ | 8 | 1 | 4 | +| 18 | 8 | 1 | 8 | +| 18+ | 16 | 0 | 8 | +| 19 | 16 | 0 | 8 | +| 19+ | 16 | 1 | 8 | +| 20 | 16 | 1 | 16 | +| 20+ | 32 | 0 | 16 | +| 21 | 32 | 0 | 16 | +| 21+ | 32 | 1 | 16 | +| 22 | 32 | 1 | 32 | +| 22+ | 64 | 0 | 32 | +| 23 | 64 | 0 | 32 | +| 23+ | 64 | 1 | 32 | +| 24 | 64 | 1 | 64 | +| 24+ | 128 | 0 | 64 | +| 25 | 128 | 0 | 64 | +| 25+ | 128 | 1 | 64 | +| 26 | 128 | 1 | 128 | +| 26+ | 256 | 0 | 128 | +| 27 | 256 | 0 | 128 | +| 27+ | 256 | 1 | 128 | +| 28 | 256 | 1 | 256 | +| 28+ | 512 | 0 | 256 | +| 29 | 512 | 0 | 256 | +| 29+ | 512 | 1 | 256 | +| 30 | 512 | 1 | 512 | +| 30+ | 1024 | 0 | 512 | +| 31 | 1024 | 0 | 512 | +| 31+ | 1024 | 1 | 512 | +| 32 | 1024 | 1 | 1024 | +| 32+ | 2048 | 0 | 1024 | +| 33 | 2048 | 0 | 1024 | +| 33+ | 2048 | 1 | 1024 | +| 34 | 2048 | 1 | 2048 | +| 34+ | 4096 | 0 | 2048 | +| 35 | 4096 | 0 | 2048 | +| 35+ | 4096 | 1 | 2048 | +| 36 | 4096 | 1 | 4096 | +| 36+ | 8192 | 0 | 4096 | +| 37 | 8192 | 0 | 4096 | +| 37+ | 8192 | 1 | 4096 | +| 38 | 8192 | 1 | 8192 | +| 38+ | 16384 | 0 | 8192 | +| 39 | 16384 | 0 | 8192 | +| 39+ | 16384 | 1 | 8192 | +| 40 | 16384 | 1 | 16384 | +| 40+ | -32768 | 0 | 16384 | +| 41 | -32768 | 0 | 16384 | +| 41+ | -32768 | 1 | 16384 | +| 42 | -32768 | 1 | -32768 | +| 42+ | -2 | 0 | -32768 | +| 43 | -2 | 0 | -32768 | +| 43+ | -2 | 1 | -32768 | +| 44 | -2 | 1 | -2 | +| 44+ | -3 | 0 | -2 | +| 45 | -3 | 0 | -2 | +| 45+ | -3 | 1 | -2 | +| 46 | -3 | 1 | -3 | +| 46+ | -5 | 0 | -3 | +| 47 | -5 | 0 | -3 | +| 47+ | -5 | 1 | -3 | +| 48 | -5 | 1 | -5 | +| 48+ | -9 | 0 | -5 | +| 49 | -9 | 0 | -5 | +| 49+ | -9 | 1 | -5 | +| 50 | -9 | 1 | -9 | +| 50+ | -17 | 0 | -9 | +| 51 | -17 | 0 | -9 | +| 51+ | -17 | 1 | -9 | +| 52 | -17 | 1 | -17 | +| 52+ | -33 | 0 | -17 | +| 53 | -33 | 0 | -17 | +| 53+ | -33 | 1 | -17 | +| 54 | -33 | 1 | -33 | +| 54+ | -65 | 0 | -33 | +| 55 | -65 | 0 | -33 | +| 55+ | -65 | 1 | -33 | +| 56 | -65 | 1 | -65 | +| 56+ | -129 | 0 | -65 | +| 57 | -129 | 0 | -65 | +| 57+ | -129 | 1 | -65 | +| 58 | -129 | 1 | -129 | +| 58+ | -257 | 0 | -129 | +| 59 | -257 | 0 | -129 | +| 59+ | -257 | 1 | -129 | +| 60 | -257 | 1 | -257 | +| 60+ | -513 | 0 | -257 | +| 61 | -513 | 0 | -257 | +| 61+ | -513 | 1 | -257 | +| 62 | -513 | 1 | -513 | +| 62+ | -1025 | 0 | -513 | +| 63 | -1025 | 0 | -513 | +| 63+ | -1025 | 1 | -513 | +| 64 | -1025 | 1 | -1025 | +| 64+ | -2049 | 0 | -1025 | +| 65 | -2049 | 0 | -1025 | +| 65+ | -2049 | 1 | -1025 | +| 66 | -2049 | 1 | -2049 | +| 66+ | -4097 | 0 | -2049 | +| 67 | -4097 | 0 | -2049 | +| 67+ | -4097 | 1 | -2049 | +| 68 | -4097 | 1 | -4097 | +| 68+ | -8193 | 0 | -4097 | +| 69 | -8193 | 0 | -4097 | +| 69+ | -8193 | 1 | -4097 | +| 70 | -8193 | 1 | -8193 | +| 70+ | -16385 | 0 | -8193 | +| 71 | -16385 | 0 | -8193 | +| 71+ | -16385 | 1 | -8193 | +| 72 | -16385 | 1 | -16385 | +| 72+ | 32767 | 0 | -16385 | +| 73 | 32767 | 0 | -16385 | +| 73+ | 32767 | 1 | -16385 | +| 74 | 32767 | 1 | 32767 |`; diff --git a/web-ide-main/projects/src/project_03/03_pc.ts b/web-ide-main/projects/src/project_03/03_pc.ts new file mode 100644 index 0000000..e326125 --- /dev/null +++ b/web-ide-main/projects/src/project_03/03_pc.ts @@ -0,0 +1,173 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/a/PC.hdl +/** + * A 16-bit counter. + * if reset(t): out(t+1) = 0 + * else if load(t): out(t+1) = in(t) + * else if inc(t): out(t+1) = out(t) + 1 + * else out(t+1) = out(t) + */ +CHIP PC { + IN in[16], reset, load, inc; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/03/a/PC.tst + +load PC.hdl, +compare-to PC.cmp, +output-list time%S1.3.1 in%D1.6.1 reset%B2.1.2 load%B2.1.2 inc%B2.1.2 out%D1.6.1; + +set in 0, +set reset 0, +set load 0, +set inc 0, +tick, +output; + +tock, +output; + +set inc 1, +tick, +output; + +tock, +output; + +set in -32123, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set load 0, +tick, +output; + +tock, +output; + +tick, +output; + +tock, +output; + +set in 12345, +set load 1, +set inc 0, +tick, +output; + +tock, +output; + +set reset 1, +tick, +output; + +tock, +output; + +set reset 0, +set inc 1, +tick, +output; + +tock, +output; + +set reset 1, +tick, +output; + +tock, +output; + +set reset 0, +set load 0, +tick, +output; + +tock, +output; + +set reset 1, +tick, +output; + +tock, +output; + +set in 0, +set reset 0, +set load 1, +tick, +output; + +tock, +output; + +set load 0, +set inc 1, +tick, +output; + +tock, +output; + +set in 22222, +set reset 1, +set inc 0, +tick, +output; + +tock, +output;`; +export const cmp = `|time | in |reset|load | inc | out | +| 0+ | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 0 | 0 | 1 | 0 | +| 2 | 0 | 0 | 0 | 1 | 1 | +| 2+ | -32123 | 0 | 0 | 1 | 1 | +| 3 | -32123 | 0 | 0 | 1 | 2 | +| 3+ | -32123 | 0 | 1 | 1 | 2 | +| 4 | -32123 | 0 | 1 | 1 | -32123 | +| 4+ | -32123 | 0 | 0 | 1 | -32123 | +| 5 | -32123 | 0 | 0 | 1 | -32122 | +| 5+ | -32123 | 0 | 0 | 1 | -32122 | +| 6 | -32123 | 0 | 0 | 1 | -32121 | +| 6+ | 12345 | 0 | 1 | 0 | -32121 | +| 7 | 12345 | 0 | 1 | 0 | 12345 | +| 7+ | 12345 | 1 | 1 | 0 | 12345 | +| 8 | 12345 | 1 | 1 | 0 | 0 | +| 8+ | 12345 | 0 | 1 | 1 | 0 | +| 9 | 12345 | 0 | 1 | 1 | 12345 | +| 9+ | 12345 | 1 | 1 | 1 | 12345 | +| 10 | 12345 | 1 | 1 | 1 | 0 | +| 10+ | 12345 | 0 | 0 | 1 | 0 | +| 11 | 12345 | 0 | 0 | 1 | 1 | +| 11+ | 12345 | 1 | 0 | 1 | 1 | +| 12 | 12345 | 1 | 0 | 1 | 0 | +| 12+ | 0 | 0 | 1 | 1 | 0 | +| 13 | 0 | 0 | 1 | 1 | 0 | +| 13+ | 0 | 0 | 0 | 1 | 0 | +| 14 | 0 | 0 | 0 | 1 | 1 | +| 14+ | 22222 | 1 | 0 | 0 | 1 | +| 15 | 22222 | 1 | 0 | 0 | 0 |`; diff --git a/web-ide-main/projects/src/project_03/04_ram8.ts b/web-ide-main/projects/src/project_03/04_ram8.ts new file mode 100644 index 0000000..ed873d8 --- /dev/null +++ b/web-ide-main/projects/src/project_03/04_ram8.ts @@ -0,0 +1,749 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/a/RAM8.hdl +/** + * Memory of eight 16-bit registers. + * If load is asserted, the value of the register selected by + * address is set to in; Otherwise, the value does not change. + * The value of the selected register is emitted by out. + */ +CHIP RAM8 { + IN in[16], load, address[3]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/a/RAM8.tst + +load RAM8.hdl, +compare-to RAM8.cmp, +output-list time%S1.3.1 in%D1.6.1 load%B2.1.1 address%D3.1.3 out%D1.6.1; + +set in 0, +set load 0, +set address 0, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set in 11111, +set load 0, +tick, +output; +tock, +output; + +set load 1, +set address 1, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; + +set in 3333, +set address 3, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 1, +eval, +output; + +set in 7777, +tick, +output; +tock, +output; + +set load 1, +set address 7, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 3, +eval, +output; + +set address 7, +eval, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address 0, +tick, +output; +tock, +output; +set address 1, +tick, +output, +tock, +output; +set address 2, +tick, +output, +tock, +output; +set address 3, +tick, +output, +tock, +output; +set address 4, +tick, +output, +tock, +output; +set address 5, +tick, +output, +tock, +output; +set address 6, +tick, +output, +tock, +output; +set address 7, +tick, +output, +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 0, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 0, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 1, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 1, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 2, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 2, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 3, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 3, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 4, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 4, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 5, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 5, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 6, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 6, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 7, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 7, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; +`; +export const cmp = `|time | in |load|address| out | +| 0+ | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | 0 | +| 2 | 0 | 1 | 0 | 0 | +| 2+ | 11111 | 0 | 0 | 0 | +| 3 | 11111 | 0 | 0 | 0 | +| 3+ | 11111 | 1 | 1 | 0 | +| 4 | 11111 | 1 | 1 | 11111 | +| 4+ | 11111 | 0 | 0 | 0 | +| 5 | 11111 | 0 | 0 | 0 | +| 5+ | 3333 | 0 | 3 | 0 | +| 6 | 3333 | 0 | 3 | 0 | +| 6+ | 3333 | 1 | 3 | 0 | +| 7 | 3333 | 1 | 3 | 3333 | +| 7+ | 3333 | 0 | 3 | 3333 | +| 8 | 3333 | 0 | 3 | 3333 | +| 8 | 3333 | 0 | 1 | 11111 | +| 8+ | 7777 | 0 | 1 | 11111 | +| 9 | 7777 | 0 | 1 | 11111 | +| 9+ | 7777 | 1 | 7 | 0 | +| 10 | 7777 | 1 | 7 | 7777 | +| 10+ | 7777 | 0 | 7 | 7777 | +| 11 | 7777 | 0 | 7 | 7777 | +| 11 | 7777 | 0 | 3 | 3333 | +| 11 | 7777 | 0 | 7 | 7777 | +| 11+ | 7777 | 0 | 0 | 0 | +| 12 | 7777 | 0 | 0 | 0 | +| 12 | 7777 | 0 | 1 | 11111 | +| 12 | 7777 | 0 | 2 | 0 | +| 12 | 7777 | 0 | 3 | 3333 | +| 12 | 7777 | 0 | 4 | 0 | +| 12 | 7777 | 0 | 5 | 0 | +| 12 | 7777 | 0 | 6 | 0 | +| 12 | 7777 | 0 | 7 | 7777 | +| 12+ | 21845 | 1 | 0 | 0 | +| 13 | 21845 | 1 | 0 | 21845 | +| 13+ | 21845 | 1 | 1 | 11111 | +| 14 | 21845 | 1 | 1 | 21845 | +| 14+ | 21845 | 1 | 2 | 0 | +| 15 | 21845 | 1 | 2 | 21845 | +| 15+ | 21845 | 1 | 3 | 3333 | +| 16 | 21845 | 1 | 3 | 21845 | +| 16+ | 21845 | 1 | 4 | 0 | +| 17 | 21845 | 1 | 4 | 21845 | +| 17+ | 21845 | 1 | 5 | 0 | +| 18 | 21845 | 1 | 5 | 21845 | +| 18+ | 21845 | 1 | 6 | 0 | +| 19 | 21845 | 1 | 6 | 21845 | +| 19+ | 21845 | 1 | 7 | 7777 | +| 20 | 21845 | 1 | 7 | 21845 | +| 20+ | 21845 | 0 | 0 | 21845 | +| 21 | 21845 | 0 | 0 | 21845 | +| 21 | 21845 | 0 | 1 | 21845 | +| 21 | 21845 | 0 | 2 | 21845 | +| 21 | 21845 | 0 | 3 | 21845 | +| 21 | 21845 | 0 | 4 | 21845 | +| 21 | 21845 | 0 | 5 | 21845 | +| 21 | 21845 | 0 | 6 | 21845 | +| 21 | 21845 | 0 | 7 | 21845 | +| 21+ | -21846 | 1 | 0 | 21845 | +| 22 | -21846 | 1 | 0 | -21846 | +| 22+ | -21846 | 0 | 0 | -21846 | +| 23 | -21846 | 0 | 0 | -21846 | +| 23 | -21846 | 0 | 1 | 21845 | +| 23 | -21846 | 0 | 2 | 21845 | +| 23 | -21846 | 0 | 3 | 21845 | +| 23 | -21846 | 0 | 4 | 21845 | +| 23 | -21846 | 0 | 5 | 21845 | +| 23 | -21846 | 0 | 6 | 21845 | +| 23 | -21846 | 0 | 7 | 21845 | +| 23+ | 21845 | 1 | 0 | -21846 | +| 24 | 21845 | 1 | 0 | 21845 | +| 24+ | -21846 | 1 | 1 | 21845 | +| 25 | -21846 | 1 | 1 | -21846 | +| 25+ | -21846 | 0 | 0 | 21845 | +| 26 | -21846 | 0 | 0 | 21845 | +| 26 | -21846 | 0 | 1 | -21846 | +| 26 | -21846 | 0 | 2 | 21845 | +| 26 | -21846 | 0 | 3 | 21845 | +| 26 | -21846 | 0 | 4 | 21845 | +| 26 | -21846 | 0 | 5 | 21845 | +| 26 | -21846 | 0 | 6 | 21845 | +| 26 | -21846 | 0 | 7 | 21845 | +| 26+ | 21845 | 1 | 1 | -21846 | +| 27 | 21845 | 1 | 1 | 21845 | +| 27+ | -21846 | 1 | 2 | 21845 | +| 28 | -21846 | 1 | 2 | -21846 | +| 28+ | -21846 | 0 | 0 | 21845 | +| 29 | -21846 | 0 | 0 | 21845 | +| 29 | -21846 | 0 | 1 | 21845 | +| 29 | -21846 | 0 | 2 | -21846 | +| 29 | -21846 | 0 | 3 | 21845 | +| 29 | -21846 | 0 | 4 | 21845 | +| 29 | -21846 | 0 | 5 | 21845 | +| 29 | -21846 | 0 | 6 | 21845 | +| 29 | -21846 | 0 | 7 | 21845 | +| 29+ | 21845 | 1 | 2 | -21846 | +| 30 | 21845 | 1 | 2 | 21845 | +| 30+ | -21846 | 1 | 3 | 21845 | +| 31 | -21846 | 1 | 3 | -21846 | +| 31+ | -21846 | 0 | 0 | 21845 | +| 32 | -21846 | 0 | 0 | 21845 | +| 32 | -21846 | 0 | 1 | 21845 | +| 32 | -21846 | 0 | 2 | 21845 | +| 32 | -21846 | 0 | 3 | -21846 | +| 32 | -21846 | 0 | 4 | 21845 | +| 32 | -21846 | 0 | 5 | 21845 | +| 32 | -21846 | 0 | 6 | 21845 | +| 32 | -21846 | 0 | 7 | 21845 | +| 32+ | 21845 | 1 | 3 | -21846 | +| 33 | 21845 | 1 | 3 | 21845 | +| 33+ | -21846 | 1 | 4 | 21845 | +| 34 | -21846 | 1 | 4 | -21846 | +| 34+ | -21846 | 0 | 0 | 21845 | +| 35 | -21846 | 0 | 0 | 21845 | +| 35 | -21846 | 0 | 1 | 21845 | +| 35 | -21846 | 0 | 2 | 21845 | +| 35 | -21846 | 0 | 3 | 21845 | +| 35 | -21846 | 0 | 4 | -21846 | +| 35 | -21846 | 0 | 5 | 21845 | +| 35 | -21846 | 0 | 6 | 21845 | +| 35 | -21846 | 0 | 7 | 21845 | +| 35+ | 21845 | 1 | 4 | -21846 | +| 36 | 21845 | 1 | 4 | 21845 | +| 36+ | -21846 | 1 | 5 | 21845 | +| 37 | -21846 | 1 | 5 | -21846 | +| 37+ | -21846 | 0 | 0 | 21845 | +| 38 | -21846 | 0 | 0 | 21845 | +| 38 | -21846 | 0 | 1 | 21845 | +| 38 | -21846 | 0 | 2 | 21845 | +| 38 | -21846 | 0 | 3 | 21845 | +| 38 | -21846 | 0 | 4 | 21845 | +| 38 | -21846 | 0 | 5 | -21846 | +| 38 | -21846 | 0 | 6 | 21845 | +| 38 | -21846 | 0 | 7 | 21845 | +| 38+ | 21845 | 1 | 5 | -21846 | +| 39 | 21845 | 1 | 5 | 21845 | +| 39+ | -21846 | 1 | 6 | 21845 | +| 40 | -21846 | 1 | 6 | -21846 | +| 40+ | -21846 | 0 | 0 | 21845 | +| 41 | -21846 | 0 | 0 | 21845 | +| 41 | -21846 | 0 | 1 | 21845 | +| 41 | -21846 | 0 | 2 | 21845 | +| 41 | -21846 | 0 | 3 | 21845 | +| 41 | -21846 | 0 | 4 | 21845 | +| 41 | -21846 | 0 | 5 | 21845 | +| 41 | -21846 | 0 | 6 | -21846 | +| 41 | -21846 | 0 | 7 | 21845 | +| 41+ | 21845 | 1 | 6 | -21846 | +| 42 | 21845 | 1 | 6 | 21845 | +| 42+ | -21846 | 1 | 7 | 21845 | +| 43 | -21846 | 1 | 7 | -21846 | +| 43+ | -21846 | 0 | 0 | 21845 | +| 44 | -21846 | 0 | 0 | 21845 | +| 44 | -21846 | 0 | 1 | 21845 | +| 44 | -21846 | 0 | 2 | 21845 | +| 44 | -21846 | 0 | 3 | 21845 | +| 44 | -21846 | 0 | 4 | 21845 | +| 44 | -21846 | 0 | 5 | 21845 | +| 44 | -21846 | 0 | 6 | 21845 | +| 44 | -21846 | 0 | 7 | -21846 | +| 44+ | 21845 | 1 | 7 | -21846 | +| 45 | 21845 | 1 | 7 | 21845 | +| 45+ | 21845 | 0 | 0 | 21845 | +| 46 | 21845 | 0 | 0 | 21845 | +| 46 | 21845 | 0 | 1 | 21845 | +| 46 | 21845 | 0 | 2 | 21845 | +| 46 | 21845 | 0 | 3 | 21845 | +| 46 | 21845 | 0 | 4 | 21845 | +| 46 | 21845 | 0 | 5 | 21845 | +| 46 | 21845 | 0 | 6 | 21845 | +| 46 | 21845 | 0 | 7 | 21845 |`; diff --git a/web-ide-main/projects/src/project_03/05_ram64.ts b/web-ide-main/projects/src/project_03/05_ram64.ts new file mode 100644 index 0000000..6f636cb --- /dev/null +++ b/web-ide-main/projects/src/project_03/05_ram64.ts @@ -0,0 +1,1363 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/a/RAM64.hdl +/** + * Memory of sixty four 16-bit registers. + * If load is asserted, the value of the register selected by + * address is set to in; Otherwise, the value does not change. + * The value of the selected register is emitted by out. + */ +CHIP RAM64 { + IN in[16], load, address[6]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/a/RAM64.tst + +load RAM64.hdl, +compare-to RAM64.cmp, +output-list time%S1.3.1 in%D1.6.1 load%B2.1.1 address%D2.3.2 out%D1.6.1; + +set in 0, +set load 0, +set address 0, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set in 1313, +set load 0, +tick, +output; +tock, +output; + +set load 1, +set address 13, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; + +set in 4747, +set address 47, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 13, +eval, +output; + +set in 6363, +tick, +output; +tock, +output; + +set load 1, +set address 63, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 47, +eval, +output; + +set address 63, +eval, +output; + + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +tick, +output, +tock, +output; +set address %B101010, +tick, +output, +tock, +output; +set address %B101011, +tick, +output, +tock, +output; +set address %B101100, +tick, +output, +tock, +output; +set address %B101101, +tick, +output, +tock, +output; +set address %B101110, +tick, +output, +tock, +output; +set address %B101111, +tick, +output, +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101000, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101000, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101001, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101001, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101011, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101011, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101100, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101100, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101110, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101110, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101111, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101111, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +tick, +output, +tock, +output; +set address %B010101, +tick, +output, +tock, +output; +set address %B011101, +tick, +output, +tock, +output; +set address %B100101, +tick, +output, +tock, +output; +set address %B101101, +tick, +output, +tock, +output; +set address %B110101, +tick, +output, +tock, +output; +set address %B111101, +tick, +output, +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B000101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B000101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B001101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B001101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B011101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B011101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B100101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B100101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B101101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B110101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B110101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B111101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B111101, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output;`; + +export const cmp = `|time | in |load|address| out | +| 0+ | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | 0 | +| 2 | 0 | 1 | 0 | 0 | +| 2+ | 1313 | 0 | 0 | 0 | +| 3 | 1313 | 0 | 0 | 0 | +| 3+ | 1313 | 1 | 13 | 0 | +| 4 | 1313 | 1 | 13 | 1313 | +| 4+ | 1313 | 0 | 0 | 0 | +| 5 | 1313 | 0 | 0 | 0 | +| 5+ | 4747 | 0 | 47 | 0 | +| 6 | 4747 | 0 | 47 | 0 | +| 6+ | 4747 | 1 | 47 | 0 | +| 7 | 4747 | 1 | 47 | 4747 | +| 7+ | 4747 | 0 | 47 | 4747 | +| 8 | 4747 | 0 | 47 | 4747 | +| 8 | 4747 | 0 | 13 | 1313 | +| 8+ | 6363 | 0 | 13 | 1313 | +| 9 | 6363 | 0 | 13 | 1313 | +| 9+ | 6363 | 1 | 63 | 0 | +| 10 | 6363 | 1 | 63 | 6363 | +| 10+ | 6363 | 0 | 63 | 6363 | +| 11 | 6363 | 0 | 63 | 6363 | +| 11 | 6363 | 0 | 47 | 4747 | +| 11 | 6363 | 0 | 63 | 6363 | +| 11+ | 6363 | 0 | 40 | 0 | +| 12 | 6363 | 0 | 40 | 0 | +| 12 | 6363 | 0 | 41 | 0 | +| 12 | 6363 | 0 | 42 | 0 | +| 12 | 6363 | 0 | 43 | 0 | +| 12 | 6363 | 0 | 44 | 0 | +| 12 | 6363 | 0 | 45 | 0 | +| 12 | 6363 | 0 | 46 | 0 | +| 12 | 6363 | 0 | 47 | 4747 | +| 12+ | 21845 | 1 | 40 | 0 | +| 13 | 21845 | 1 | 40 | 21845 | +| 13+ | 21845 | 1 | 41 | 0 | +| 14 | 21845 | 1 | 41 | 21845 | +| 14+ | 21845 | 1 | 42 | 0 | +| 15 | 21845 | 1 | 42 | 21845 | +| 15+ | 21845 | 1 | 43 | 0 | +| 16 | 21845 | 1 | 43 | 21845 | +| 16+ | 21845 | 1 | 44 | 0 | +| 17 | 21845 | 1 | 44 | 21845 | +| 17+ | 21845 | 1 | 45 | 0 | +| 18 | 21845 | 1 | 45 | 21845 | +| 18+ | 21845 | 1 | 46 | 0 | +| 19 | 21845 | 1 | 46 | 21845 | +| 19+ | 21845 | 1 | 47 | 4747 | +| 20 | 21845 | 1 | 47 | 21845 | +| 20+ | 21845 | 0 | 40 | 21845 | +| 21 | 21845 | 0 | 40 | 21845 | +| 21 | 21845 | 0 | 41 | 21845 | +| 21 | 21845 | 0 | 42 | 21845 | +| 21 | 21845 | 0 | 43 | 21845 | +| 21 | 21845 | 0 | 44 | 21845 | +| 21 | 21845 | 0 | 45 | 21845 | +| 21 | 21845 | 0 | 46 | 21845 | +| 21 | 21845 | 0 | 47 | 21845 | +| 21+ | -21846 | 1 | 40 | 21845 | +| 22 | -21846 | 1 | 40 | -21846 | +| 22+ | -21846 | 0 | 40 | -21846 | +| 23 | -21846 | 0 | 40 | -21846 | +| 23 | -21846 | 0 | 41 | 21845 | +| 23 | -21846 | 0 | 42 | 21845 | +| 23 | -21846 | 0 | 43 | 21845 | +| 23 | -21846 | 0 | 44 | 21845 | +| 23 | -21846 | 0 | 45 | 21845 | +| 23 | -21846 | 0 | 46 | 21845 | +| 23 | -21846 | 0 | 47 | 21845 | +| 23+ | 21845 | 1 | 40 | -21846 | +| 24 | 21845 | 1 | 40 | 21845 | +| 24+ | -21846 | 1 | 41 | 21845 | +| 25 | -21846 | 1 | 41 | -21846 | +| 25+ | -21846 | 0 | 40 | 21845 | +| 26 | -21846 | 0 | 40 | 21845 | +| 26 | -21846 | 0 | 41 | -21846 | +| 26 | -21846 | 0 | 42 | 21845 | +| 26 | -21846 | 0 | 43 | 21845 | +| 26 | -21846 | 0 | 44 | 21845 | +| 26 | -21846 | 0 | 45 | 21845 | +| 26 | -21846 | 0 | 46 | 21845 | +| 26 | -21846 | 0 | 47 | 21845 | +| 26+ | 21845 | 1 | 41 | -21846 | +| 27 | 21845 | 1 | 41 | 21845 | +| 27+ | -21846 | 1 | 42 | 21845 | +| 28 | -21846 | 1 | 42 | -21846 | +| 28+ | -21846 | 0 | 40 | 21845 | +| 29 | -21846 | 0 | 40 | 21845 | +| 29 | -21846 | 0 | 41 | 21845 | +| 29 | -21846 | 0 | 42 | -21846 | +| 29 | -21846 | 0 | 43 | 21845 | +| 29 | -21846 | 0 | 44 | 21845 | +| 29 | -21846 | 0 | 45 | 21845 | +| 29 | -21846 | 0 | 46 | 21845 | +| 29 | -21846 | 0 | 47 | 21845 | +| 29+ | 21845 | 1 | 42 | -21846 | +| 30 | 21845 | 1 | 42 | 21845 | +| 30+ | -21846 | 1 | 43 | 21845 | +| 31 | -21846 | 1 | 43 | -21846 | +| 31+ | -21846 | 0 | 40 | 21845 | +| 32 | -21846 | 0 | 40 | 21845 | +| 32 | -21846 | 0 | 41 | 21845 | +| 32 | -21846 | 0 | 42 | 21845 | +| 32 | -21846 | 0 | 43 | -21846 | +| 32 | -21846 | 0 | 44 | 21845 | +| 32 | -21846 | 0 | 45 | 21845 | +| 32 | -21846 | 0 | 46 | 21845 | +| 32 | -21846 | 0 | 47 | 21845 | +| 32+ | 21845 | 1 | 43 | -21846 | +| 33 | 21845 | 1 | 43 | 21845 | +| 33+ | -21846 | 1 | 44 | 21845 | +| 34 | -21846 | 1 | 44 | -21846 | +| 34+ | -21846 | 0 | 40 | 21845 | +| 35 | -21846 | 0 | 40 | 21845 | +| 35 | -21846 | 0 | 41 | 21845 | +| 35 | -21846 | 0 | 42 | 21845 | +| 35 | -21846 | 0 | 43 | 21845 | +| 35 | -21846 | 0 | 44 | -21846 | +| 35 | -21846 | 0 | 45 | 21845 | +| 35 | -21846 | 0 | 46 | 21845 | +| 35 | -21846 | 0 | 47 | 21845 | +| 35+ | 21845 | 1 | 44 | -21846 | +| 36 | 21845 | 1 | 44 | 21845 | +| 36+ | -21846 | 1 | 45 | 21845 | +| 37 | -21846 | 1 | 45 | -21846 | +| 37+ | -21846 | 0 | 40 | 21845 | +| 38 | -21846 | 0 | 40 | 21845 | +| 38 | -21846 | 0 | 41 | 21845 | +| 38 | -21846 | 0 | 42 | 21845 | +| 38 | -21846 | 0 | 43 | 21845 | +| 38 | -21846 | 0 | 44 | 21845 | +| 38 | -21846 | 0 | 45 | -21846 | +| 38 | -21846 | 0 | 46 | 21845 | +| 38 | -21846 | 0 | 47 | 21845 | +| 38+ | 21845 | 1 | 45 | -21846 | +| 39 | 21845 | 1 | 45 | 21845 | +| 39+ | -21846 | 1 | 46 | 21845 | +| 40 | -21846 | 1 | 46 | -21846 | +| 40+ | -21846 | 0 | 40 | 21845 | +| 41 | -21846 | 0 | 40 | 21845 | +| 41 | -21846 | 0 | 41 | 21845 | +| 41 | -21846 | 0 | 42 | 21845 | +| 41 | -21846 | 0 | 43 | 21845 | +| 41 | -21846 | 0 | 44 | 21845 | +| 41 | -21846 | 0 | 45 | 21845 | +| 41 | -21846 | 0 | 46 | -21846 | +| 41 | -21846 | 0 | 47 | 21845 | +| 41+ | 21845 | 1 | 46 | -21846 | +| 42 | 21845 | 1 | 46 | 21845 | +| 42+ | -21846 | 1 | 47 | 21845 | +| 43 | -21846 | 1 | 47 | -21846 | +| 43+ | -21846 | 0 | 40 | 21845 | +| 44 | -21846 | 0 | 40 | 21845 | +| 44 | -21846 | 0 | 41 | 21845 | +| 44 | -21846 | 0 | 42 | 21845 | +| 44 | -21846 | 0 | 43 | 21845 | +| 44 | -21846 | 0 | 44 | 21845 | +| 44 | -21846 | 0 | 45 | 21845 | +| 44 | -21846 | 0 | 46 | 21845 | +| 44 | -21846 | 0 | 47 | -21846 | +| 44+ | 21845 | 1 | 47 | -21846 | +| 45 | 21845 | 1 | 47 | 21845 | +| 45+ | 21845 | 0 | 40 | 21845 | +| 46 | 21845 | 0 | 40 | 21845 | +| 46 | 21845 | 0 | 41 | 21845 | +| 46 | 21845 | 0 | 42 | 21845 | +| 46 | 21845 | 0 | 43 | 21845 | +| 46 | 21845 | 0 | 44 | 21845 | +| 46 | 21845 | 0 | 45 | 21845 | +| 46 | 21845 | 0 | 46 | 21845 | +| 46 | 21845 | 0 | 47 | 21845 | +| 46+ | 21845 | 0 | 5 | 0 | +| 47 | 21845 | 0 | 5 | 0 | +| 47 | 21845 | 0 | 13 | 1313 | +| 47 | 21845 | 0 | 21 | 0 | +| 47 | 21845 | 0 | 29 | 0 | +| 47 | 21845 | 0 | 37 | 0 | +| 47 | 21845 | 0 | 45 | 21845 | +| 47 | 21845 | 0 | 53 | 0 | +| 47 | 21845 | 0 | 61 | 0 | +| 47+ | 21845 | 1 | 5 | 0 | +| 48 | 21845 | 1 | 5 | 21845 | +| 48+ | 21845 | 1 | 13 | 1313 | +| 49 | 21845 | 1 | 13 | 21845 | +| 49+ | 21845 | 1 | 21 | 0 | +| 50 | 21845 | 1 | 21 | 21845 | +| 50+ | 21845 | 1 | 29 | 0 | +| 51 | 21845 | 1 | 29 | 21845 | +| 51+ | 21845 | 1 | 37 | 0 | +| 52 | 21845 | 1 | 37 | 21845 | +| 52+ | 21845 | 1 | 45 | 21845 | +| 53 | 21845 | 1 | 45 | 21845 | +| 53+ | 21845 | 1 | 53 | 0 | +| 54 | 21845 | 1 | 53 | 21845 | +| 54+ | 21845 | 1 | 61 | 0 | +| 55 | 21845 | 1 | 61 | 21845 | +| 55+ | 21845 | 0 | 5 | 21845 | +| 56 | 21845 | 0 | 5 | 21845 | +| 56 | 21845 | 0 | 13 | 21845 | +| 56 | 21845 | 0 | 21 | 21845 | +| 56 | 21845 | 0 | 29 | 21845 | +| 56 | 21845 | 0 | 37 | 21845 | +| 56 | 21845 | 0 | 45 | 21845 | +| 56 | 21845 | 0 | 53 | 21845 | +| 56 | 21845 | 0 | 61 | 21845 | +| 56+ | -21846 | 1 | 5 | 21845 | +| 57 | -21846 | 1 | 5 | -21846 | +| 57+ | -21846 | 0 | 5 | -21846 | +| 58 | -21846 | 0 | 5 | -21846 | +| 58 | -21846 | 0 | 13 | 21845 | +| 58 | -21846 | 0 | 21 | 21845 | +| 58 | -21846 | 0 | 29 | 21845 | +| 58 | -21846 | 0 | 37 | 21845 | +| 58 | -21846 | 0 | 45 | 21845 | +| 58 | -21846 | 0 | 53 | 21845 | +| 58 | -21846 | 0 | 61 | 21845 | +| 58+ | 21845 | 1 | 5 | -21846 | +| 59 | 21845 | 1 | 5 | 21845 | +| 59+ | -21846 | 1 | 13 | 21845 | +| 60 | -21846 | 1 | 13 | -21846 | +| 60+ | -21846 | 0 | 5 | 21845 | +| 61 | -21846 | 0 | 5 | 21845 | +| 61 | -21846 | 0 | 13 | -21846 | +| 61 | -21846 | 0 | 21 | 21845 | +| 61 | -21846 | 0 | 29 | 21845 | +| 61 | -21846 | 0 | 37 | 21845 | +| 61 | -21846 | 0 | 45 | 21845 | +| 61 | -21846 | 0 | 53 | 21845 | +| 61 | -21846 | 0 | 61 | 21845 | +| 61+ | 21845 | 1 | 13 | -21846 | +| 62 | 21845 | 1 | 13 | 21845 | +| 62+ | -21846 | 1 | 21 | 21845 | +| 63 | -21846 | 1 | 21 | -21846 | +| 63+ | -21846 | 0 | 5 | 21845 | +| 64 | -21846 | 0 | 5 | 21845 | +| 64 | -21846 | 0 | 13 | 21845 | +| 64 | -21846 | 0 | 21 | -21846 | +| 64 | -21846 | 0 | 29 | 21845 | +| 64 | -21846 | 0 | 37 | 21845 | +| 64 | -21846 | 0 | 45 | 21845 | +| 64 | -21846 | 0 | 53 | 21845 | +| 64 | -21846 | 0 | 61 | 21845 | +| 64+ | 21845 | 1 | 21 | -21846 | +| 65 | 21845 | 1 | 21 | 21845 | +| 65+ | -21846 | 1 | 29 | 21845 | +| 66 | -21846 | 1 | 29 | -21846 | +| 66+ | -21846 | 0 | 5 | 21845 | +| 67 | -21846 | 0 | 5 | 21845 | +| 67 | -21846 | 0 | 13 | 21845 | +| 67 | -21846 | 0 | 21 | 21845 | +| 67 | -21846 | 0 | 29 | -21846 | +| 67 | -21846 | 0 | 37 | 21845 | +| 67 | -21846 | 0 | 45 | 21845 | +| 67 | -21846 | 0 | 53 | 21845 | +| 67 | -21846 | 0 | 61 | 21845 | +| 67+ | 21845 | 1 | 29 | -21846 | +| 68 | 21845 | 1 | 29 | 21845 | +| 68+ | -21846 | 1 | 37 | 21845 | +| 69 | -21846 | 1 | 37 | -21846 | +| 69+ | -21846 | 0 | 5 | 21845 | +| 70 | -21846 | 0 | 5 | 21845 | +| 70 | -21846 | 0 | 13 | 21845 | +| 70 | -21846 | 0 | 21 | 21845 | +| 70 | -21846 | 0 | 29 | 21845 | +| 70 | -21846 | 0 | 37 | -21846 | +| 70 | -21846 | 0 | 45 | 21845 | +| 70 | -21846 | 0 | 53 | 21845 | +| 70 | -21846 | 0 | 61 | 21845 | +| 70+ | 21845 | 1 | 37 | -21846 | +| 71 | 21845 | 1 | 37 | 21845 | +| 71+ | -21846 | 1 | 45 | 21845 | +| 72 | -21846 | 1 | 45 | -21846 | +| 72+ | -21846 | 0 | 5 | 21845 | +| 73 | -21846 | 0 | 5 | 21845 | +| 73 | -21846 | 0 | 13 | 21845 | +| 73 | -21846 | 0 | 21 | 21845 | +| 73 | -21846 | 0 | 29 | 21845 | +| 73 | -21846 | 0 | 37 | 21845 | +| 73 | -21846 | 0 | 45 | -21846 | +| 73 | -21846 | 0 | 53 | 21845 | +| 73 | -21846 | 0 | 61 | 21845 | +| 73+ | 21845 | 1 | 45 | -21846 | +| 74 | 21845 | 1 | 45 | 21845 | +| 74+ | -21846 | 1 | 53 | 21845 | +| 75 | -21846 | 1 | 53 | -21846 | +| 75+ | -21846 | 0 | 5 | 21845 | +| 76 | -21846 | 0 | 5 | 21845 | +| 76 | -21846 | 0 | 13 | 21845 | +| 76 | -21846 | 0 | 21 | 21845 | +| 76 | -21846 | 0 | 29 | 21845 | +| 76 | -21846 | 0 | 37 | 21845 | +| 76 | -21846 | 0 | 45 | 21845 | +| 76 | -21846 | 0 | 53 | -21846 | +| 76 | -21846 | 0 | 61 | 21845 | +| 76+ | 21845 | 1 | 53 | -21846 | +| 77 | 21845 | 1 | 53 | 21845 | +| 77+ | -21846 | 1 | 61 | 21845 | +| 78 | -21846 | 1 | 61 | -21846 | +| 78+ | -21846 | 0 | 5 | 21845 | +| 79 | -21846 | 0 | 5 | 21845 | +| 79 | -21846 | 0 | 13 | 21845 | +| 79 | -21846 | 0 | 21 | 21845 | +| 79 | -21846 | 0 | 29 | 21845 | +| 79 | -21846 | 0 | 37 | 21845 | +| 79 | -21846 | 0 | 45 | 21845 | +| 79 | -21846 | 0 | 53 | 21845 | +| 79 | -21846 | 0 | 61 | -21846 | +| 79+ | 21845 | 1 | 61 | -21846 | +| 80 | 21845 | 1 | 61 | 21845 | +| 80+ | 21845 | 0 | 5 | 21845 | +| 81 | 21845 | 0 | 5 | 21845 | +| 81 | 21845 | 0 | 13 | 21845 | +| 81 | 21845 | 0 | 21 | 21845 | +| 81 | 21845 | 0 | 29 | 21845 | +| 81 | 21845 | 0 | 37 | 21845 | +| 81 | 21845 | 0 | 45 | 21845 | +| 81 | 21845 | 0 | 53 | 21845 | +| 81 | 21845 | 0 | 61 | 21845 |`; diff --git a/web-ide-main/projects/src/project_03/06_ram512.ts b/web-ide-main/projects/src/project_03/06_ram512.ts new file mode 100644 index 0000000..3970f83 --- /dev/null +++ b/web-ide-main/projects/src/project_03/06_ram512.ts @@ -0,0 +1,1363 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/b/RAM512.hdl +/** + * Memory of 512 16-bit registers. + * If load is asserted, the value of the register selected by + * address is set to in; Otherwise, the value does not change. + * The value of the selected register is emitted by out. + */ +CHIP RAM512 { + IN in[16], load, address[9]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/b/RAM512.tst + +load RAM512.hdl, +compare-to RAM512.cmp, +output-list time%S1.3.1 in%D1.6.1 load%B2.1.1 address%D2.3.2 out%D1.6.1; + +set in 0, +set load 0, +set address 0, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set in 13099, +set load 0, +tick, +output; +tock, +output; + +set load 1, +set address 130, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; + +set in 4729, +set address 472, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 130, +eval, +output; + +set in 5119, +tick, +output; +tock, +output; + +set load 1, +set address 511, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 472, +eval, +output; + +set address 511, +eval, +output; + + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +tick, +output, +tock, +output; +set address %B010101010, +tick, +output, +tock, +output; +set address %B010101011, +tick, +output, +tock, +output; +set address %B010101100, +tick, +output, +tock, +output; +set address %B010101101, +tick, +output, +tock, +output; +set address %B010101110, +tick, +output, +tock, +output; +set address %B010101111, +tick, +output, +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101000, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101000, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101001, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101001, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101011, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101011, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101100, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101100, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101110, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101110, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101111, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101111, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +tick, +output, +tock, +output; +set address %B010101010, +tick, +output, +tock, +output; +set address %B011101010, +tick, +output, +tock, +output; +set address %B100101010, +tick, +output, +tock, +output; +set address %B101101010, +tick, +output, +tock, +output; +set address %B110101010, +tick, +output, +tock, +output; +set address %B111101010, +tick, +output, +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B000101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B000101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B001101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B001101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B010101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B011101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B011101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B100101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B100101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B101101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B110101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B110101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B111101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B111101010, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; +`; +export const cmp = `|time | in |load|address| out | +| 0+ | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | 0 | +| 2 | 0 | 1 | 0 | 0 | +| 2+ | 13099 | 0 | 0 | 0 | +| 3 | 13099 | 0 | 0 | 0 | +| 3+ | 13099 | 1 | 130 | 0 | +| 4 | 13099 | 1 | 130 | 13099 | +| 4+ | 13099 | 0 | 0 | 0 | +| 5 | 13099 | 0 | 0 | 0 | +| 5+ | 4729 | 0 | 472 | 0 | +| 6 | 4729 | 0 | 472 | 0 | +| 6+ | 4729 | 1 | 472 | 0 | +| 7 | 4729 | 1 | 472 | 4729 | +| 7+ | 4729 | 0 | 472 | 4729 | +| 8 | 4729 | 0 | 472 | 4729 | +| 8 | 4729 | 0 | 130 | 13099 | +| 8+ | 5119 | 0 | 130 | 13099 | +| 9 | 5119 | 0 | 130 | 13099 | +| 9+ | 5119 | 1 | 511 | 0 | +| 10 | 5119 | 1 | 511 | 5119 | +| 10+ | 5119 | 0 | 511 | 5119 | +| 11 | 5119 | 0 | 511 | 5119 | +| 11 | 5119 | 0 | 472 | 4729 | +| 11 | 5119 | 0 | 511 | 5119 | +| 11+ | 5119 | 0 | 168 | 0 | +| 12 | 5119 | 0 | 168 | 0 | +| 12 | 5119 | 0 | 169 | 0 | +| 12 | 5119 | 0 | 170 | 0 | +| 12 | 5119 | 0 | 171 | 0 | +| 12 | 5119 | 0 | 172 | 0 | +| 12 | 5119 | 0 | 173 | 0 | +| 12 | 5119 | 0 | 174 | 0 | +| 12 | 5119 | 0 | 175 | 0 | +| 12+ | 21845 | 1 | 168 | 0 | +| 13 | 21845 | 1 | 168 | 21845 | +| 13+ | 21845 | 1 | 169 | 0 | +| 14 | 21845 | 1 | 169 | 21845 | +| 14+ | 21845 | 1 | 170 | 0 | +| 15 | 21845 | 1 | 170 | 21845 | +| 15+ | 21845 | 1 | 171 | 0 | +| 16 | 21845 | 1 | 171 | 21845 | +| 16+ | 21845 | 1 | 172 | 0 | +| 17 | 21845 | 1 | 172 | 21845 | +| 17+ | 21845 | 1 | 173 | 0 | +| 18 | 21845 | 1 | 173 | 21845 | +| 18+ | 21845 | 1 | 174 | 0 | +| 19 | 21845 | 1 | 174 | 21845 | +| 19+ | 21845 | 1 | 175 | 0 | +| 20 | 21845 | 1 | 175 | 21845 | +| 20+ | 21845 | 0 | 168 | 21845 | +| 21 | 21845 | 0 | 168 | 21845 | +| 21 | 21845 | 0 | 169 | 21845 | +| 21 | 21845 | 0 | 170 | 21845 | +| 21 | 21845 | 0 | 171 | 21845 | +| 21 | 21845 | 0 | 172 | 21845 | +| 21 | 21845 | 0 | 173 | 21845 | +| 21 | 21845 | 0 | 174 | 21845 | +| 21 | 21845 | 0 | 175 | 21845 | +| 21+ | -21846 | 1 | 168 | 21845 | +| 22 | -21846 | 1 | 168 | -21846 | +| 22+ | -21846 | 0 | 168 | -21846 | +| 23 | -21846 | 0 | 168 | -21846 | +| 23 | -21846 | 0 | 169 | 21845 | +| 23 | -21846 | 0 | 170 | 21845 | +| 23 | -21846 | 0 | 171 | 21845 | +| 23 | -21846 | 0 | 172 | 21845 | +| 23 | -21846 | 0 | 173 | 21845 | +| 23 | -21846 | 0 | 174 | 21845 | +| 23 | -21846 | 0 | 175 | 21845 | +| 23+ | 21845 | 1 | 168 | -21846 | +| 24 | 21845 | 1 | 168 | 21845 | +| 24+ | -21846 | 1 | 169 | 21845 | +| 25 | -21846 | 1 | 169 | -21846 | +| 25+ | -21846 | 0 | 168 | 21845 | +| 26 | -21846 | 0 | 168 | 21845 | +| 26 | -21846 | 0 | 169 | -21846 | +| 26 | -21846 | 0 | 170 | 21845 | +| 26 | -21846 | 0 | 171 | 21845 | +| 26 | -21846 | 0 | 172 | 21845 | +| 26 | -21846 | 0 | 173 | 21845 | +| 26 | -21846 | 0 | 174 | 21845 | +| 26 | -21846 | 0 | 175 | 21845 | +| 26+ | 21845 | 1 | 169 | -21846 | +| 27 | 21845 | 1 | 169 | 21845 | +| 27+ | -21846 | 1 | 170 | 21845 | +| 28 | -21846 | 1 | 170 | -21846 | +| 28+ | -21846 | 0 | 168 | 21845 | +| 29 | -21846 | 0 | 168 | 21845 | +| 29 | -21846 | 0 | 169 | 21845 | +| 29 | -21846 | 0 | 170 | -21846 | +| 29 | -21846 | 0 | 171 | 21845 | +| 29 | -21846 | 0 | 172 | 21845 | +| 29 | -21846 | 0 | 173 | 21845 | +| 29 | -21846 | 0 | 174 | 21845 | +| 29 | -21846 | 0 | 175 | 21845 | +| 29+ | 21845 | 1 | 170 | -21846 | +| 30 | 21845 | 1 | 170 | 21845 | +| 30+ | -21846 | 1 | 171 | 21845 | +| 31 | -21846 | 1 | 171 | -21846 | +| 31+ | -21846 | 0 | 168 | 21845 | +| 32 | -21846 | 0 | 168 | 21845 | +| 32 | -21846 | 0 | 169 | 21845 | +| 32 | -21846 | 0 | 170 | 21845 | +| 32 | -21846 | 0 | 171 | -21846 | +| 32 | -21846 | 0 | 172 | 21845 | +| 32 | -21846 | 0 | 173 | 21845 | +| 32 | -21846 | 0 | 174 | 21845 | +| 32 | -21846 | 0 | 175 | 21845 | +| 32+ | 21845 | 1 | 171 | -21846 | +| 33 | 21845 | 1 | 171 | 21845 | +| 33+ | -21846 | 1 | 172 | 21845 | +| 34 | -21846 | 1 | 172 | -21846 | +| 34+ | -21846 | 0 | 168 | 21845 | +| 35 | -21846 | 0 | 168 | 21845 | +| 35 | -21846 | 0 | 169 | 21845 | +| 35 | -21846 | 0 | 170 | 21845 | +| 35 | -21846 | 0 | 171 | 21845 | +| 35 | -21846 | 0 | 172 | -21846 | +| 35 | -21846 | 0 | 173 | 21845 | +| 35 | -21846 | 0 | 174 | 21845 | +| 35 | -21846 | 0 | 175 | 21845 | +| 35+ | 21845 | 1 | 172 | -21846 | +| 36 | 21845 | 1 | 172 | 21845 | +| 36+ | -21846 | 1 | 173 | 21845 | +| 37 | -21846 | 1 | 173 | -21846 | +| 37+ | -21846 | 0 | 168 | 21845 | +| 38 | -21846 | 0 | 168 | 21845 | +| 38 | -21846 | 0 | 169 | 21845 | +| 38 | -21846 | 0 | 170 | 21845 | +| 38 | -21846 | 0 | 171 | 21845 | +| 38 | -21846 | 0 | 172 | 21845 | +| 38 | -21846 | 0 | 173 | -21846 | +| 38 | -21846 | 0 | 174 | 21845 | +| 38 | -21846 | 0 | 175 | 21845 | +| 38+ | 21845 | 1 | 173 | -21846 | +| 39 | 21845 | 1 | 173 | 21845 | +| 39+ | -21846 | 1 | 174 | 21845 | +| 40 | -21846 | 1 | 174 | -21846 | +| 40+ | -21846 | 0 | 168 | 21845 | +| 41 | -21846 | 0 | 168 | 21845 | +| 41 | -21846 | 0 | 169 | 21845 | +| 41 | -21846 | 0 | 170 | 21845 | +| 41 | -21846 | 0 | 171 | 21845 | +| 41 | -21846 | 0 | 172 | 21845 | +| 41 | -21846 | 0 | 173 | 21845 | +| 41 | -21846 | 0 | 174 | -21846 | +| 41 | -21846 | 0 | 175 | 21845 | +| 41+ | 21845 | 1 | 174 | -21846 | +| 42 | 21845 | 1 | 174 | 21845 | +| 42+ | -21846 | 1 | 175 | 21845 | +| 43 | -21846 | 1 | 175 | -21846 | +| 43+ | -21846 | 0 | 168 | 21845 | +| 44 | -21846 | 0 | 168 | 21845 | +| 44 | -21846 | 0 | 169 | 21845 | +| 44 | -21846 | 0 | 170 | 21845 | +| 44 | -21846 | 0 | 171 | 21845 | +| 44 | -21846 | 0 | 172 | 21845 | +| 44 | -21846 | 0 | 173 | 21845 | +| 44 | -21846 | 0 | 174 | 21845 | +| 44 | -21846 | 0 | 175 | -21846 | +| 44+ | 21845 | 1 | 175 | -21846 | +| 45 | 21845 | 1 | 175 | 21845 | +| 45+ | 21845 | 0 | 168 | 21845 | +| 46 | 21845 | 0 | 168 | 21845 | +| 46 | 21845 | 0 | 169 | 21845 | +| 46 | 21845 | 0 | 170 | 21845 | +| 46 | 21845 | 0 | 171 | 21845 | +| 46 | 21845 | 0 | 172 | 21845 | +| 46 | 21845 | 0 | 173 | 21845 | +| 46 | 21845 | 0 | 174 | 21845 | +| 46 | 21845 | 0 | 175 | 21845 | +| 46+ | 21845 | 0 | 42 | 0 | +| 47 | 21845 | 0 | 42 | 0 | +| 47 | 21845 | 0 | 106 | 0 | +| 47 | 21845 | 0 | 170 | 21845 | +| 47 | 21845 | 0 | 234 | 0 | +| 47 | 21845 | 0 | 298 | 0 | +| 47 | 21845 | 0 | 362 | 0 | +| 47 | 21845 | 0 | 426 | 0 | +| 47 | 21845 | 0 | 490 | 0 | +| 47+ | 21845 | 1 | 42 | 0 | +| 48 | 21845 | 1 | 42 | 21845 | +| 48+ | 21845 | 1 | 106 | 0 | +| 49 | 21845 | 1 | 106 | 21845 | +| 49+ | 21845 | 1 | 170 | 21845 | +| 50 | 21845 | 1 | 170 | 21845 | +| 50+ | 21845 | 1 | 234 | 0 | +| 51 | 21845 | 1 | 234 | 21845 | +| 51+ | 21845 | 1 | 298 | 0 | +| 52 | 21845 | 1 | 298 | 21845 | +| 52+ | 21845 | 1 | 362 | 0 | +| 53 | 21845 | 1 | 362 | 21845 | +| 53+ | 21845 | 1 | 426 | 0 | +| 54 | 21845 | 1 | 426 | 21845 | +| 54+ | 21845 | 1 | 490 | 0 | +| 55 | 21845 | 1 | 490 | 21845 | +| 55+ | 21845 | 0 | 42 | 21845 | +| 56 | 21845 | 0 | 42 | 21845 | +| 56 | 21845 | 0 | 106 | 21845 | +| 56 | 21845 | 0 | 170 | 21845 | +| 56 | 21845 | 0 | 234 | 21845 | +| 56 | 21845 | 0 | 298 | 21845 | +| 56 | 21845 | 0 | 362 | 21845 | +| 56 | 21845 | 0 | 426 | 21845 | +| 56 | 21845 | 0 | 490 | 21845 | +| 56+ | -21846 | 1 | 42 | 21845 | +| 57 | -21846 | 1 | 42 | -21846 | +| 57+ | -21846 | 0 | 42 | -21846 | +| 58 | -21846 | 0 | 42 | -21846 | +| 58 | -21846 | 0 | 106 | 21845 | +| 58 | -21846 | 0 | 170 | 21845 | +| 58 | -21846 | 0 | 234 | 21845 | +| 58 | -21846 | 0 | 298 | 21845 | +| 58 | -21846 | 0 | 362 | 21845 | +| 58 | -21846 | 0 | 426 | 21845 | +| 58 | -21846 | 0 | 490 | 21845 | +| 58+ | 21845 | 1 | 42 | -21846 | +| 59 | 21845 | 1 | 42 | 21845 | +| 59+ | -21846 | 1 | 106 | 21845 | +| 60 | -21846 | 1 | 106 | -21846 | +| 60+ | -21846 | 0 | 42 | 21845 | +| 61 | -21846 | 0 | 42 | 21845 | +| 61 | -21846 | 0 | 106 | -21846 | +| 61 | -21846 | 0 | 170 | 21845 | +| 61 | -21846 | 0 | 234 | 21845 | +| 61 | -21846 | 0 | 298 | 21845 | +| 61 | -21846 | 0 | 362 | 21845 | +| 61 | -21846 | 0 | 426 | 21845 | +| 61 | -21846 | 0 | 490 | 21845 | +| 61+ | 21845 | 1 | 106 | -21846 | +| 62 | 21845 | 1 | 106 | 21845 | +| 62+ | -21846 | 1 | 170 | 21845 | +| 63 | -21846 | 1 | 170 | -21846 | +| 63+ | -21846 | 0 | 42 | 21845 | +| 64 | -21846 | 0 | 42 | 21845 | +| 64 | -21846 | 0 | 106 | 21845 | +| 64 | -21846 | 0 | 170 | -21846 | +| 64 | -21846 | 0 | 234 | 21845 | +| 64 | -21846 | 0 | 298 | 21845 | +| 64 | -21846 | 0 | 362 | 21845 | +| 64 | -21846 | 0 | 426 | 21845 | +| 64 | -21846 | 0 | 490 | 21845 | +| 64+ | 21845 | 1 | 170 | -21846 | +| 65 | 21845 | 1 | 170 | 21845 | +| 65+ | -21846 | 1 | 234 | 21845 | +| 66 | -21846 | 1 | 234 | -21846 | +| 66+ | -21846 | 0 | 42 | 21845 | +| 67 | -21846 | 0 | 42 | 21845 | +| 67 | -21846 | 0 | 106 | 21845 | +| 67 | -21846 | 0 | 170 | 21845 | +| 67 | -21846 | 0 | 234 | -21846 | +| 67 | -21846 | 0 | 298 | 21845 | +| 67 | -21846 | 0 | 362 | 21845 | +| 67 | -21846 | 0 | 426 | 21845 | +| 67 | -21846 | 0 | 490 | 21845 | +| 67+ | 21845 | 1 | 234 | -21846 | +| 68 | 21845 | 1 | 234 | 21845 | +| 68+ | -21846 | 1 | 298 | 21845 | +| 69 | -21846 | 1 | 298 | -21846 | +| 69+ | -21846 | 0 | 42 | 21845 | +| 70 | -21846 | 0 | 42 | 21845 | +| 70 | -21846 | 0 | 106 | 21845 | +| 70 | -21846 | 0 | 170 | 21845 | +| 70 | -21846 | 0 | 234 | 21845 | +| 70 | -21846 | 0 | 298 | -21846 | +| 70 | -21846 | 0 | 362 | 21845 | +| 70 | -21846 | 0 | 426 | 21845 | +| 70 | -21846 | 0 | 490 | 21845 | +| 70+ | 21845 | 1 | 298 | -21846 | +| 71 | 21845 | 1 | 298 | 21845 | +| 71+ | -21846 | 1 | 362 | 21845 | +| 72 | -21846 | 1 | 362 | -21846 | +| 72+ | -21846 | 0 | 42 | 21845 | +| 73 | -21846 | 0 | 42 | 21845 | +| 73 | -21846 | 0 | 106 | 21845 | +| 73 | -21846 | 0 | 170 | 21845 | +| 73 | -21846 | 0 | 234 | 21845 | +| 73 | -21846 | 0 | 298 | 21845 | +| 73 | -21846 | 0 | 362 | -21846 | +| 73 | -21846 | 0 | 426 | 21845 | +| 73 | -21846 | 0 | 490 | 21845 | +| 73+ | 21845 | 1 | 362 | -21846 | +| 74 | 21845 | 1 | 362 | 21845 | +| 74+ | -21846 | 1 | 426 | 21845 | +| 75 | -21846 | 1 | 426 | -21846 | +| 75+ | -21846 | 0 | 42 | 21845 | +| 76 | -21846 | 0 | 42 | 21845 | +| 76 | -21846 | 0 | 106 | 21845 | +| 76 | -21846 | 0 | 170 | 21845 | +| 76 | -21846 | 0 | 234 | 21845 | +| 76 | -21846 | 0 | 298 | 21845 | +| 76 | -21846 | 0 | 362 | 21845 | +| 76 | -21846 | 0 | 426 | -21846 | +| 76 | -21846 | 0 | 490 | 21845 | +| 76+ | 21845 | 1 | 426 | -21846 | +| 77 | 21845 | 1 | 426 | 21845 | +| 77+ | -21846 | 1 | 490 | 21845 | +| 78 | -21846 | 1 | 490 | -21846 | +| 78+ | -21846 | 0 | 42 | 21845 | +| 79 | -21846 | 0 | 42 | 21845 | +| 79 | -21846 | 0 | 106 | 21845 | +| 79 | -21846 | 0 | 170 | 21845 | +| 79 | -21846 | 0 | 234 | 21845 | +| 79 | -21846 | 0 | 298 | 21845 | +| 79 | -21846 | 0 | 362 | 21845 | +| 79 | -21846 | 0 | 426 | 21845 | +| 79 | -21846 | 0 | 490 | -21846 | +| 79+ | 21845 | 1 | 490 | -21846 | +| 80 | 21845 | 1 | 490 | 21845 | +| 80+ | 21845 | 0 | 42 | 21845 | +| 81 | 21845 | 0 | 42 | 21845 | +| 81 | 21845 | 0 | 106 | 21845 | +| 81 | 21845 | 0 | 170 | 21845 | +| 81 | 21845 | 0 | 234 | 21845 | +| 81 | 21845 | 0 | 298 | 21845 | +| 81 | 21845 | 0 | 362 | 21845 | +| 81 | 21845 | 0 | 426 | 21845 | +| 81 | 21845 | 0 | 490 | 21845 |`; diff --git a/web-ide-main/projects/src/project_03/07_ram4k.ts b/web-ide-main/projects/src/project_03/07_ram4k.ts new file mode 100644 index 0000000..69a8ce7 --- /dev/null +++ b/web-ide-main/projects/src/project_03/07_ram4k.ts @@ -0,0 +1,1362 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/b/RAM4K.hdl +/** + * Memory of 4K 16-bit registers. + * If load is asserted, the value of the register selected by + * address is set to in; Otherwise, the value does not change. + * The value of the selected register is emitted by out. + */ +CHIP RAM4K { + IN in[16], load, address[12]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/b/RAM4K.tst + +load RAM4K.hdl, +compare-to RAM4K.cmp, +output-list time%S1.3.1 in%D1.6.1 load%B2.1.1 address%D2.4.2 out%D1.6.1; + +set in 0, +set load 0, +set address 0, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set in 1111, +set load 0, +tick, +output; +tock, +output; + +set load 1, +set address 1111, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; + +set in 3513, +set address 3513, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 1111, +eval, +output; + +set in 4095, +tick, +output; +tock, +output; + +set load 1, +set address 4095, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 3513, +eval, +output; + +set address 4095, +eval, +output; + + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +tick, +output, +tock, +output; +set address %B101010101010, +tick, +output, +tock, +output; +set address %B101010101011, +tick, +output, +tock, +output; +set address %B101010101100, +tick, +output, +tock, +output; +set address %B101010101101, +tick, +output, +tock, +output; +set address %B101010101110, +tick, +output, +tock, +output; +set address %B101010101111, +tick, +output, +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101000, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101000, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101001, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101001, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101011, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101011, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101100, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101100, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101110, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101110, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101111, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101111, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +tick, +output, +tock, +output; +set address %B010101010101, +tick, +output, +tock, +output; +set address %B011101010101, +tick, +output, +tock, +output; +set address %B100101010101, +tick, +output, +tock, +output; +set address %B101101010101, +tick, +output, +tock, +output; +set address %B110101010101, +tick, +output, +tock, +output; +set address %B111101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B000101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B000101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B001101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B001101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B010101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B011101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B011101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B100101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B100101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B101101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B110101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B110101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B111101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B111101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output;`; +export const cmp = `|time | in |load|address | out | +| 0+ | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | 0 | +| 2 | 0 | 1 | 0 | 0 | +| 2+ | 1111 | 0 | 0 | 0 | +| 3 | 1111 | 0 | 0 | 0 | +| 3+ | 1111 | 1 | 1111 | 0 | +| 4 | 1111 | 1 | 1111 | 1111 | +| 4+ | 1111 | 0 | 0 | 0 | +| 5 | 1111 | 0 | 0 | 0 | +| 5+ | 3513 | 0 | 3513 | 0 | +| 6 | 3513 | 0 | 3513 | 0 | +| 6+ | 3513 | 1 | 3513 | 0 | +| 7 | 3513 | 1 | 3513 | 3513 | +| 7+ | 3513 | 0 | 3513 | 3513 | +| 8 | 3513 | 0 | 3513 | 3513 | +| 8 | 3513 | 0 | 1111 | 1111 | +| 8+ | 4095 | 0 | 1111 | 1111 | +| 9 | 4095 | 0 | 1111 | 1111 | +| 9+ | 4095 | 1 | 4095 | 0 | +| 10 | 4095 | 1 | 4095 | 4095 | +| 10+ | 4095 | 0 | 4095 | 4095 | +| 11 | 4095 | 0 | 4095 | 4095 | +| 11 | 4095 | 0 | 3513 | 3513 | +| 11 | 4095 | 0 | 4095 | 4095 | +| 11+ | 4095 | 0 | 2728 | 0 | +| 12 | 4095 | 0 | 2728 | 0 | +| 12 | 4095 | 0 | 2729 | 0 | +| 12 | 4095 | 0 | 2730 | 0 | +| 12 | 4095 | 0 | 2731 | 0 | +| 12 | 4095 | 0 | 2732 | 0 | +| 12 | 4095 | 0 | 2733 | 0 | +| 12 | 4095 | 0 | 2734 | 0 | +| 12 | 4095 | 0 | 2735 | 0 | +| 12+ | 21845 | 1 | 2728 | 0 | +| 13 | 21845 | 1 | 2728 | 21845 | +| 13+ | 21845 | 1 | 2729 | 0 | +| 14 | 21845 | 1 | 2729 | 21845 | +| 14+ | 21845 | 1 | 2730 | 0 | +| 15 | 21845 | 1 | 2730 | 21845 | +| 15+ | 21845 | 1 | 2731 | 0 | +| 16 | 21845 | 1 | 2731 | 21845 | +| 16+ | 21845 | 1 | 2732 | 0 | +| 17 | 21845 | 1 | 2732 | 21845 | +| 17+ | 21845 | 1 | 2733 | 0 | +| 18 | 21845 | 1 | 2733 | 21845 | +| 18+ | 21845 | 1 | 2734 | 0 | +| 19 | 21845 | 1 | 2734 | 21845 | +| 19+ | 21845 | 1 | 2735 | 0 | +| 20 | 21845 | 1 | 2735 | 21845 | +| 20+ | 21845 | 0 | 2728 | 21845 | +| 21 | 21845 | 0 | 2728 | 21845 | +| 21 | 21845 | 0 | 2729 | 21845 | +| 21 | 21845 | 0 | 2730 | 21845 | +| 21 | 21845 | 0 | 2731 | 21845 | +| 21 | 21845 | 0 | 2732 | 21845 | +| 21 | 21845 | 0 | 2733 | 21845 | +| 21 | 21845 | 0 | 2734 | 21845 | +| 21 | 21845 | 0 | 2735 | 21845 | +| 21+ | -21846 | 1 | 2728 | 21845 | +| 22 | -21846 | 1 | 2728 | -21846 | +| 22+ | -21846 | 0 | 2728 | -21846 | +| 23 | -21846 | 0 | 2728 | -21846 | +| 23 | -21846 | 0 | 2729 | 21845 | +| 23 | -21846 | 0 | 2730 | 21845 | +| 23 | -21846 | 0 | 2731 | 21845 | +| 23 | -21846 | 0 | 2732 | 21845 | +| 23 | -21846 | 0 | 2733 | 21845 | +| 23 | -21846 | 0 | 2734 | 21845 | +| 23 | -21846 | 0 | 2735 | 21845 | +| 23+ | 21845 | 1 | 2728 | -21846 | +| 24 | 21845 | 1 | 2728 | 21845 | +| 24+ | -21846 | 1 | 2729 | 21845 | +| 25 | -21846 | 1 | 2729 | -21846 | +| 25+ | -21846 | 0 | 2728 | 21845 | +| 26 | -21846 | 0 | 2728 | 21845 | +| 26 | -21846 | 0 | 2729 | -21846 | +| 26 | -21846 | 0 | 2730 | 21845 | +| 26 | -21846 | 0 | 2731 | 21845 | +| 26 | -21846 | 0 | 2732 | 21845 | +| 26 | -21846 | 0 | 2733 | 21845 | +| 26 | -21846 | 0 | 2734 | 21845 | +| 26 | -21846 | 0 | 2735 | 21845 | +| 26+ | 21845 | 1 | 2729 | -21846 | +| 27 | 21845 | 1 | 2729 | 21845 | +| 27+ | -21846 | 1 | 2730 | 21845 | +| 28 | -21846 | 1 | 2730 | -21846 | +| 28+ | -21846 | 0 | 2728 | 21845 | +| 29 | -21846 | 0 | 2728 | 21845 | +| 29 | -21846 | 0 | 2729 | 21845 | +| 29 | -21846 | 0 | 2730 | -21846 | +| 29 | -21846 | 0 | 2731 | 21845 | +| 29 | -21846 | 0 | 2732 | 21845 | +| 29 | -21846 | 0 | 2733 | 21845 | +| 29 | -21846 | 0 | 2734 | 21845 | +| 29 | -21846 | 0 | 2735 | 21845 | +| 29+ | 21845 | 1 | 2730 | -21846 | +| 30 | 21845 | 1 | 2730 | 21845 | +| 30+ | -21846 | 1 | 2731 | 21845 | +| 31 | -21846 | 1 | 2731 | -21846 | +| 31+ | -21846 | 0 | 2728 | 21845 | +| 32 | -21846 | 0 | 2728 | 21845 | +| 32 | -21846 | 0 | 2729 | 21845 | +| 32 | -21846 | 0 | 2730 | 21845 | +| 32 | -21846 | 0 | 2731 | -21846 | +| 32 | -21846 | 0 | 2732 | 21845 | +| 32 | -21846 | 0 | 2733 | 21845 | +| 32 | -21846 | 0 | 2734 | 21845 | +| 32 | -21846 | 0 | 2735 | 21845 | +| 32+ | 21845 | 1 | 2731 | -21846 | +| 33 | 21845 | 1 | 2731 | 21845 | +| 33+ | -21846 | 1 | 2732 | 21845 | +| 34 | -21846 | 1 | 2732 | -21846 | +| 34+ | -21846 | 0 | 2728 | 21845 | +| 35 | -21846 | 0 | 2728 | 21845 | +| 35 | -21846 | 0 | 2729 | 21845 | +| 35 | -21846 | 0 | 2730 | 21845 | +| 35 | -21846 | 0 | 2731 | 21845 | +| 35 | -21846 | 0 | 2732 | -21846 | +| 35 | -21846 | 0 | 2733 | 21845 | +| 35 | -21846 | 0 | 2734 | 21845 | +| 35 | -21846 | 0 | 2735 | 21845 | +| 35+ | 21845 | 1 | 2732 | -21846 | +| 36 | 21845 | 1 | 2732 | 21845 | +| 36+ | -21846 | 1 | 2733 | 21845 | +| 37 | -21846 | 1 | 2733 | -21846 | +| 37+ | -21846 | 0 | 2728 | 21845 | +| 38 | -21846 | 0 | 2728 | 21845 | +| 38 | -21846 | 0 | 2729 | 21845 | +| 38 | -21846 | 0 | 2730 | 21845 | +| 38 | -21846 | 0 | 2731 | 21845 | +| 38 | -21846 | 0 | 2732 | 21845 | +| 38 | -21846 | 0 | 2733 | -21846 | +| 38 | -21846 | 0 | 2734 | 21845 | +| 38 | -21846 | 0 | 2735 | 21845 | +| 38+ | 21845 | 1 | 2733 | -21846 | +| 39 | 21845 | 1 | 2733 | 21845 | +| 39+ | -21846 | 1 | 2734 | 21845 | +| 40 | -21846 | 1 | 2734 | -21846 | +| 40+ | -21846 | 0 | 2728 | 21845 | +| 41 | -21846 | 0 | 2728 | 21845 | +| 41 | -21846 | 0 | 2729 | 21845 | +| 41 | -21846 | 0 | 2730 | 21845 | +| 41 | -21846 | 0 | 2731 | 21845 | +| 41 | -21846 | 0 | 2732 | 21845 | +| 41 | -21846 | 0 | 2733 | 21845 | +| 41 | -21846 | 0 | 2734 | -21846 | +| 41 | -21846 | 0 | 2735 | 21845 | +| 41+ | 21845 | 1 | 2734 | -21846 | +| 42 | 21845 | 1 | 2734 | 21845 | +| 42+ | -21846 | 1 | 2735 | 21845 | +| 43 | -21846 | 1 | 2735 | -21846 | +| 43+ | -21846 | 0 | 2728 | 21845 | +| 44 | -21846 | 0 | 2728 | 21845 | +| 44 | -21846 | 0 | 2729 | 21845 | +| 44 | -21846 | 0 | 2730 | 21845 | +| 44 | -21846 | 0 | 2731 | 21845 | +| 44 | -21846 | 0 | 2732 | 21845 | +| 44 | -21846 | 0 | 2733 | 21845 | +| 44 | -21846 | 0 | 2734 | 21845 | +| 44 | -21846 | 0 | 2735 | -21846 | +| 44+ | 21845 | 1 | 2735 | -21846 | +| 45 | 21845 | 1 | 2735 | 21845 | +| 45+ | 21845 | 0 | 2728 | 21845 | +| 46 | 21845 | 0 | 2728 | 21845 | +| 46 | 21845 | 0 | 2729 | 21845 | +| 46 | 21845 | 0 | 2730 | 21845 | +| 46 | 21845 | 0 | 2731 | 21845 | +| 46 | 21845 | 0 | 2732 | 21845 | +| 46 | 21845 | 0 | 2733 | 21845 | +| 46 | 21845 | 0 | 2734 | 21845 | +| 46 | 21845 | 0 | 2735 | 21845 | +| 46+ | 21845 | 0 | 341 | 0 | +| 47 | 21845 | 0 | 341 | 0 | +| 47 | 21845 | 0 | 853 | 0 | +| 47 | 21845 | 0 | 1365 | 0 | +| 47 | 21845 | 0 | 1877 | 0 | +| 47 | 21845 | 0 | 2389 | 0 | +| 47 | 21845 | 0 | 2901 | 0 | +| 47 | 21845 | 0 | 3413 | 0 | +| 47 | 21845 | 0 | 3925 | 0 | +| 47+ | 21845 | 1 | 341 | 0 | +| 48 | 21845 | 1 | 341 | 21845 | +| 48+ | 21845 | 1 | 853 | 0 | +| 49 | 21845 | 1 | 853 | 21845 | +| 49+ | 21845 | 1 | 1365 | 0 | +| 50 | 21845 | 1 | 1365 | 21845 | +| 50+ | 21845 | 1 | 1877 | 0 | +| 51 | 21845 | 1 | 1877 | 21845 | +| 51+ | 21845 | 1 | 2389 | 0 | +| 52 | 21845 | 1 | 2389 | 21845 | +| 52+ | 21845 | 1 | 2901 | 0 | +| 53 | 21845 | 1 | 2901 | 21845 | +| 53+ | 21845 | 1 | 3413 | 0 | +| 54 | 21845 | 1 | 3413 | 21845 | +| 54+ | 21845 | 1 | 3925 | 0 | +| 55 | 21845 | 1 | 3925 | 21845 | +| 55+ | 21845 | 0 | 341 | 21845 | +| 56 | 21845 | 0 | 341 | 21845 | +| 56 | 21845 | 0 | 853 | 21845 | +| 56 | 21845 | 0 | 1365 | 21845 | +| 56 | 21845 | 0 | 1877 | 21845 | +| 56 | 21845 | 0 | 2389 | 21845 | +| 56 | 21845 | 0 | 2901 | 21845 | +| 56 | 21845 | 0 | 3413 | 21845 | +| 56 | 21845 | 0 | 3925 | 21845 | +| 56+ | -21846 | 1 | 341 | 21845 | +| 57 | -21846 | 1 | 341 | -21846 | +| 57+ | -21846 | 0 | 341 | -21846 | +| 58 | -21846 | 0 | 341 | -21846 | +| 58 | -21846 | 0 | 853 | 21845 | +| 58 | -21846 | 0 | 1365 | 21845 | +| 58 | -21846 | 0 | 1877 | 21845 | +| 58 | -21846 | 0 | 2389 | 21845 | +| 58 | -21846 | 0 | 2901 | 21845 | +| 58 | -21846 | 0 | 3413 | 21845 | +| 58 | -21846 | 0 | 3925 | 21845 | +| 58+ | 21845 | 1 | 341 | -21846 | +| 59 | 21845 | 1 | 341 | 21845 | +| 59+ | -21846 | 1 | 853 | 21845 | +| 60 | -21846 | 1 | 853 | -21846 | +| 60+ | -21846 | 0 | 341 | 21845 | +| 61 | -21846 | 0 | 341 | 21845 | +| 61 | -21846 | 0 | 853 | -21846 | +| 61 | -21846 | 0 | 1365 | 21845 | +| 61 | -21846 | 0 | 1877 | 21845 | +| 61 | -21846 | 0 | 2389 | 21845 | +| 61 | -21846 | 0 | 2901 | 21845 | +| 61 | -21846 | 0 | 3413 | 21845 | +| 61 | -21846 | 0 | 3925 | 21845 | +| 61+ | 21845 | 1 | 853 | -21846 | +| 62 | 21845 | 1 | 853 | 21845 | +| 62+ | -21846 | 1 | 1365 | 21845 | +| 63 | -21846 | 1 | 1365 | -21846 | +| 63+ | -21846 | 0 | 341 | 21845 | +| 64 | -21846 | 0 | 341 | 21845 | +| 64 | -21846 | 0 | 853 | 21845 | +| 64 | -21846 | 0 | 1365 | -21846 | +| 64 | -21846 | 0 | 1877 | 21845 | +| 64 | -21846 | 0 | 2389 | 21845 | +| 64 | -21846 | 0 | 2901 | 21845 | +| 64 | -21846 | 0 | 3413 | 21845 | +| 64 | -21846 | 0 | 3925 | 21845 | +| 64+ | 21845 | 1 | 1365 | -21846 | +| 65 | 21845 | 1 | 1365 | 21845 | +| 65+ | -21846 | 1 | 1877 | 21845 | +| 66 | -21846 | 1 | 1877 | -21846 | +| 66+ | -21846 | 0 | 341 | 21845 | +| 67 | -21846 | 0 | 341 | 21845 | +| 67 | -21846 | 0 | 853 | 21845 | +| 67 | -21846 | 0 | 1365 | 21845 | +| 67 | -21846 | 0 | 1877 | -21846 | +| 67 | -21846 | 0 | 2389 | 21845 | +| 67 | -21846 | 0 | 2901 | 21845 | +| 67 | -21846 | 0 | 3413 | 21845 | +| 67 | -21846 | 0 | 3925 | 21845 | +| 67+ | 21845 | 1 | 1877 | -21846 | +| 68 | 21845 | 1 | 1877 | 21845 | +| 68+ | -21846 | 1 | 2389 | 21845 | +| 69 | -21846 | 1 | 2389 | -21846 | +| 69+ | -21846 | 0 | 341 | 21845 | +| 70 | -21846 | 0 | 341 | 21845 | +| 70 | -21846 | 0 | 853 | 21845 | +| 70 | -21846 | 0 | 1365 | 21845 | +| 70 | -21846 | 0 | 1877 | 21845 | +| 70 | -21846 | 0 | 2389 | -21846 | +| 70 | -21846 | 0 | 2901 | 21845 | +| 70 | -21846 | 0 | 3413 | 21845 | +| 70 | -21846 | 0 | 3925 | 21845 | +| 70+ | 21845 | 1 | 2389 | -21846 | +| 71 | 21845 | 1 | 2389 | 21845 | +| 71+ | -21846 | 1 | 2901 | 21845 | +| 72 | -21846 | 1 | 2901 | -21846 | +| 72+ | -21846 | 0 | 341 | 21845 | +| 73 | -21846 | 0 | 341 | 21845 | +| 73 | -21846 | 0 | 853 | 21845 | +| 73 | -21846 | 0 | 1365 | 21845 | +| 73 | -21846 | 0 | 1877 | 21845 | +| 73 | -21846 | 0 | 2389 | 21845 | +| 73 | -21846 | 0 | 2901 | -21846 | +| 73 | -21846 | 0 | 3413 | 21845 | +| 73 | -21846 | 0 | 3925 | 21845 | +| 73+ | 21845 | 1 | 2901 | -21846 | +| 74 | 21845 | 1 | 2901 | 21845 | +| 74+ | -21846 | 1 | 3413 | 21845 | +| 75 | -21846 | 1 | 3413 | -21846 | +| 75+ | -21846 | 0 | 341 | 21845 | +| 76 | -21846 | 0 | 341 | 21845 | +| 76 | -21846 | 0 | 853 | 21845 | +| 76 | -21846 | 0 | 1365 | 21845 | +| 76 | -21846 | 0 | 1877 | 21845 | +| 76 | -21846 | 0 | 2389 | 21845 | +| 76 | -21846 | 0 | 2901 | 21845 | +| 76 | -21846 | 0 | 3413 | -21846 | +| 76 | -21846 | 0 | 3925 | 21845 | +| 76+ | 21845 | 1 | 3413 | -21846 | +| 77 | 21845 | 1 | 3413 | 21845 | +| 77+ | -21846 | 1 | 3925 | 21845 | +| 78 | -21846 | 1 | 3925 | -21846 | +| 78+ | -21846 | 0 | 341 | 21845 | +| 79 | -21846 | 0 | 341 | 21845 | +| 79 | -21846 | 0 | 853 | 21845 | +| 79 | -21846 | 0 | 1365 | 21845 | +| 79 | -21846 | 0 | 1877 | 21845 | +| 79 | -21846 | 0 | 2389 | 21845 | +| 79 | -21846 | 0 | 2901 | 21845 | +| 79 | -21846 | 0 | 3413 | 21845 | +| 79 | -21846 | 0 | 3925 | -21846 | +| 79+ | 21845 | 1 | 3925 | -21846 | +| 80 | 21845 | 1 | 3925 | 21845 | +| 80+ | 21845 | 0 | 341 | 21845 | +| 81 | 21845 | 0 | 341 | 21845 | +| 81 | 21845 | 0 | 853 | 21845 | +| 81 | 21845 | 0 | 1365 | 21845 | +| 81 | 21845 | 0 | 1877 | 21845 | +| 81 | 21845 | 0 | 2389 | 21845 | +| 81 | 21845 | 0 | 2901 | 21845 | +| 81 | 21845 | 0 | 3413 | 21845 | +| 81 | 21845 | 0 | 3925 | 21845 |`; diff --git a/web-ide-main/projects/src/project_03/08_ram16k.ts b/web-ide-main/projects/src/project_03/08_ram16k.ts new file mode 100644 index 0000000..6b60c0e --- /dev/null +++ b/web-ide-main/projects/src/project_03/08_ram16k.ts @@ -0,0 +1,1362 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/b/RAM16K.hdl +/** + * Memory of 16K 16-bit registers. + * If load is asserted, the value of the register selected by + * address is set to in; Otherwise, the value does not change. + * The value of the selected register is emitted by out. + */ +CHIP RAM16K { + IN in[16], load, address[14]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/3/b/RAM16K.tst + +load RAM16K.hdl, +compare-to RAM16K.cmp, +output-list time%S1.3.1 in%D1.6.1 load%B2.1.1 address%D2.5.2 out%D1.6.1; + +set in 0, +set load 0, +set address 0, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set in 4321, +set load 0, +tick, +output; +tock, +output; + +set load 1, +set address 4321, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; + +set in 12345, +set address 12345, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 4321, +eval, +output; + +set in 16383, +tick, +output; +tock, +output; + +set load 1, +set address 16383, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 12345, +eval, +output; + +set address 16383, +eval, +output; + + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +tick, +output, +tock, +output; +set address %B10101010101010, +tick, +output, +tock, +output; +set address %B10101010101011, +tick, +output, +tock, +output; +set address %B10101010101100, +tick, +output, +tock, +output; +set address %B10101010101101, +tick, +output, +tock, +output; +set address %B10101010101110, +tick, +output, +tock, +output; +set address %B10101010101111, +tick, +output, +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101000, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101000, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101001, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101001, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101011, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101011, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101100, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101100, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101110, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101110, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101111, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101111, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +tick, +output, +tock, +output; +set address %B01010101010101, +tick, +output, +tock, +output; +set address %B01110101010101, +tick, +output, +tock, +output; +set address %B10010101010101, +tick, +output, +tock, +output; +set address %B10110101010101, +tick, +output, +tock, +output; +set address %B11010101010101, +tick, +output, +tock, +output; +set address %B11110101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B00010101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B00010101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B00110101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B00110101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B01010101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B01010101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B01110101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B01110101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10010101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B10010101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10110101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B10110101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B11010101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B11010101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B11110101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B11110101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output;`; +export const cmp = `|time | in |load| address | out | +| 0+ | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | 0 | +| 2 | 0 | 1 | 0 | 0 | +| 2+ | 4321 | 0 | 0 | 0 | +| 3 | 4321 | 0 | 0 | 0 | +| 3+ | 4321 | 1 | 4321 | 0 | +| 4 | 4321 | 1 | 4321 | 4321 | +| 4+ | 4321 | 0 | 0 | 0 | +| 5 | 4321 | 0 | 0 | 0 | +| 5+ | 12345 | 0 | 12345 | 0 | +| 6 | 12345 | 0 | 12345 | 0 | +| 6+ | 12345 | 1 | 12345 | 0 | +| 7 | 12345 | 1 | 12345 | 12345 | +| 7+ | 12345 | 0 | 12345 | 12345 | +| 8 | 12345 | 0 | 12345 | 12345 | +| 8 | 12345 | 0 | 4321 | 4321 | +| 8+ | 16383 | 0 | 4321 | 4321 | +| 9 | 16383 | 0 | 4321 | 4321 | +| 9+ | 16383 | 1 | 16383 | 0 | +| 10 | 16383 | 1 | 16383 | 16383 | +| 10+ | 16383 | 0 | 16383 | 16383 | +| 11 | 16383 | 0 | 16383 | 16383 | +| 11 | 16383 | 0 | 12345 | 12345 | +| 11 | 16383 | 0 | 16383 | 16383 | +| 11+ | 16383 | 0 | 10920 | 0 | +| 12 | 16383 | 0 | 10920 | 0 | +| 12 | 16383 | 0 | 10921 | 0 | +| 12 | 16383 | 0 | 10922 | 0 | +| 12 | 16383 | 0 | 10923 | 0 | +| 12 | 16383 | 0 | 10924 | 0 | +| 12 | 16383 | 0 | 10925 | 0 | +| 12 | 16383 | 0 | 10926 | 0 | +| 12 | 16383 | 0 | 10927 | 0 | +| 12+ | 21845 | 1 | 10920 | 0 | +| 13 | 21845 | 1 | 10920 | 21845 | +| 13+ | 21845 | 1 | 10921 | 0 | +| 14 | 21845 | 1 | 10921 | 21845 | +| 14+ | 21845 | 1 | 10922 | 0 | +| 15 | 21845 | 1 | 10922 | 21845 | +| 15+ | 21845 | 1 | 10923 | 0 | +| 16 | 21845 | 1 | 10923 | 21845 | +| 16+ | 21845 | 1 | 10924 | 0 | +| 17 | 21845 | 1 | 10924 | 21845 | +| 17+ | 21845 | 1 | 10925 | 0 | +| 18 | 21845 | 1 | 10925 | 21845 | +| 18+ | 21845 | 1 | 10926 | 0 | +| 19 | 21845 | 1 | 10926 | 21845 | +| 19+ | 21845 | 1 | 10927 | 0 | +| 20 | 21845 | 1 | 10927 | 21845 | +| 20+ | 21845 | 0 | 10920 | 21845 | +| 21 | 21845 | 0 | 10920 | 21845 | +| 21 | 21845 | 0 | 10921 | 21845 | +| 21 | 21845 | 0 | 10922 | 21845 | +| 21 | 21845 | 0 | 10923 | 21845 | +| 21 | 21845 | 0 | 10924 | 21845 | +| 21 | 21845 | 0 | 10925 | 21845 | +| 21 | 21845 | 0 | 10926 | 21845 | +| 21 | 21845 | 0 | 10927 | 21845 | +| 21+ | -21846 | 1 | 10920 | 21845 | +| 22 | -21846 | 1 | 10920 | -21846 | +| 22+ | -21846 | 0 | 10920 | -21846 | +| 23 | -21846 | 0 | 10920 | -21846 | +| 23 | -21846 | 0 | 10921 | 21845 | +| 23 | -21846 | 0 | 10922 | 21845 | +| 23 | -21846 | 0 | 10923 | 21845 | +| 23 | -21846 | 0 | 10924 | 21845 | +| 23 | -21846 | 0 | 10925 | 21845 | +| 23 | -21846 | 0 | 10926 | 21845 | +| 23 | -21846 | 0 | 10927 | 21845 | +| 23+ | 21845 | 1 | 10920 | -21846 | +| 24 | 21845 | 1 | 10920 | 21845 | +| 24+ | -21846 | 1 | 10921 | 21845 | +| 25 | -21846 | 1 | 10921 | -21846 | +| 25+ | -21846 | 0 | 10920 | 21845 | +| 26 | -21846 | 0 | 10920 | 21845 | +| 26 | -21846 | 0 | 10921 | -21846 | +| 26 | -21846 | 0 | 10922 | 21845 | +| 26 | -21846 | 0 | 10923 | 21845 | +| 26 | -21846 | 0 | 10924 | 21845 | +| 26 | -21846 | 0 | 10925 | 21845 | +| 26 | -21846 | 0 | 10926 | 21845 | +| 26 | -21846 | 0 | 10927 | 21845 | +| 26+ | 21845 | 1 | 10921 | -21846 | +| 27 | 21845 | 1 | 10921 | 21845 | +| 27+ | -21846 | 1 | 10922 | 21845 | +| 28 | -21846 | 1 | 10922 | -21846 | +| 28+ | -21846 | 0 | 10920 | 21845 | +| 29 | -21846 | 0 | 10920 | 21845 | +| 29 | -21846 | 0 | 10921 | 21845 | +| 29 | -21846 | 0 | 10922 | -21846 | +| 29 | -21846 | 0 | 10923 | 21845 | +| 29 | -21846 | 0 | 10924 | 21845 | +| 29 | -21846 | 0 | 10925 | 21845 | +| 29 | -21846 | 0 | 10926 | 21845 | +| 29 | -21846 | 0 | 10927 | 21845 | +| 29+ | 21845 | 1 | 10922 | -21846 | +| 30 | 21845 | 1 | 10922 | 21845 | +| 30+ | -21846 | 1 | 10923 | 21845 | +| 31 | -21846 | 1 | 10923 | -21846 | +| 31+ | -21846 | 0 | 10920 | 21845 | +| 32 | -21846 | 0 | 10920 | 21845 | +| 32 | -21846 | 0 | 10921 | 21845 | +| 32 | -21846 | 0 | 10922 | 21845 | +| 32 | -21846 | 0 | 10923 | -21846 | +| 32 | -21846 | 0 | 10924 | 21845 | +| 32 | -21846 | 0 | 10925 | 21845 | +| 32 | -21846 | 0 | 10926 | 21845 | +| 32 | -21846 | 0 | 10927 | 21845 | +| 32+ | 21845 | 1 | 10923 | -21846 | +| 33 | 21845 | 1 | 10923 | 21845 | +| 33+ | -21846 | 1 | 10924 | 21845 | +| 34 | -21846 | 1 | 10924 | -21846 | +| 34+ | -21846 | 0 | 10920 | 21845 | +| 35 | -21846 | 0 | 10920 | 21845 | +| 35 | -21846 | 0 | 10921 | 21845 | +| 35 | -21846 | 0 | 10922 | 21845 | +| 35 | -21846 | 0 | 10923 | 21845 | +| 35 | -21846 | 0 | 10924 | -21846 | +| 35 | -21846 | 0 | 10925 | 21845 | +| 35 | -21846 | 0 | 10926 | 21845 | +| 35 | -21846 | 0 | 10927 | 21845 | +| 35+ | 21845 | 1 | 10924 | -21846 | +| 36 | 21845 | 1 | 10924 | 21845 | +| 36+ | -21846 | 1 | 10925 | 21845 | +| 37 | -21846 | 1 | 10925 | -21846 | +| 37+ | -21846 | 0 | 10920 | 21845 | +| 38 | -21846 | 0 | 10920 | 21845 | +| 38 | -21846 | 0 | 10921 | 21845 | +| 38 | -21846 | 0 | 10922 | 21845 | +| 38 | -21846 | 0 | 10923 | 21845 | +| 38 | -21846 | 0 | 10924 | 21845 | +| 38 | -21846 | 0 | 10925 | -21846 | +| 38 | -21846 | 0 | 10926 | 21845 | +| 38 | -21846 | 0 | 10927 | 21845 | +| 38+ | 21845 | 1 | 10925 | -21846 | +| 39 | 21845 | 1 | 10925 | 21845 | +| 39+ | -21846 | 1 | 10926 | 21845 | +| 40 | -21846 | 1 | 10926 | -21846 | +| 40+ | -21846 | 0 | 10920 | 21845 | +| 41 | -21846 | 0 | 10920 | 21845 | +| 41 | -21846 | 0 | 10921 | 21845 | +| 41 | -21846 | 0 | 10922 | 21845 | +| 41 | -21846 | 0 | 10923 | 21845 | +| 41 | -21846 | 0 | 10924 | 21845 | +| 41 | -21846 | 0 | 10925 | 21845 | +| 41 | -21846 | 0 | 10926 | -21846 | +| 41 | -21846 | 0 | 10927 | 21845 | +| 41+ | 21845 | 1 | 10926 | -21846 | +| 42 | 21845 | 1 | 10926 | 21845 | +| 42+ | -21846 | 1 | 10927 | 21845 | +| 43 | -21846 | 1 | 10927 | -21846 | +| 43+ | -21846 | 0 | 10920 | 21845 | +| 44 | -21846 | 0 | 10920 | 21845 | +| 44 | -21846 | 0 | 10921 | 21845 | +| 44 | -21846 | 0 | 10922 | 21845 | +| 44 | -21846 | 0 | 10923 | 21845 | +| 44 | -21846 | 0 | 10924 | 21845 | +| 44 | -21846 | 0 | 10925 | 21845 | +| 44 | -21846 | 0 | 10926 | 21845 | +| 44 | -21846 | 0 | 10927 | -21846 | +| 44+ | 21845 | 1 | 10927 | -21846 | +| 45 | 21845 | 1 | 10927 | 21845 | +| 45+ | 21845 | 0 | 10920 | 21845 | +| 46 | 21845 | 0 | 10920 | 21845 | +| 46 | 21845 | 0 | 10921 | 21845 | +| 46 | 21845 | 0 | 10922 | 21845 | +| 46 | 21845 | 0 | 10923 | 21845 | +| 46 | 21845 | 0 | 10924 | 21845 | +| 46 | 21845 | 0 | 10925 | 21845 | +| 46 | 21845 | 0 | 10926 | 21845 | +| 46 | 21845 | 0 | 10927 | 21845 | +| 46+ | 21845 | 0 | 1365 | 0 | +| 47 | 21845 | 0 | 1365 | 0 | +| 47 | 21845 | 0 | 3413 | 0 | +| 47 | 21845 | 0 | 5461 | 0 | +| 47 | 21845 | 0 | 7509 | 0 | +| 47 | 21845 | 0 | 9557 | 0 | +| 47 | 21845 | 0 | 11605 | 0 | +| 47 | 21845 | 0 | 13653 | 0 | +| 47 | 21845 | 0 | 15701 | 0 | +| 47+ | 21845 | 1 | 1365 | 0 | +| 48 | 21845 | 1 | 1365 | 21845 | +| 48+ | 21845 | 1 | 3413 | 0 | +| 49 | 21845 | 1 | 3413 | 21845 | +| 49+ | 21845 | 1 | 5461 | 0 | +| 50 | 21845 | 1 | 5461 | 21845 | +| 50+ | 21845 | 1 | 7509 | 0 | +| 51 | 21845 | 1 | 7509 | 21845 | +| 51+ | 21845 | 1 | 9557 | 0 | +| 52 | 21845 | 1 | 9557 | 21845 | +| 52+ | 21845 | 1 | 11605 | 0 | +| 53 | 21845 | 1 | 11605 | 21845 | +| 53+ | 21845 | 1 | 13653 | 0 | +| 54 | 21845 | 1 | 13653 | 21845 | +| 54+ | 21845 | 1 | 15701 | 0 | +| 55 | 21845 | 1 | 15701 | 21845 | +| 55+ | 21845 | 0 | 1365 | 21845 | +| 56 | 21845 | 0 | 1365 | 21845 | +| 56 | 21845 | 0 | 3413 | 21845 | +| 56 | 21845 | 0 | 5461 | 21845 | +| 56 | 21845 | 0 | 7509 | 21845 | +| 56 | 21845 | 0 | 9557 | 21845 | +| 56 | 21845 | 0 | 11605 | 21845 | +| 56 | 21845 | 0 | 13653 | 21845 | +| 56 | 21845 | 0 | 15701 | 21845 | +| 56+ | -21846 | 1 | 1365 | 21845 | +| 57 | -21846 | 1 | 1365 | -21846 | +| 57+ | -21846 | 0 | 1365 | -21846 | +| 58 | -21846 | 0 | 1365 | -21846 | +| 58 | -21846 | 0 | 3413 | 21845 | +| 58 | -21846 | 0 | 5461 | 21845 | +| 58 | -21846 | 0 | 7509 | 21845 | +| 58 | -21846 | 0 | 9557 | 21845 | +| 58 | -21846 | 0 | 11605 | 21845 | +| 58 | -21846 | 0 | 13653 | 21845 | +| 58 | -21846 | 0 | 15701 | 21845 | +| 58+ | 21845 | 1 | 1365 | -21846 | +| 59 | 21845 | 1 | 1365 | 21845 | +| 59+ | -21846 | 1 | 3413 | 21845 | +| 60 | -21846 | 1 | 3413 | -21846 | +| 60+ | -21846 | 0 | 1365 | 21845 | +| 61 | -21846 | 0 | 1365 | 21845 | +| 61 | -21846 | 0 | 3413 | -21846 | +| 61 | -21846 | 0 | 5461 | 21845 | +| 61 | -21846 | 0 | 7509 | 21845 | +| 61 | -21846 | 0 | 9557 | 21845 | +| 61 | -21846 | 0 | 11605 | 21845 | +| 61 | -21846 | 0 | 13653 | 21845 | +| 61 | -21846 | 0 | 15701 | 21845 | +| 61+ | 21845 | 1 | 3413 | -21846 | +| 62 | 21845 | 1 | 3413 | 21845 | +| 62+ | -21846 | 1 | 5461 | 21845 | +| 63 | -21846 | 1 | 5461 | -21846 | +| 63+ | -21846 | 0 | 1365 | 21845 | +| 64 | -21846 | 0 | 1365 | 21845 | +| 64 | -21846 | 0 | 3413 | 21845 | +| 64 | -21846 | 0 | 5461 | -21846 | +| 64 | -21846 | 0 | 7509 | 21845 | +| 64 | -21846 | 0 | 9557 | 21845 | +| 64 | -21846 | 0 | 11605 | 21845 | +| 64 | -21846 | 0 | 13653 | 21845 | +| 64 | -21846 | 0 | 15701 | 21845 | +| 64+ | 21845 | 1 | 5461 | -21846 | +| 65 | 21845 | 1 | 5461 | 21845 | +| 65+ | -21846 | 1 | 7509 | 21845 | +| 66 | -21846 | 1 | 7509 | -21846 | +| 66+ | -21846 | 0 | 1365 | 21845 | +| 67 | -21846 | 0 | 1365 | 21845 | +| 67 | -21846 | 0 | 3413 | 21845 | +| 67 | -21846 | 0 | 5461 | 21845 | +| 67 | -21846 | 0 | 7509 | -21846 | +| 67 | -21846 | 0 | 9557 | 21845 | +| 67 | -21846 | 0 | 11605 | 21845 | +| 67 | -21846 | 0 | 13653 | 21845 | +| 67 | -21846 | 0 | 15701 | 21845 | +| 67+ | 21845 | 1 | 7509 | -21846 | +| 68 | 21845 | 1 | 7509 | 21845 | +| 68+ | -21846 | 1 | 9557 | 21845 | +| 69 | -21846 | 1 | 9557 | -21846 | +| 69+ | -21846 | 0 | 1365 | 21845 | +| 70 | -21846 | 0 | 1365 | 21845 | +| 70 | -21846 | 0 | 3413 | 21845 | +| 70 | -21846 | 0 | 5461 | 21845 | +| 70 | -21846 | 0 | 7509 | 21845 | +| 70 | -21846 | 0 | 9557 | -21846 | +| 70 | -21846 | 0 | 11605 | 21845 | +| 70 | -21846 | 0 | 13653 | 21845 | +| 70 | -21846 | 0 | 15701 | 21845 | +| 70+ | 21845 | 1 | 9557 | -21846 | +| 71 | 21845 | 1 | 9557 | 21845 | +| 71+ | -21846 | 1 | 11605 | 21845 | +| 72 | -21846 | 1 | 11605 | -21846 | +| 72+ | -21846 | 0 | 1365 | 21845 | +| 73 | -21846 | 0 | 1365 | 21845 | +| 73 | -21846 | 0 | 3413 | 21845 | +| 73 | -21846 | 0 | 5461 | 21845 | +| 73 | -21846 | 0 | 7509 | 21845 | +| 73 | -21846 | 0 | 9557 | 21845 | +| 73 | -21846 | 0 | 11605 | -21846 | +| 73 | -21846 | 0 | 13653 | 21845 | +| 73 | -21846 | 0 | 15701 | 21845 | +| 73+ | 21845 | 1 | 11605 | -21846 | +| 74 | 21845 | 1 | 11605 | 21845 | +| 74+ | -21846 | 1 | 13653 | 21845 | +| 75 | -21846 | 1 | 13653 | -21846 | +| 75+ | -21846 | 0 | 1365 | 21845 | +| 76 | -21846 | 0 | 1365 | 21845 | +| 76 | -21846 | 0 | 3413 | 21845 | +| 76 | -21846 | 0 | 5461 | 21845 | +| 76 | -21846 | 0 | 7509 | 21845 | +| 76 | -21846 | 0 | 9557 | 21845 | +| 76 | -21846 | 0 | 11605 | 21845 | +| 76 | -21846 | 0 | 13653 | -21846 | +| 76 | -21846 | 0 | 15701 | 21845 | +| 76+ | 21845 | 1 | 13653 | -21846 | +| 77 | 21845 | 1 | 13653 | 21845 | +| 77+ | -21846 | 1 | 15701 | 21845 | +| 78 | -21846 | 1 | 15701 | -21846 | +| 78+ | -21846 | 0 | 1365 | 21845 | +| 79 | -21846 | 0 | 1365 | 21845 | +| 79 | -21846 | 0 | 3413 | 21845 | +| 79 | -21846 | 0 | 5461 | 21845 | +| 79 | -21846 | 0 | 7509 | 21845 | +| 79 | -21846 | 0 | 9557 | 21845 | +| 79 | -21846 | 0 | 11605 | 21845 | +| 79 | -21846 | 0 | 13653 | 21845 | +| 79 | -21846 | 0 | 15701 | -21846 | +| 79+ | 21845 | 1 | 15701 | -21846 | +| 80 | 21845 | 1 | 15701 | 21845 | +| 80+ | 21845 | 0 | 1365 | 21845 | +| 81 | 21845 | 0 | 1365 | 21845 | +| 81 | 21845 | 0 | 3413 | 21845 | +| 81 | 21845 | 0 | 5461 | 21845 | +| 81 | 21845 | 0 | 7509 | 21845 | +| 81 | 21845 | 0 | 9557 | 21845 | +| 81 | 21845 | 0 | 11605 | 21845 | +| 81 | 21845 | 0 | 13653 | 21845 | +| 81 | 21845 | 0 | 15701 | 21845 |`; diff --git a/web-ide-main/projects/src/project_03/index.ts b/web-ide-main/projects/src/project_03/index.ts new file mode 100644 index 0000000..b68b0e6 --- /dev/null +++ b/web-ide-main/projects/src/project_03/index.ts @@ -0,0 +1,56 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; + +import { resetBySuffix } from "../reset.js"; +import * as DFF from "./00_dff.js"; +import * as Bit from "./01_bit.js"; +import * as Register from "./02_register.js"; +import * as PC from "./03_pc.js"; +import * as RAM8 from "./04_ram8.js"; +import * as RAM64 from "./05_ram64.js"; +import * as RAM512 from "./06_ram512.js"; +import * as RAM4k from "./07_ram4k.js"; +import * as RAM16k from "./08_ram16k.js"; + +export const CHIPS = { + "Bit.hdl": Bit.hdl, + "Bit.tst": Bit.tst, + "Bit.cmp": Bit.cmp, + "Register.hdl": Register.hdl, + "Register.tst": Register.tst, + "Register.cmp": Register.cmp, + "PC.hdl": PC.hdl, + "PC.tst": PC.tst, + "PC.cmp": PC.cmp, + "RAM8.hdl": RAM8.hdl, + "RAM8.tst": RAM8.tst, + "RAM8.cmp": RAM8.cmp, + "RAM64.hdl": RAM64.hdl, + "RAM64.tst": RAM64.tst, + "RAM64.cmp": RAM64.cmp, + "RAM512.hdl": RAM512.hdl, + "RAM512.tst": RAM512.tst, + "RAM512.cmp": RAM512.cmp, + "RAM4K.hdl": RAM4k.hdl, + "RAM4K.tst": RAM4k.tst, + "RAM4K.cmp": RAM4k.cmp, + "RAM16K.hdl": RAM16k.hdl, + "RAM16K.tst": RAM16k.tst, + "RAM16K.cmp": RAM16k.cmp, +}; + +export const BUILTIN_CHIPS = { + DFF: DFF.hdl, +}; + +export async function resetFiles(fs: FileSystem): Promise { + await fs.pushd("/projects/03"); + await reset(fs, CHIPS); + await fs.popd(); +} + +export async function resetTests(fs: FileSystem): Promise { + await fs.pushd("/projects/03"); + await resetBySuffix(fs, CHIPS, ".tst"); + await resetBySuffix(fs, CHIPS, ".cmp"); + await fs.popd(); +} diff --git a/web-ide-main/projects/src/project_04/01_mult.ts b/web-ide-main/projects/src/project_04/01_mult.ts new file mode 100644 index 0000000..16d75b5 --- /dev/null +++ b/web-ide-main/projects/src/project_04/01_mult.ts @@ -0,0 +1,96 @@ +export const asm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/4/Mult.asm + +// Multiplies R0 and R1 and stores the result in R2. +// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.) +// The algorithm is based on repetitive addition. + +//// Replace this comment with your code.`; + +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/4/mult/Mult.tst + +// Tests the Mult program, designed to compute R2 = R0 * R1. +// Tests the program by having it multiply several sets of +// R0 and R1 values. + +load Mult.asm, +compare-to Mult.cmp, +output-list RAM[0]%D2.6.2 RAM[1]%D2.6.2 RAM[2]%D2.6.2; + +set RAM[0] 0, // Sets R0 and R1 to some input values +set RAM[1] 0, +set RAM[2] -1; // Ensures that the program initialized R2 to 0 +repeat 20 { + ticktock; +} +set RAM[0] 0, // Restores R0 and R1 in case the program changed them +set RAM[1] 0, +output; + +set PC 0, +set RAM[0] 1, // Sets R0 and R1 to some input values +set RAM[1] 0, +set RAM[2] -1; // Ensures that the program initialized R2 to 0 +repeat 50 { + ticktock; +} +set RAM[0] 1, // Restores R0 and R1 in case the program changed them +set RAM[1] 0, +output; + +set PC 0, +set RAM[0] 0, // Sets R0 and R1 to some input values +set RAM[1] 2, +set RAM[2] -1; // Ensures that the program initialized R2 to 0 +repeat 80 { + ticktock; +} +set RAM[0] 0, // Restores R0 and R1 in case the program changed them +set RAM[1] 2, +output; + +set PC 0, +set RAM[0] 3, // Sets R0 and R1 to some input values +set RAM[1] 1, +set RAM[2] -1; // Ensures that the program initialized R2 to 0 +repeat 120 { + ticktock; +} +set RAM[0] 3, // Restores R0 and R1 in case the program changed them +set RAM[1] 1, +output; + +set PC 0, +set RAM[0] 2, // Sets R0 and R1 to some input values +set RAM[1] 4, +set RAM[2] -1; // Ensures that the program initialized R2 to 0 +repeat 150 { + ticktock; +} +set RAM[0] 2, // Restores R0 and R1 in case the program changed them +set RAM[1] 4, +output; + +set PC 0, +set RAM[0] 6, // Sets R0 and R1 to some input values +set RAM[1] 7, +set RAM[2] -1; // Ensures that the program initialized R2 to 0 +repeat 210 { + ticktock; +} +set RAM[0] 6, // Restores R0 and R1 in case the program changed them +set RAM[1] 7, +output;`; + +export const cmp = `| RAM[0] | RAM[1] | RAM[2] | +| 0 | 0 | 0 | +| 1 | 0 | 0 | +| 0 | 2 | 0 | +| 3 | 1 | 3 | +| 2 | 4 | 8 | +| 6 | 7 | 42 |`; diff --git a/web-ide-main/projects/src/project_04/02_fill.ts b/web-ide-main/projects/src/project_04/02_fill.ts new file mode 100644 index 0000000..3377be4 --- /dev/null +++ b/web-ide-main/projects/src/project_04/02_fill.ts @@ -0,0 +1,66 @@ +export const asm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/4/Fill.asm + +// Runs an infinite loop that listens to the keyboard input. +// When a key is pressed (any key), the program blackens the screen, +// i.e. writes "black" in every pixel. When no key is pressed, +// the screen should be cleared. + +//// Replace this comment with your code.`; + +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/4/fill/Fill.tst + +// Tests the Fill.hack program in the CPU emulator. + +load Fill.asm; +echo "Select the highest speed and 'enable keyboard'. Then press any key for some time, and inspect the screen."; + +repeat { + ticktock; +}`; + +export const autoTst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/4/fill/FillAutomatic + +// This script can be used to test the Fill program automatically, +// rather than interactively. Specifically, the script sets the keyboard +// memory map (RAM[24576]) to 0, 1, and then again to 0. This simulates the +// acts of leaving the keyboard untouched, pressing some key, and then releasing +// the key. After each one of these simulated events, the script outputs the values +// of some selected registers from the screen memory map (RAM[16384]-RAM[24576]). +// This is done in order to test that these registers are set to 000...0 or 111....1, +// as mandated by how the Fill program should react to the keyboard events. + +load Fill.asm, +compare-to FillAutomatic.cmp, +output-list RAM[16384]%D2.6.2 RAM[17648]%D2.6.2 RAM[18349]%D2.6.2 RAM[19444]%D2.6.2 RAM[20771]%D2.6.2 RAM[21031]%D2.6.2 RAM[22596]%D2.6.2 RAM[23754]%D2.6.2 RAM[24575]%D2.6.2; + +set RAM[24576] 0, // the keyboard is untouched +repeat 1000000 { + ticktock; +} +output; // tests that the screen is white + +set RAM[24576] 1, // a keyboard key is pressed +repeat 1000000 { + ticktock; +} +output; // tests that the screen is black + +set RAM[24576] 0, // the keyboard is untouched +repeat 1000000 { + ticktock; +} +output; // tests that the screen is white`; + +export const autoCmp = `|RAM[16384]|RAM[17648]|RAM[18349]|RAM[19444]|RAM[20771]|RAM[21031]|RAM[22596]|RAM[23754]|RAM[24575]| +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |`; diff --git a/web-ide-main/projects/src/project_04/index.ts b/web-ide-main/projects/src/project_04/index.ts new file mode 100644 index 0000000..1e0b52c --- /dev/null +++ b/web-ide-main/projects/src/project_04/index.ts @@ -0,0 +1,31 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { resetBySuffix } from "../reset.js"; +import * as Mult from "./01_mult.js"; +import * as Fill from "./02_fill.js"; + +export const TESTS = { + Mult: { + "Mult.asm": Mult.asm, + "Mult.tst": Mult.tst, + "Mult.cmp": Mult.cmp, + }, + Fill: { + "Fill.asm": Fill.asm, + "Fill.tst": Fill.tst, + "FillAutomatic.tst": Fill.autoTst, + "FillAutomatic.cmp": Fill.autoCmp, + }, +}; + +export async function resetFiles(fs: FileSystem): Promise { + await fs.pushd("/projects/04"); + await reset(fs, TESTS); + await fs.popd(); +} + +export async function resetTests(fs: FileSystem): Promise { + await fs.pushd("/projects/04"); + await resetBySuffix(fs, TESTS, ".tst"); + await resetBySuffix(fs, TESTS, ".cmp"); + await fs.popd(); +} diff --git a/web-ide-main/projects/src/project_05/01_memory.ts b/web-ide-main/projects/src/project_05/01_memory.ts new file mode 100644 index 0000000..b38aa01 --- /dev/null +++ b/web-ide-main/projects/src/project_05/01_memory.ts @@ -0,0 +1,287 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/5/Memory.hdl +/** + * The complete address space of the Hack computer's memory, + * including RAM and memory-mapped I/O. + * The chip facilitates read and write operations, as follows: + * Read: out(t) = Memory[address(t)](t) + * Write: if load(t-1) then Memory[address(t-1)](t) = in(t-1) + * In words: the chip always outputs the value stored at the memory + * location specified by address. If load=1, the in value is loaded + * into the memory location specified by address. This value becomes + * available through the out output from the next time step onward. + * Address space rules: + * Only the upper 16K+8K+1 words of the Memory chip are used. + * Access to address>0x6000 is invalid and reads 0. Access to any address + * in the range 0x4000-0x5FFF results in accessing the screen memory + * map. Access to address 0x6000 results in accessing the keyboard + * memory map. The behavior in these addresses is described in the Screen + * and Keyboard chip specifications given in the lectures and the book. + */ +CHIP Memory { + IN in[16], load, address[15]; + OUT out[16]; + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/05/Memory.tst + +// Tests the Memory chip by inputting values to selected addresses, +// verifying that these addresses were indeed written to, and verifying +// that other addresses were not accessed by mistake. In particular, we +// focus on probing the registers in addresses 'lower RAM', 'upper RAM', +// and 'Screen', which correspond to 0, %X2000, and %X4000 in Hexadecimal +// (0, 8192 (8K), and 16385 (16K+1) in decimal). + +load Memory.hdl, +compare-to Memory.cmp, +output-list in%D1.6.1 load%B2.1.2 address%B1.15.1 out%D1.6.1; + +echo "Before you run this script, select the 'Screen' option from the 'View' menu"; + +// We've noticed a common design mistake in several students' Memory.hdl files. +// This error leads to zeros being written in the offset of inactive memory segments +// instead of the intended location. To identify this issue, the test should check not +// only for incorrect writes into the wrong segment but also for any unexpected changes. +// To prepare for this, we've initialized the memory with a specific number in the areas +// where these erroneous writes might happen. + +//// Sets RAM[2000], RAM[4000] = 12345 (for the following overwrite test) +set in 12345, set load 1, set address %X2000, tick, output; tock, output; +set address %X4000, tick, output; tock, output; + +set in -1, // Sets RAM[0] = -1 +set load 1, +set address 0, +tick, +output; +tock, +output; + +set in 9999, // RAM[0] holds value +set load 0, +tick, +output; +tock, +output; + +set address %X2000, // Did not also write to upper RAM or Screen +eval, +output; +set address %X4000, +eval, +output; + +//// Sets RAM[0], RAM[4000] = 12345 (for following overwrite test) +set in 12345, set load 1, set address %X0000, tick, output; tock, output; +set address %X4000, tick, output; tock, output; + +set in 2222, // Sets RAM[2000] = 2222 +set load 1, +set address %X2000, +tick, +output; +tock, +output; + +set in 9999, // RAM[2000] holds value +set load 0, +tick, +output; +tock, +output; + +set address 0, // Did not also write to lower RAM or Screen +eval, +output; +set address %X4000, +eval, +output; + +set load 0, // Low order address bits connected +set address %X0001, eval, output; +set address %X0002, eval, output; +set address %X0004, eval, output; +set address %X0008, eval, output; +set address %X0010, eval, output; +set address %X0020, eval, output; +set address %X0040, eval, output; +set address %X0080, eval, output; +set address %X0100, eval, output; +set address %X0200, eval, output; +set address %X0400, eval, output; +set address %X0800, eval, output; +set address %X1000, eval, output; +set address %X2000, eval, output; + +set address %X1234, // RAM[1234] = 1234 +set in 1234, +set load 1, +tick, +output; +tock, +output; + +set load 0, +set address %X2234, // Did not also write to upper RAM or Screen +eval, output; +set address %X6234, +eval, output; + +set address %X2345, // RAM[2345] = 2345 +set in 2345, +set load 1, +tick, +output; +tock, +output; + +set load 0, +set address %X0345, // Did not also write to lower RAM or Screen +eval, output; +set address %X4345, +eval, output; + +//// Clears the overwrite detection value from the screen +set in 0, set load 1, set address %X4000, tick, output; tock, output; + +// Keyboard test + +set address 24576, +echo "Click the Keyboard icon and hold down the 'K' key (uppercase) until you see the next message...", +// It's important to keep holding the key down since if the system is busy, +// the memory will zero itself before being outputted. + +while out <> 75 { + tick, tock; // tick, tock prevents hang if sync. parts used in KB path. +} + +clear-echo, +output; + +// Screen test + +//// Sets RAM[0FCF], RAM[2FCF] = 12345 (for following overwrite test) +set in 12345, set load 1, set address %X0FCF, tick, output; tock, output; +set address %X2FCF, tick, output; tock, output; + +set load 1, +set in -1, +set address %X4FCF, +tick, +tock, +output, + +set address %X504F, +tick, +tock, +output; + +set address %X0FCF, // Did not also write to lower or upper RAM +eval, +output; +set address %X2FCF, +eval, +output; + +set load 0, // Low order address bits connected +set address %X4FCE, eval, output; +set address %X4FCD, eval, output; +set address %X4FCB, eval, output; +set address %X4FC7, eval, output; +set address %X4FDF, eval, output; +set address %X4FEF, eval, output; +set address %X4F8F, eval, output; +set address %X4F4F, eval, output; +set address %X4ECF, eval, output; +set address %X4DCF, eval, output; +set address %X4BCF, eval, output; +set address %X47CF, eval, output; +set address %X5FCF, eval, output; + +set load 0, +set address 24576, +echo "Two horizontal lines should be in the middle of the screen. Hold down 'Y' (uppercase) until you see the next message ...", +// It's important to keep holding the key down since if the system is busy, +// the memory will zero itself before being outputted. + +while out <> 89 { + tick, tock; // tick, tock prevents hang if sync. parts used in KB path. +} + +clear-echo, +output;`; +export const cmp = `| in |load | address | out | +| 12345 | 1 | 010000000000000 | 0 | +| 12345 | 1 | 010000000000000 | 12345 | +| 12345 | 1 | 100000000000000 | 0 | +| 12345 | 1 | 100000000000000 | 12345 | +| -1 | 1 | 000000000000000 | 0 | +| -1 | 1 | 000000000000000 | -1 | +| 9999 | 0 | 000000000000000 | -1 | +| 9999 | 0 | 000000000000000 | -1 | +| 9999 | 0 | 010000000000000 | 12345 | +| 9999 | 0 | 100000000000000 | 12345 | +| 12345 | 1 | 000000000000000 | -1 | +| 12345 | 1 | 000000000000000 | 12345 | +| 12345 | 1 | 100000000000000 | 12345 | +| 12345 | 1 | 100000000000000 | 12345 | +| 2222 | 1 | 010000000000000 | 12345 | +| 2222 | 1 | 010000000000000 | 2222 | +| 9999 | 0 | 010000000000000 | 2222 | +| 9999 | 0 | 010000000000000 | 2222 | +| 9999 | 0 | 000000000000000 | 12345 | +| 9999 | 0 | 100000000000000 | 12345 | +| 9999 | 0 | 000000000000001 | 0 | +| 9999 | 0 | 000000000000010 | 0 | +| 9999 | 0 | 000000000000100 | 0 | +| 9999 | 0 | 000000000001000 | 0 | +| 9999 | 0 | 000000000010000 | 0 | +| 9999 | 0 | 000000000100000 | 0 | +| 9999 | 0 | 000000001000000 | 0 | +| 9999 | 0 | 000000010000000 | 0 | +| 9999 | 0 | 000000100000000 | 0 | +| 9999 | 0 | 000001000000000 | 0 | +| 9999 | 0 | 000010000000000 | 0 | +| 9999 | 0 | 000100000000000 | 0 | +| 9999 | 0 | 001000000000000 | 0 | +| 9999 | 0 | 010000000000000 | 2222 | +| 1234 | 1 | 001001000110100 | 0 | +| 1234 | 1 | 001001000110100 | 1234 | +| 1234 | 0 | 010001000110100 | 0 | +| 1234 | 0 | 110001000110100 | 0 | +| 2345 | 1 | 010001101000101 | 0 | +| 2345 | 1 | 010001101000101 | 2345 | +| 2345 | 0 | 000001101000101 | 0 | +| 2345 | 0 | 100001101000101 | 0 | +| 0 | 1 | 100000000000000 | 12345 | +| 0 | 1 | 100000000000000 | 0 | +| 0 | 1 | 110000000000000 | 75 | +| 12345 | 1 | 000111111001111 | 0 | +| 12345 | 1 | 000111111001111 | 12345 | +| 12345 | 1 | 010111111001111 | 0 | +| 12345 | 1 | 010111111001111 | 12345 | +| -1 | 1 | 100111111001111 | -1 | +| -1 | 1 | 101000001001111 | -1 | +| -1 | 1 | 000111111001111 | 12345 | +| -1 | 1 | 010111111001111 | 12345 | +| -1 | 0 | 100111111001110 | 0 | +| -1 | 0 | 100111111001101 | 0 | +| -1 | 0 | 100111111001011 | 0 | +| -1 | 0 | 100111111000111 | 0 | +| -1 | 0 | 100111111011111 | 0 | +| -1 | 0 | 100111111101111 | 0 | +| -1 | 0 | 100111110001111 | 0 | +| -1 | 0 | 100111101001111 | 0 | +| -1 | 0 | 100111011001111 | 0 | +| -1 | 0 | 100110111001111 | 0 | +| -1 | 0 | 100101111001111 | 0 | +| -1 | 0 | 100011111001111 | 0 | +| -1 | 0 | 101111111001111 | 0 | +| -1 | 0 | 110000000000000 | 89 |`; diff --git a/web-ide-main/projects/src/project_05/02_cpu.ts b/web-ide-main/projects/src/project_05/02_cpu.ts new file mode 100644 index 0000000..03ecb55 --- /dev/null +++ b/web-ide-main/projects/src/project_05/02_cpu.ts @@ -0,0 +1,522 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/5/CPU.hdl +/** + * The Hack Central Processing unit (CPU). + * Parses the binary code in the instruction input and executes it according to the + * Hack machine language specification. In the case of a C-instruction, computes the + * function specified by the instruction. If the instruction specifies to read a memory + * value, the inM input is expected to contain this value. If the instruction specifies + * to write a value to the memory, sets the outM output to this value, sets the addressM + * output to the target address, and asserts the writeM output (when writeM = 0, any + * value may appear in outM). + * If the reset input is 0, computes the address of the next instruction and sets the + * pc output to that value. If the reset input is 1, sets pc to 0. + * Note: The outM and writeM outputs are combinational: they are affected by the + * instruction's execution during the current cycle. The addressM and pc outputs are + * clocked: although they are affected by the instruction's execution, they commit to + * their new values only in the next cycle. + */ +CHIP CPU { + + IN inM[16], // M value input (M = contents of RAM[A]) + instruction[16], // Instruction for execution + reset; // Signals whether to re-start the current + // program (reset==1) or continue executing + // the current program (reset==0). + + OUT outM[16], // M value output + writeM, // Write to M? + addressM[15], // Address in data memory (of M) + pc[15]; // address of next instruction + + PARTS: + //// Replace this comment with your code. +}`; +export const tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/5/CPU.tst + +load CPU.hdl, +compare-to CPU.cmp, +output-list time%S0.4.0 inM%D0.6.0 instruction%B0.16.0 reset%B2.1.2 outM%D1.6.0 writeM%B3.1.3 addressM%D0.5.0 pc%D0.5.0 DRegister[]%D1.6.1; + + +set instruction %B0011000000111001, // @12345 +tick, output, tock, output; + +set instruction %B1110110000010000, // D=A +tick, output, tock, output; + +set instruction %B0101101110100000, // @23456 +tick, output, tock, output; + +set instruction %B1110000111010000, // D=A-D +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1110001100001000, // M=D +tick, output, tock, output; + +set instruction %B0000001111101001, // @1001 +tick, output, tock, output; + +set instruction %B1110001110011000, // MD=D-1 +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1111010011010000, // D=D-M +set inM 11111, +tick, output, tock, output; + +set instruction %B0000000000001110, // @14 +tick, output, tock, output; + +set instruction %B1110001100000100, // D;jlt +tick, output, tock, output; + +set instruction %B0000001111100111, // @999 +tick, output, tock, output; + +set instruction %B1110110111100000, // A=A+1 +tick, output, tock, output; + +set instruction %B1110001100001000, // M=D +tick, output, tock, output; + +set instruction %B0000000000010101, // @21 +tick, output, tock, output; + +set instruction %B1110011111000010, // D+1;jeq +tick, output, tock, output; + +set instruction %B0000000000000010, // @2 +tick, output, tock, output; + +set instruction %B1110000010010000, // D=D+A +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1110111010010000, // D=-1 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set instruction %B1110101010010000, // D=0 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set instruction %B1110111111010000, // D=1 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set reset 1; +tick, output, tock, output; + +set instruction %B0111111111111111, // @32767 +set reset 0; +tick, output, tock, output;`; +export const cmp = `|time| inM | instruction |reset| outM |writeM |addre| pc |DRegiste| +|0+ | 0|0011000000111001| 0 |*******| 0 | 0| 0| 0 | +|1 | 0|0011000000111001| 0 |*******| 0 |12345| 1| 0 | +|1+ | 0|1110110000010000| 0 |*******| 0 |12345| 1| 12345 | +|2 | 0|1110110000010000| 0 |*******| 0 |12345| 2| 12345 | +|2+ | 0|0101101110100000| 0 |*******| 0 |12345| 2| 12345 | +|3 | 0|0101101110100000| 0 |*******| 0 |23456| 3| 12345 | +|3+ | 0|1110000111010000| 0 |*******| 0 |23456| 3| 11111 | +|4 | 0|1110000111010000| 0 |*******| 0 |23456| 4| 11111 | +|4+ | 0|0000001111101000| 0 |*******| 0 |23456| 4| 11111 | +|5 | 0|0000001111101000| 0 |*******| 0 | 1000| 5| 11111 | +|5+ | 0|1110001100001000| 0 | 11111| 1 | 1000| 5| 11111 | +|6 | 0|1110001100001000| 0 | 11111| 1 | 1000| 6| 11111 | +|6+ | 0|0000001111101001| 0 |*******| 0 | 1000| 6| 11111 | +|7 | 0|0000001111101001| 0 |*******| 0 | 1001| 7| 11111 | +|7+ | 0|1110001110011000| 0 | 11110| 1 | 1001| 7| 11110 | +|8 | 0|1110001110011000| 0 | 11109| 1 | 1001| 8| 11110 | +|8+ | 0|0000001111101000| 0 |*******| 0 | 1001| 8| 11110 | +|9 | 0|0000001111101000| 0 |*******| 0 | 1000| 9| 11110 | +|9+ | 11111|1111010011010000| 0 |*******| 0 | 1000| 9| -1 | +|10 | 11111|1111010011010000| 0 |*******| 0 | 1000| 10| -1 | +|10+ | 11111|0000000000001110| 0 |*******| 0 | 1000| 10| -1 | +|11 | 11111|0000000000001110| 0 |*******| 0 | 14| 11| -1 | +|11+ | 11111|1110001100000100| 0 |*******| 0 | 14| 11| -1 | +|12 | 11111|1110001100000100| 0 |*******| 0 | 14| 14| -1 | +|12+ | 11111|0000001111100111| 0 |*******| 0 | 14| 14| -1 | +|13 | 11111|0000001111100111| 0 |*******| 0 | 999| 15| -1 | +|13+ | 11111|1110110111100000| 0 |*******| 0 | 999| 15| -1 | +|14 | 11111|1110110111100000| 0 |*******| 0 | 1000| 16| -1 | +|14+ | 11111|1110001100001000| 0 | -1| 1 | 1000| 16| -1 | +|15 | 11111|1110001100001000| 0 | -1| 1 | 1000| 17| -1 | +|15+ | 11111|0000000000010101| 0 |*******| 0 | 1000| 17| -1 | +|16 | 11111|0000000000010101| 0 |*******| 0 | 21| 18| -1 | +|16+ | 11111|1110011111000010| 0 |*******| 0 | 21| 18| -1 | +|17 | 11111|1110011111000010| 0 |*******| 0 | 21| 21| -1 | +|17+ | 11111|0000000000000010| 0 |*******| 0 | 21| 21| -1 | +|18 | 11111|0000000000000010| 0 |*******| 0 | 2| 22| -1 | +|18+ | 11111|1110000010010000| 0 |*******| 0 | 2| 22| 1 | +|19 | 11111|1110000010010000| 0 |*******| 0 | 2| 23| 1 | +|19+ | 11111|0000001111101000| 0 |*******| 0 | 2| 23| 1 | +|20 | 11111|0000001111101000| 0 |*******| 0 | 1000| 24| 1 | +|20+ | 11111|1110111010010000| 0 |*******| 0 | 1000| 24| -1 | +|21 | 11111|1110111010010000| 0 |*******| 0 | 1000| 25| -1 | +|21+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 25| -1 | +|22 | 11111|1110001100000001| 0 |*******| 0 | 1000| 26| -1 | +|22+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 26| -1 | +|23 | 11111|1110001100000010| 0 |*******| 0 | 1000| 27| -1 | +|23+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 27| -1 | +|24 | 11111|1110001100000011| 0 |*******| 0 | 1000| 28| -1 | +|24+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 28| -1 | +|25 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| -1 | +|25+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| -1 | +|26 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| -1 | +|26+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| -1 | +|27 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| -1 | +|27+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| -1 | +|28 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| -1 | +|28+ | 11111|1110101010010000| 0 |*******| 0 | 1000| 1000| 0 | +|29 | 11111|1110101010010000| 0 |*******| 0 | 1000| 1001| 0 | +|29+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| 0 | +|30 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1002| 0 | +|30+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1002| 0 | +|31 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| 0 | +|31+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 0 | +|32 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 0 | +|32+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| 0 | +|33 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| 0 | +|33+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| 0 | +|34 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1002| 0 | +|34+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1002| 0 | +|35 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| 0 | +|35+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 0 | +|36 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 0 | +|36+ | 11111|1110111111010000| 0 |*******| 0 | 1000| 1000| 1 | +|37 | 11111|1110111111010000| 0 |*******| 0 | 1000| 1001| 1 | +|37+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| 1 | +|38 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1000| 1 | +|38+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| 1 | +|39 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1001| 1 | +|39+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1001| 1 | +|40 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 1 | +|40+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| 1 | +|41 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| 1 | +|41+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| 1 | +|42 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| 1 | +|42+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| 1 | +|43 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1001| 1 | +|43+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1001| 1 | +|44 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 1 | +|44+ | 11111|1110001100000111| 1 |*******| 0 | 1000| 1000| 1 | +|45 | 11111|1110001100000111| 1 |*******| 0 | 1000| 0| 1 | +|45+ | 11111|0111111111111111| 0 |*******| 0 | 1000| 0| 1 | +|46 | 11111|0111111111111111| 0 |*******| 0 |32767| 1| 1 |`; + +export const external_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/5/CPU-external.tst + +load CPU.hdl, +output-list time%S0.4.0 inM%D0.6.0 instruction%B0.16.0 reset%B2.1.2 outM%D1.6.0 writeM%B3.1.3 addressM%D0.5.0 pc%D0.5.0; + + +set instruction %B0011000000111001, // @12345 +tick, output, tock, output; + +set instruction %B1110110000010000, // D=A +tick, output, tock, output; + +set instruction %B0101101110100000, // @23456 +tick, output, tock, output; + +set instruction %B1110000111010000, // D=A-D +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1110001100001000, // M=D +tick, output, tock, output; + +set instruction %B0000001111101001, // @1001 +tick, output, tock, output; + +set instruction %B1110001110011000, // MD=D-1 +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1111010011010000, // D=D-M +set inM 11111, +tick, output, tock, output; + +set instruction %B0000000000001110, // @14 +tick, output, tock, output; + +set instruction %B1110001100000100, // D;jlt +tick, output, tock, output; + +set instruction %B0000001111100111, // @999 +tick, output, tock, output; + +set instruction %B1110110111100000, // A=A+1 +tick, output, tock, output; + +set instruction %B1110001100001000, // M=D +tick, output, tock, output; + +set instruction %B0000000000010101, // @21 +tick, output, tock, output; + +set instruction %B1110011111000010, // D+1;jeq +tick, output, tock, output; + +set instruction %B0000000000000010, // @2 +tick, output, tock, output; + +set instruction %B1110000010010000, // D=D+A +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1110111010010000, // D=-1 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set instruction %B1110101010010000, // D=0 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set instruction %B1110111111010000, // D=1 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set reset 1; +tick, output, tock, output; + +set instruction %B0111111111111111, // @32767 +set reset 0; +tick, output, tock, output;`; + +export const external_cmp = `|time| inM | instruction |reset| outM |writeM |addre| pc | +|0+ | 0|0011000000111001| 0 |*******| 0 | 0| 0| +|1 | 0|0011000000111001| 0 |*******| 0 |12345| 1| +|1+ | 0|1110110000010000| 0 |*******| 0 |12345| 1| +|2 | 0|1110110000010000| 0 |*******| 0 |12345| 2| +|2+ | 0|0101101110100000| 0 |*******| 0 |12345| 2| +|3 | 0|0101101110100000| 0 |*******| 0 |23456| 3| +|3+ | 0|1110000111010000| 0 |*******| 0 |23456| 3| +|4 | 0|1110000111010000| 0 |*******| 0 |23456| 4| +|4+ | 0|0000001111101000| 0 |*******| 0 |23456| 4| +|5 | 0|0000001111101000| 0 |*******| 0 | 1000| 5| +|5+ | 0|1110001100001000| 0 | 11111| 1 | 1000| 5| +|6 | 0|1110001100001000| 0 | 11111| 1 | 1000| 6| +|6+ | 0|0000001111101001| 0 |*******| 0 | 1000| 6| +|7 | 0|0000001111101001| 0 |*******| 0 | 1001| 7| +|7+ | 0|1110001110011000| 0 | 11110| 1 | 1001| 7| +|8 | 0|1110001110011000| 0 | 11109| 1 | 1001| 8| +|8+ | 0|0000001111101000| 0 |*******| 0 | 1001| 8| +|9 | 0|0000001111101000| 0 |*******| 0 | 1000| 9| +|9+ | 11111|1111010011010000| 0 |*******| 0 | 1000| 9| +|10 | 11111|1111010011010000| 0 |*******| 0 | 1000| 10| +|10+ | 11111|0000000000001110| 0 |*******| 0 | 1000| 10| +|11 | 11111|0000000000001110| 0 |*******| 0 | 14| 11| +|11+ | 11111|1110001100000100| 0 |*******| 0 | 14| 11| +|12 | 11111|1110001100000100| 0 |*******| 0 | 14| 14| +|12+ | 11111|0000001111100111| 0 |*******| 0 | 14| 14| +|13 | 11111|0000001111100111| 0 |*******| 0 | 999| 15| +|13+ | 11111|1110110111100000| 0 |*******| 0 | 999| 15| +|14 | 11111|1110110111100000| 0 |*******| 0 | 1000| 16| +|14+ | 11111|1110001100001000| 0 | -1| 1 | 1000| 16| +|15 | 11111|1110001100001000| 0 | -1| 1 | 1000| 17| +|15+ | 11111|0000000000010101| 0 |*******| 0 | 1000| 17| +|16 | 11111|0000000000010101| 0 |*******| 0 | 21| 18| +|16+ | 11111|1110011111000010| 0 |*******| 0 | 21| 18| +|17 | 11111|1110011111000010| 0 |*******| 0 | 21| 21| +|17+ | 11111|0000000000000010| 0 |*******| 0 | 21| 21| +|18 | 11111|0000000000000010| 0 |*******| 0 | 2| 22| +|18+ | 11111|1110000010010000| 0 |*******| 0 | 2| 22| +|19 | 11111|1110000010010000| 0 |*******| 0 | 2| 23| +|19+ | 11111|0000001111101000| 0 |*******| 0 | 2| 23| +|20 | 11111|0000001111101000| 0 |*******| 0 | 1000| 24| +|20+ | 11111|1110111010010000| 0 |*******| 0 | 1000| 24| +|21 | 11111|1110111010010000| 0 |*******| 0 | 1000| 25| +|21+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 25| +|22 | 11111|1110001100000001| 0 |*******| 0 | 1000| 26| +|22+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 26| +|23 | 11111|1110001100000010| 0 |*******| 0 | 1000| 27| +|23+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 27| +|24 | 11111|1110001100000011| 0 |*******| 0 | 1000| 28| +|24+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 28| +|25 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| +|25+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| +|26 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| +|26+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| +|27 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| +|27+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| +|28 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| +|28+ | 11111|1110101010010000| 0 |*******| 0 | 1000| 1000| +|29 | 11111|1110101010010000| 0 |*******| 0 | 1000| 1001| +|29+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| +|30 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1002| +|30+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1002| +|31 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| +|31+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| +|32 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| +|32+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| +|33 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| +|33+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| +|34 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1002| +|34+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1002| +|35 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| +|35+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| +|36 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| +|36+ | 11111|1110111111010000| 0 |*******| 0 | 1000| 1000| +|37 | 11111|1110111111010000| 0 |*******| 0 | 1000| 1001| +|37+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| +|38 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1000| +|38+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| +|39 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1001| +|39+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1001| +|40 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| +|40+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| +|41 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| +|41+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| +|42 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| +|42+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| +|43 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1001| +|43+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1001| +|44 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| +|44+ | 11111|1110001100000111| 1 |*******| 0 | 1000| 1000| +|45 | 11111|1110001100000111| 1 |*******| 0 | 1000| 0| +|45+ | 11111|0111111111111111| 0 |*******| 0 | 1000| 0| +|46 | 11111|0111111111111111| 0 |*******| 0 |32767| 1| +`; diff --git a/web-ide-main/projects/src/project_05/03_computer.ts b/web-ide-main/projects/src/project_05/03_computer.ts new file mode 100644 index 0000000..44fc0ea --- /dev/null +++ b/web-ide-main/projects/src/project_05/03_computer.ts @@ -0,0 +1,284 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/5/Computer.hdl +/** + * The Hack computer, consisting of CPU, ROM and RAM. + * When reset = 0, the program stored in the ROM executes. + * When reset = 1, the program's execution restarts. + * Thus, to start running the currently loaded program, + * set reset to 1, and then set it to 0. + * From this point onwards, the user is at the mercy of the software. + * Depending on the program's code, and whether the code is correct, + * the screen may show some output, the user may be expected to enter + * some input using the keyboard, or the program may do some procerssing. + */ +CHIP Computer { + + IN reset; + + PARTS: + //// Replace this comment with your code. +}`; +export const add_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/5/ComputerAdd.tst + +// Tests the Computer chip by having it execute the program Add.hack. +// The program adds up the constants 2 and 3 and writes the result in RAM[0]. + +// Tracks the values of the time, reset bit, A-register, D-register, +// program counter, R0, R1, and R2. + +load Computer.hdl, +compare-to ComputerAdd.cmp, +output-list time%S1.3.1 reset%B2.1.2 ARegister[0]%D1.7.1 DRegister[0]%D1.7.1 PC[]%D0.4.0 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1; + +// Loads the binary program Add.hack into the computer's instruction memory +ROM32K load Add.hack, +output; + +// First run (at the beginning PC=0) +repeat 6 { + tick, tock, output; +} + +// Resets the PC +set reset 1, +set RAM16K[0] 0, +tick, tock, output; + +// Second run, to check that the PC was reset correctly. +set reset 0, + +repeat 6 { + tick, tock, output; +}`; +export const add_cmp = `|time |reset|ARegister|DRegister|PC[]|RAM16K[0]|RAM16K[1]|RAM16K[2]| +| 0 | 0 | 0 | 0 | 0| 0 | 0 | 0 | +| 1 | 0 | 2 | 0 | 1| 0 | 0 | 0 | +| 2 | 0 | 2 | 2 | 2| 0 | 0 | 0 | +| 3 | 0 | 3 | 2 | 3| 0 | 0 | 0 | +| 4 | 0 | 3 | 5 | 4| 0 | 0 | 0 | +| 5 | 0 | 0 | 5 | 5| 0 | 0 | 0 | +| 6 | 0 | 0 | 5 | 6| 5 | 0 | 0 | +| 7 | 1 | 0 | 5 | 0| 0 | 0 | 0 | +| 8 | 0 | 2 | 5 | 1| 0 | 0 | 0 | +| 9 | 0 | 2 | 2 | 2| 0 | 0 | 0 | +| 10 | 0 | 3 | 2 | 3| 0 | 0 | 0 | +| 11 | 0 | 3 | 5 | 4| 0 | 0 | 0 | +| 12 | 0 | 0 | 5 | 5| 0 | 0 | 0 | +| 13 | 0 | 0 | 5 | 6| 5 | 0 | 0 |`; +export const max_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/5/ComputerMax.tst + +// Tests the Computer chip by having it execute the program Max.hack. +// The program computes maximum(R0, R1) and writes the result in RAM[2]. + +// Tracks the values of the time, reset bit, A-register, D-register, +// program counter, R0, R1, and R2. +load Computer.hdl, +compare-to ComputerMax.cmp, +output-list time%S1.3.1 reset%B2.1.2 ARegister[]%D1.7.1 DRegister[]%D1.7.1 PC[]%D0.4.0 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1; + +// Loads the binary program Add.hack into the computer's instruction memory +ROM32K load Max.hack, + +// first run: computes max(3,5) +set RAM16K[0] 3, +set RAM16K[1] 5, +output; + +repeat 14 { + tick, tock, output; +} + +// resets the PC +set reset 1, +tick, tock, output; + +// second run: computes max(23456,12345) +set reset 0, +set RAM16K[0] 23456, +set RAM16K[1] 12345, +output; + +// The run on these inputs requires less cycles (different branching) +repeat 10 { + tick, tock, output; +} +`; +export const max_cmp = `|time |reset|ARegister|DRegister|PC[]|RAM16K[0]|RAM16K[1]|RAM16K[2]| +| 0 | 0 | 0 | 0 | 0| 3 | 5 | 0 | +| 1 | 0 | 0 | 0 | 1| 3 | 5 | 0 | +| 2 | 0 | 0 | 3 | 2| 3 | 5 | 0 | +| 3 | 0 | 1 | 3 | 3| 3 | 5 | 0 | +| 4 | 0 | 1 | -2 | 4| 3 | 5 | 0 | +| 5 | 0 | 10 | -2 | 5| 3 | 5 | 0 | +| 6 | 0 | 10 | -2 | 6| 3 | 5 | 0 | +| 7 | 0 | 1 | -2 | 7| 3 | 5 | 0 | +| 8 | 0 | 1 | 5 | 8| 3 | 5 | 0 | +| 9 | 0 | 12 | 5 | 9| 3 | 5 | 0 | +| 10 | 0 | 12 | 5 | 12| 3 | 5 | 0 | +| 11 | 0 | 2 | 5 | 13| 3 | 5 | 0 | +| 12 | 0 | 2 | 5 | 14| 3 | 5 | 5 | +| 13 | 0 | 14 | 5 | 15| 3 | 5 | 5 | +| 14 | 0 | 14 | 5 | 14| 3 | 5 | 5 | +| 15 | 1 | 14 | 5 | 0| 3 | 5 | 5 | +| 15 | 0 | 14 | 5 | 0| 23456 | 12345 | 5 | +| 16 | 0 | 0 | 5 | 1| 23456 | 12345 | 5 | +| 17 | 0 | 0 | 23456 | 2| 23456 | 12345 | 5 | +| 18 | 0 | 1 | 23456 | 3| 23456 | 12345 | 5 | +| 19 | 0 | 1 | 11111 | 4| 23456 | 12345 | 5 | +| 20 | 0 | 10 | 11111 | 5| 23456 | 12345 | 5 | +| 21 | 0 | 10 | 11111 | 10| 23456 | 12345 | 5 | +| 22 | 0 | 0 | 11111 | 11| 23456 | 12345 | 5 | +| 23 | 0 | 0 | 23456 | 12| 23456 | 12345 | 5 | +| 24 | 0 | 2 | 23456 | 13| 23456 | 12345 | 5 | +| 25 | 0 | 2 | 23456 | 14| 23456 | 12345 | 23456 |`; +export const rect_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/5/ComputerRect.tst + +// Tests the Computer chip by having it execute the program Rect.hack. +// The program draws a rectangle of width 16 pixels and length RAM[0] +// at the top left corner of the screen. + +// Tracks the values of the time, A-register, D-register, program counter, R0, R1, and R2. +load Computer.hdl, +compare-to ComputerRect.cmp, +output-list time%S1.3.1 ARegister[]%D1.7.1 DRegister[]%D1.7.1 PC[]%D0.4.0 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1; + +// Loads the binary program Rect.hack into the computer's instruction memory +ROM32K load Rect.hack, + +echo "Before you run this script, select the 'Screen' option from the 'View' menu"; + +echo "A small rectangle should be drawn at the top left of the screen (the 'Screen' option of the 'View' menu should be selected.)"; + +// Draws a rectangle consisting of 4 rows (each 16 pixels wide) +set RAM16K[0] 4, +output; + +repeat 63 { + tick, tock, output; +}`; +export const rect_cmp = `|time |ARegister|DRegister|PC[]|RAM16K[0]|RAM16K[1]|RAM16K[2]| +| 0 | 0 | 0 | 0| 4 | 0 | 0 | +| 1 | 0 | 0 | 1| 4 | 0 | 0 | +| 2 | 0 | 4 | 2| 4 | 0 | 0 | +| 3 | 23 | 4 | 3| 4 | 0 | 0 | +| 4 | 23 | 4 | 4| 4 | 0 | 0 | +| 5 | 16 | 4 | 5| 4 | 0 | 0 | +| 6 | 16 | 4 | 6| 4 | 0 | 0 | +| 7 | 16384 | 4 | 7| 4 | 0 | 0 | +| 8 | 16384 | 16384 | 8| 4 | 0 | 0 | +| 9 | 17 | 16384 | 9| 4 | 0 | 0 | +| 10 | 17 | 16384 | 10| 4 | 0 | 0 | +| 11 | 17 | 16384 | 11| 4 | 0 | 0 | +| 12 | 16384 | 16384 | 12| 4 | 0 | 0 | +| 13 | 16384 | 16384 | 13| 4 | 0 | 0 | +| 14 | 17 | 16384 | 14| 4 | 0 | 0 | +| 15 | 17 | 16384 | 15| 4 | 0 | 0 | +| 16 | 32 | 16384 | 16| 4 | 0 | 0 | +| 17 | 32 | 16416 | 17| 4 | 0 | 0 | +| 18 | 17 | 16416 | 18| 4 | 0 | 0 | +| 19 | 17 | 16416 | 19| 4 | 0 | 0 | +| 20 | 16 | 16416 | 20| 4 | 0 | 0 | +| 21 | 16 | 3 | 21| 4 | 0 | 0 | +| 22 | 10 | 3 | 22| 4 | 0 | 0 | +| 23 | 10 | 3 | 10| 4 | 0 | 0 | +| 24 | 17 | 3 | 11| 4 | 0 | 0 | +| 25 | 16416 | 3 | 12| 4 | 0 | 0 | +| 26 | 16416 | 3 | 13| 4 | 0 | 0 | +| 27 | 17 | 3 | 14| 4 | 0 | 0 | +| 28 | 17 | 16416 | 15| 4 | 0 | 0 | +| 29 | 32 | 16416 | 16| 4 | 0 | 0 | +| 30 | 32 | 16448 | 17| 4 | 0 | 0 | +| 31 | 17 | 16448 | 18| 4 | 0 | 0 | +| 32 | 17 | 16448 | 19| 4 | 0 | 0 | +| 33 | 16 | 16448 | 20| 4 | 0 | 0 | +| 34 | 16 | 2 | 21| 4 | 0 | 0 | +| 35 | 10 | 2 | 22| 4 | 0 | 0 | +| 36 | 10 | 2 | 10| 4 | 0 | 0 | +| 37 | 17 | 2 | 11| 4 | 0 | 0 | +| 38 | 16448 | 2 | 12| 4 | 0 | 0 | +| 39 | 16448 | 2 | 13| 4 | 0 | 0 | +| 40 | 17 | 2 | 14| 4 | 0 | 0 | +| 41 | 17 | 16448 | 15| 4 | 0 | 0 | +| 42 | 32 | 16448 | 16| 4 | 0 | 0 | +| 43 | 32 | 16480 | 17| 4 | 0 | 0 | +| 44 | 17 | 16480 | 18| 4 | 0 | 0 | +| 45 | 17 | 16480 | 19| 4 | 0 | 0 | +| 46 | 16 | 16480 | 20| 4 | 0 | 0 | +| 47 | 16 | 1 | 21| 4 | 0 | 0 | +| 48 | 10 | 1 | 22| 4 | 0 | 0 | +| 49 | 10 | 1 | 10| 4 | 0 | 0 | +| 50 | 17 | 1 | 11| 4 | 0 | 0 | +| 51 | 16480 | 1 | 12| 4 | 0 | 0 | +| 52 | 16480 | 1 | 13| 4 | 0 | 0 | +| 53 | 17 | 1 | 14| 4 | 0 | 0 | +| 54 | 17 | 16480 | 15| 4 | 0 | 0 | +| 55 | 32 | 16480 | 16| 4 | 0 | 0 | +| 56 | 32 | 16512 | 17| 4 | 0 | 0 | +| 57 | 17 | 16512 | 18| 4 | 0 | 0 | +| 58 | 17 | 16512 | 19| 4 | 0 | 0 | +| 59 | 16 | 16512 | 20| 4 | 0 | 0 | +| 60 | 16 | 0 | 21| 4 | 0 | 0 | +| 61 | 10 | 0 | 22| 4 | 0 | 0 | +| 62 | 10 | 0 | 23| 4 | 0 | 0 | +| 63 | 23 | 0 | 24| 4 | 0 | 0 |`; +export const add = ` +0000000000000010 +1110110000010000 +0000000000000011 +1110000010010000 +0000000000000000 +1110001100001000 +`; +export const max = `0000000000000000 +1111110000010000 +0000000000000001 +1111010011010000 +0000000000001010 +1110001100000001 +0000000000000001 +1111110000010000 +0000000000001100 +1110101010000111 +0000000000000000 +1111110000010000 +0000000000000010 +1110001100001000 +0000000000001110 +1110101010000111`; +export const rect = ` +0000000000000000 +1111110000010000 +0000000000010111 +1110001100000110 +0000000000010000 +1110001100001000 +0100000000000000 +1110110000010000 +0000000000010001 +1110001100001000 +0000000000010001 +1111110000100000 +1110111010001000 +0000000000010001 +1111110000010000 +0000000000100000 +1110000010010000 +0000000000010001 +1110001100001000 +0000000000010000 +1111110010011000 +0000000000001010 +1110001100000001 +0000000000010111 +1110101010000111`; diff --git a/web-ide-main/projects/src/project_05/04_screen.ts b/web-ide-main/projects/src/project_05/04_screen.ts new file mode 100644 index 0000000..3a54ff0 --- /dev/null +++ b/web-ide-main/projects/src/project_05/04_screen.ts @@ -0,0 +1,29 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/05/Screen.hdl +/** + * The Screen (memory map). + * Same functionality as a 16-bit 8K RAM: + * If load is asserted, the value of the register selected by + * address is set to in; Otherwise, the value does not change. + * The value of the selected register is emitted by out. + * + * This built-in implementation has the side effect of continuously + * refreshing a visual 256 by 512 black-and-white screen, simulated + * by the simulator. Each row in the visual screen is represented + * by 32 consecutive 16-bit words, starting at the top left corner + * of the visual screen. Thus the pixel at row r from the top and + * column c from the left (0<=r<256, 0<=c<512) reflects the c%16 + * bit (counting from LSB to MSB) of the word found in Screen[r*32+c/16]. + */ +CHIP Screen { + IN in[16], // what to write + load, // write-enable bit + address[13]; // where to read/write + OUT out[16]; // Screen value at the given address + + PARTS: + BUILTIN Screen; + CLOCKED in, load; +}`; diff --git a/web-ide-main/projects/src/project_05/05_keyboard.ts b/web-ide-main/projects/src/project_05/05_keyboard.ts new file mode 100644 index 0000000..bcf5770 --- /dev/null +++ b/web-ide-main/projects/src/project_05/05_keyboard.ts @@ -0,0 +1,17 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/05/Keyboard.hdl +/** + * The keyboard (memory map). + * Outputs the character code of the currently pressed key, + * or 0 if no key is pressed. + * + * This built-in implementation has a visualization side effect. + */ +CHIP Keyboard { + OUT out[16]; + + PARTS: + BUILTIN Keyboard; +}`; diff --git a/web-ide-main/projects/src/project_05/06_d_register.ts b/web-ide-main/projects/src/project_05/06_d_register.ts new file mode 100644 index 0000000..39a31d2 --- /dev/null +++ b/web-ide-main/projects/src/project_05/06_d_register.ts @@ -0,0 +1,21 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/05/DRegister.hdl +/** + * A 16-bit register named DRegister with the same functionality + * of the Register chip: + * If load is asserted, the register's value is set to in; + * Otherwise, the register maintains its current value. + * out(t+1) = (load(t), in(t), out(t)) + * + * This built-in implementation has a visualization side effect. + */ +CHIP DRegister { + IN in[16], load; + OUT out[16]; + + PARTS: + BUILTIN DRegister; + CLOCKED in, load; +}`; diff --git a/web-ide-main/projects/src/project_05/07_a_register.ts b/web-ide-main/projects/src/project_05/07_a_register.ts new file mode 100644 index 0000000..efc8b6e --- /dev/null +++ b/web-ide-main/projects/src/project_05/07_a_register.ts @@ -0,0 +1,21 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/05/ARegister.hdl +/** + * A 16-bit register named ARegister with the same functionality + * of the Register chip: + * If load is asserted, the register's value is set to in; + * Otherwise, the register maintains its current value. + * out(t+1) = (load(t), in(t), out(t)) + * + * This built-in implementation has a visualization side effect. + */ + CHIP ARegister { + IN in[16], load; + OUT out[16]; + + PARTS: + BUILTIN ARegister; + CLOCKED in, load; +}`; diff --git a/web-ide-main/projects/src/project_05/08_rom32k.ts b/web-ide-main/projects/src/project_05/08_rom32k.ts new file mode 100644 index 0000000..396fef0 --- /dev/null +++ b/web-ide-main/projects/src/project_05/08_rom32k.ts @@ -0,0 +1,25 @@ +export const hdl = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/05/ROM32K.hdl +/** + * Read-Only memory (ROM) of 32K registers, each 16-bit wide. + * Facilitates data read, as follows: + * out(t) = ROM32K[address(t)](t) + * In words: the chip outputs the value stored at the + * memory location specified by address. + * + * Can be used as the instruction memory of the Hack computer. + * To that end, the built-in chip implementation supports the handling + * of the "ROM32K load Xxx" script command, where Xxx is the name of a + * text file containing a program written in the binary Hack machine language. + * When the simulator encounters such a command in a test script, + * the file's contents is loaded into the simulated ROM32K chip. + */ + CHIP ROM32K { + IN address[15]; + OUT out[16]; + + PARTS: + BUILTIN ROM32K; +}`; diff --git a/web-ide-main/projects/src/project_05/index.ts b/web-ide-main/projects/src/project_05/index.ts new file mode 100644 index 0000000..d0fb6df --- /dev/null +++ b/web-ide-main/projects/src/project_05/index.ts @@ -0,0 +1,58 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; + +import * as RAM16K from "../project_03/08_ram16k.js"; +import { resetBySuffix } from "../reset.js"; +import * as Memory from "./01_memory.js"; +import * as CPU from "./02_cpu.js"; +import * as Computer from "./03_computer.js"; +import * as Screen from "./04_screen.js"; +import * as Keyboard from "./05_keyboard.js"; +import * as DRegister from "./06_d_register.js"; +import * as ARegister from "./07_a_register.js"; +import * as ROM32K from "./08_rom32k.js"; + +export const CHIPS = { + "Memory.hdl": Memory.hdl, + "Memory.tst": Memory.tst, + "Memory.cmp": Memory.cmp, + "CPU.hdl": CPU.hdl, + "CPU.tst": CPU.tst, + "CPU.cmp": CPU.cmp, + "CPU-external.tst": CPU.external_tst, + "CPU-external.cmp": CPU.external_cmp, + "Computer.hdl": Computer.hdl, + "ComputerAdd.tst": Computer.add_tst, + "ComputerAdd.cmp": Computer.add_cmp, + "ComputerMax.tst": Computer.max_tst, + "ComputerMax.cmp": Computer.max_cmp, + "ComputerRect.tst": Computer.rect_tst, + "ComputerRect.cmp": Computer.rect_cmp, + "Add.hack": Computer.add, + "Max.hack": Computer.max, + "Rect.hack": Computer.rect, +}; + +export const BUILTIN_CHIPS = { + Screen: Screen.hdl, + Keyboard: Keyboard.hdl, + DRegister: DRegister.hdl, + ARegister: ARegister.hdl, + ROM32K: ROM32K.hdl, + RAM16K: RAM16K.hdl.replace( + "//// Replace this comment with your code.", + "BUILTIN RAM16K;", + ), +}; + +export async function resetFiles(fs: FileSystem): Promise { + await fs.pushd("/projects/05"); + await reset(fs, CHIPS); + await fs.popd(); +} + +export async function resetTests(fs: FileSystem): Promise { + await fs.pushd("/projects/05"); + await resetBySuffix(fs, CHIPS, ".tst"); + await resetBySuffix(fs, CHIPS, ".cmp"); + await fs.popd(); +} diff --git a/web-ide-main/projects/src/project_05/make_samples.sh b/web-ide-main/projects/src/project_05/make_samples.sh new file mode 100644 index 0000000..bd2b4e3 --- /dev/null +++ b/web-ide-main/projects/src/project_05/make_samples.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# write FileName.ts varname SourceFile + +function write () { + echo -n "export const $2 = \`" >> $1 + cat $3 >> $1 + echo "\`;\n\n" >> $1 +} + +# write_all ts_name ProjName +function write_all() { + for e in vm vm_tst hdl_tst cmp ; do write $1 $e $2.$e ; done +} \ No newline at end of file diff --git a/web-ide-main/projects/src/project_07/11_simple_add.ts b/web-ide-main/projects/src/project_07/11_simple_add.ts new file mode 100644 index 0000000..43d1e05 --- /dev/null +++ b/web-ide-main/projects/src/project_07/11_simple_add.ts @@ -0,0 +1,55 @@ +export const vm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/StackArithmetic/SimpleAdd/SimpleAdd.vm + +// Pushes and adds two constants. + +push constant 7 +push constant 8 +add +`; + +export const vm_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/StackArithmetic/SimpleAdd/SimpleAddVME.tst + +// Tests and illustrates SimpleAdd.vm on the VM simulator. + +load SimpleAdd.vm, +compare-to SimpleAdd.cmp, + +set RAM[0] 256, // initializes the stack pointer + +repeat 3 { // SimpleAdd.vm has 3 VM commands + vmstep; +} + +// Outputs the stack pointer and the value at the stack's base +output-list RAM[0]%D2.6.2 RAM[256]%D2.6.2; +output;`; + +export const hdl_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/StackArithmetic/SimpleAdd/SimpleAdd.tst + +// Tests SimpleAdd.asm on the CPU emulator. + +compare-to SimpleAdd.cmp, + +set RAM[0] 256, // initializes the stack pointer + +repeat 60 { // enough cycles to complete the execution + ticktock; +} + +// Outputs the stack pointer and the value at the stack's base +output-list RAM[0]%D2.6.2 RAM[256]%D2.6.2; +output; +`; + +export const cmp = `| RAM[0] | RAM[256] | +| 257 | 15 | +`; diff --git a/web-ide-main/projects/src/project_07/12_stack_test.ts b/web-ide-main/projects/src/project_07/12_stack_test.ts new file mode 100644 index 0000000..6eb3b8a --- /dev/null +++ b/web-ide-main/projects/src/project_07/12_stack_test.ts @@ -0,0 +1,99 @@ +export const vm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/StackArithmetic/StackTest/StackTest.vm + +// Executes a sequence of arithmetic and logical operations on the stack. + +push constant 17 +push constant 17 +eq +push constant 17 +push constant 16 +eq +push constant 16 +push constant 17 +eq +push constant 892 +push constant 891 +lt +push constant 891 +push constant 892 +lt +push constant 891 +push constant 891 +lt +push constant 32767 +push constant 32766 +gt +push constant 32766 +push constant 32767 +gt +push constant 32766 +push constant 32766 +gt +push constant 57 +push constant 31 +push constant 53 +add +push constant 112 +sub +neg +and +push constant 82 +or +not +`; + +export const vm_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/StackArithmetic/StackTest/StackTestVME.tst + +// Tests and illustrates StackTest.vm on the VM simulator. + +load StackTest.vm, +compare-to StackTest.cmp, + +set RAM[0] 256, // initializes the stack pointer + +repeat 38 { // StackTest.vm has 38 VM commands + vmstep; +} + +// Outputs the stack pointer (RAM[0]) and the stack contents: RAM[256]-RAM[265] +output-list RAM[0]%D2.6.2 + RAM[256]%D2.6.2 RAM[257]%D2.6.2 RAM[258]%D2.6.2 RAM[259]%D2.6.2 RAM[260]%D2.6.2; +output; +output-list RAM[261]%D2.6.2 RAM[262]%D2.6.2 RAM[263]%D2.6.2 RAM[264]%D2.6.2 RAM[265]%D2.6.2; +output; +`; + +export const hdl_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/StackArithmetic/StackTest/StackTest.tst + +// Tests StackTest.asm on the CPU emulator. + +compare-to StackTest.cmp, + +set RAM[0] 256, // initializes the stack pointer + +repeat 1000 { // enough cycles to complete the execution + ticktock; +} + +// Outputs the stack pointer and the stack contents: RAM[256]-RAM[265] +output-list RAM[0]%D2.6.2 + RAM[256]%D2.6.2 RAM[257]%D2.6.2 RAM[258]%D2.6.2 RAM[259]%D2.6.2 RAM[260]%D2.6.2; +output; +output-list RAM[261]%D2.6.2 RAM[262]%D2.6.2 RAM[263]%D2.6.2 RAM[264]%D2.6.2 RAM[265]%D2.6.2; +output; +`; + +export const cmp = `| RAM[0] | RAM[256] | RAM[257] | RAM[258] | RAM[259] | RAM[260] | +| 266 | -1 | 0 | 0 | 0 | -1 | +| RAM[261] | RAM[262] | RAM[263] | RAM[264] | RAM[265] | +| 0 | -1 | 0 | 0 | -91 | +`; diff --git a/web-ide-main/projects/src/project_07/21_basic_test.ts b/web-ide-main/projects/src/project_07/21_basic_test.ts new file mode 100644 index 0000000..2acce81 --- /dev/null +++ b/web-ide-main/projects/src/project_07/21_basic_test.ts @@ -0,0 +1,91 @@ +export const vm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/MemoryAccess/BasicTest/BasicTest.vm + +// Executes pop and push commands. + +push constant 10 +pop local 0 +push constant 21 +push constant 22 +pop argument 2 +pop argument 1 +push constant 36 +pop this 6 +push constant 42 +push constant 45 +pop that 5 +pop that 2 +push constant 510 +pop temp 6 +push local 0 +push that 5 +add +push argument 1 +sub +push this 6 +push this 6 +add +sub +push temp 6 +add +`; + +export const vm_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/MemoryAccess/BasicTest/BasicTestVME.tst + +// Tests and illustrates BasicTest.vm on the VM simulator. +// Starts by setting the stack pointer and the base addresses +// of relevant memory segments to selected RAM addresses. + +load BasicTest.vm, +compare-to BasicTest.cmp, + +set sp 256, // stack pointer +set local 300, // base address of the local segment +set argument 400, // base address of the argument segment +set this 3000, // base address of the this segment +set that 3010, // base address of the that segment + +repeat 25 { // BasicTest.vm has 25 VM commands + vmstep; +} + +// Outputs the value at the stack's base and some values from the tested memory segments +output-list RAM[256]%D1.6.1 RAM[300]%D1.6.1 RAM[401]%D1.6.1 + RAM[402]%D1.6.1 RAM[3006]%D1.6.1 RAM[3012]%D1.6.1 + RAM[3015]%D1.6.1 RAM[11]%D1.6.1; +output; +`; + +export const hdl_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/MemoryAccess/BasicTest/BasicTest.tst + +// Tests BasicTest.asm on the CPU emulator. + +compare-to BasicTest.cmp, + +set RAM[0] 256, // stack pointer +set RAM[1] 300, // base address of the local segment +set RAM[2] 400, // base address of the argument segment +set RAM[3] 3000, // base address of the this segment +set RAM[4] 3010, // base address of the that segment + +repeat 600 { // enough cycles to complete the execution + ticktock; +} + +// Outputs the value at the stack's base and some values from the tested memory segments +output-list RAM[256]%D1.6.1 RAM[300]%D1.6.1 RAM[401]%D1.6.1 + RAM[402]%D1.6.1 RAM[3006]%D1.6.1 RAM[3012]%D1.6.1 + RAM[3015]%D1.6.1 RAM[11]%D1.6.1; +output; +`; + +export const cmp = `|RAM[256]|RAM[300]|RAM[401]|RAM[402]|RAM[3006|RAM[3012|RAM[3015|RAM[11] | +| 472 | 10 | 21 | 22 | 36 | 42 | 45 | 510 |`; diff --git a/web-ide-main/projects/src/project_07/22_pointer_test.ts b/web-ide-main/projects/src/project_07/22_pointer_test.ts new file mode 100644 index 0000000..5e5ecca --- /dev/null +++ b/web-ide-main/projects/src/project_07/22_pointer_test.ts @@ -0,0 +1,72 @@ +export const vm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/MemoryAccess/PointerTest/PointerTest.vm + +// Executes pop and push commands using the +// pointer, this, and that segments. + +push constant 3030 +pop pointer 0 +push constant 3040 +pop pointer 1 +push constant 32 +pop this 2 +push constant 46 +pop that 6 +push pointer 0 +push pointer 1 +add +push this 2 +sub +push that 6 +add +`; + +export const vm_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/MemoryAccess/PointerTest/PointerTestVME.tst + +// Tests and illustrates PointerTest.vm on the VM simulator. + +load PointerTest.vm, +compare-to PointerTest.cmp, + +set RAM[0] 256, // initializes the stack pointer + +repeat 15 { // PointerTest.vm has 15 VM commands + vmstep; +} + +// Outputs the stack base, THIS, THAT, and +// some values from the the this and that segments +output-list RAM[256]%D1.6.1 RAM[3]%D1.6.1 RAM[4]%D1.6.1 + RAM[3032]%D1.6.1 RAM[3046]%D1.6.1; +output; +`; + +export const hdl_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/MemoryAccess/PointerTest/PointerTest.tst + +// Tests PointerTest.asm on the CPU emulator. + +compare-to PointerTest.cmp, + +set RAM[0] 256, // initializes the stack pointer + +repeat 450 { // enough cycles to complete the execution + ticktock; +} + +// Outputs the value at the stack's base, THIS, THAT, and +// some values from the the this and that segments +output-list RAM[256]%D1.6.1 RAM[3]%D1.6.1 + RAM[4]%D1.6.1 RAM[3032]%D1.6.1 RAM[3046]%D1.6.1; +output; +`; + +export const cmp = `|RAM[256]| RAM[3] | RAM[4] |RAM[3032|RAM[3046| + | 6084 | 3030 | 3040 | 32 | 46 |`; diff --git a/web-ide-main/projects/src/project_07/23_static_test.ts b/web-ide-main/projects/src/project_07/23_static_test.ts new file mode 100644 index 0000000..d54b057 --- /dev/null +++ b/web-ide-main/projects/src/project_07/23_static_test.ts @@ -0,0 +1,63 @@ +export const vm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/MemoryAccess/StaticTest/StaticTest.vm + +// Executes pop and push commands using the static segment. + +push constant 111 +push constant 333 +push constant 888 +pop static 8 +pop static 3 +pop static 1 +push static 3 +push static 1 +sub +push static 8 +add +`; + +export const vm_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/MemoryAccess/StaticTest/StaticTestVME.tst + +// Tests and illustrates StaticTest.vm on the VM simulator. + +load StaticTest.vm, +compare-to StaticTest.cmp, + +set sp 256, // initializes the stack pointer + +repeat 11 { // StaticTest.vm has 11 VM commands + vmstep; +} + +// Outputs the value at the stack's base +output-list RAM[256]%D1.6.1; +output; +`; + +export const hdl_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/7/MemoryAccess/StaticTest/StaticTest.tst + +// Tests StaticTest.asm on the CPU emulator. + +compare-to StaticTest.cmp, + +set RAM[0] 256, // initializes the stack pointer + +repeat 200 { // enough cycles to complete the execution + ticktock; +} + +// Outputs the value at the stack's base +output-list RAM[256]%D1.6.1; +output; +`; + +export const cmp = `|RAM[256]| +| 1110 |`; diff --git a/web-ide-main/projects/src/project_07/index.ts b/web-ide-main/projects/src/project_07/index.ts new file mode 100644 index 0000000..f7504af --- /dev/null +++ b/web-ide-main/projects/src/project_07/index.ts @@ -0,0 +1,54 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { resetBySuffix } from "../reset.js"; +import * as simple_add from "./11_simple_add.js"; +import * as stack_test from "./12_stack_test.js"; +import * as basic_test from "./21_basic_test.js"; +import * as pointer_test from "./22_pointer_test.js"; +import * as static_test from "./23_static_test.js"; + +export const VMS = { + SimpleAdd: { + "SimpleAdd.vm": simple_add.vm, + "SimpleAddVME.tst": simple_add.vm_tst, + "SimpleAdd.cmp": simple_add.cmp, + "SimpleAdd.tst": simple_add.hdl_tst, + }, + StackTest: { + "StackTest.vm": stack_test.vm, + "StackTestVME.tst": stack_test.vm_tst, + "StackTest.cmp": stack_test.cmp, + "StackTest.tst": stack_test.hdl_tst, + }, + BasicTest: { + "BasicTest.vm": basic_test.vm, + "BasicTestVME.tst": basic_test.vm_tst, + "BasicTest.cmp": basic_test.cmp, + "BasicTest.tst": basic_test.hdl_tst, + }, + PointerTest: { + "PointerTest.vm": pointer_test.vm, + "PointerTestVME.tst": pointer_test.vm_tst, + "PointerTest.cmp": pointer_test.cmp, + "PointerTest.tst": pointer_test.hdl_tst, + }, + StaticTest: { + "StaticTest.vm": static_test.vm, + "StaticTestVME.tst": static_test.vm_tst, + "StaticTest.cmp": static_test.cmp, + "StaticTest.tst": static_test.hdl_tst, + }, +}; + +export async function resetFiles(fs: FileSystem): Promise { + await fs.pushd("/projects/07"); + await reset(fs, VMS); + await fs.popd(); +} + +export async function resetTests(fs: FileSystem): Promise { + await fs.pushd("/projects/07"); + await resetBySuffix(fs, VMS, ".tst"); + await resetBySuffix(fs, VMS, "VME.tst"); + await resetBySuffix(fs, VMS, ".cmp"); + await fs.popd(); +} diff --git a/web-ide-main/projects/src/project_08/11_basic_loop.ts b/web-ide-main/projects/src/project_08/11_basic_loop.ts new file mode 100644 index 0000000..10cef1e --- /dev/null +++ b/web-ide-main/projects/src/project_08/11_basic_loop.ts @@ -0,0 +1,81 @@ +export const vm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/ProgramFlow/BasicLoop/BasicLoop.vm + +// Computes the sum 1 + 2 + ... + n and pushes the result onto +// the stack. The value n is given in argument[0], which must be +// initialized by the caller of this code. + + push constant 0 + pop local 0 // sum = 0 +label LOOP + push argument 0 + push local 0 + add + pop local 0 // sum = sum + n + push argument 0 + push constant 1 + sub + pop argument 0 // n-- + push argument 0 + if-goto LOOP // if n > 0, goto LOOP + push local 0 // else, pushes sum to the stack's top +`; + +export const vm_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/ProgramFlow/BasicLoop/BasicLoopVME.tst + +// Tests and illustrates BasicLoop.vm on the VM emulator. +// Before executing the code, initializes the stack pointer +// and the base addresses of the local and argument segments, +// and sets argument[0]. + +load BasicLoop.vm, +compare-to BasicLoop.cmp, + +set sp 256, +set local 300, +set argument 400, +set argument[0] 3, + +repeat 33 { + vmstep; +} + +// Outputs the stack pointer and the value at the stack's base +output-list RAM[0]%D1.6.1 RAM[256]%D1.6.1; +output; +`; + +export const hdl_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/ProgramFlow/BasicLoop/BasicLoop.tst + +// Tests BasicLoop.asm on the CPU emulator. +// Before executing the code, initializes the stack pointer +// and the base addresses of the local and argument segments, +// and sets argument[0]. + +compare-to BasicLoop.cmp, + +set RAM[0] 256, // SP +set RAM[1] 300, // LCL +set RAM[2] 400, // ARG +set RAM[400] 3, // argument 0 + +repeat 600 { + ticktock; +} + +// Outputs the stack pointer and the value at the stack's base +output-list RAM[0]%D1.6.1 RAM[256]%D1.6.1; +output; +`; + +export const cmp = `| RAM[0] |RAM[256]| +| 257 | 6 | +`; diff --git a/web-ide-main/projects/src/project_08/12_fibonacci_series.ts b/web-ide-main/projects/src/project_08/12_fibonacci_series.ts new file mode 100644 index 0000000..0dc721f --- /dev/null +++ b/web-ide-main/projects/src/project_08/12_fibonacci_series.ts @@ -0,0 +1,107 @@ +export const vm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/ProgramFlow/FibonacciSeries/FibonacciSeries.vm + +// Puts the first n elements of the Fibonacci series in the memory, +// starting at address addr. n and addr are given in argument[0] and +// argument[1], which must be initialized by the caller of this code. + + push argument 1 // sets THAT, the base address of the + pop pointer 1 // that segment, to argument[1] + push constant 0 // sets the series' first and second + pop that 0 // elements to 0 and 1, respectively + push constant 1 + pop that 1 + push argument 0 // sets n, the number of remaining elements + push constant 2 // to be computed, to argument[0] minus 2, + sub // since 2 elements were already computed. + pop argument 0 + +label LOOP + push argument 0 + if-goto COMPUTE_ELEMENT // if n > 0, goto COMPUTE_ELEMENT + goto END // otherwise, goto END + +label COMPUTE_ELEMENT + // that[2] = that[0] + that[1] + push that 0 + push that 1 + add + pop that 2 + // THAT += 1 (updates the base address of that) + push pointer 1 + push constant 1 + add + pop pointer 1 + // updates n-- and loops + push argument 0 + push constant 1 + sub + pop argument 0 + goto LOOP + +label END +`; + +export const vm_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/ProgramFlow/FibonacciSeries/FibonacciSeriesVME.tst + +// Tests and illustrates FibonacciSeries.vm on the VM emulator. +// Before executing the code, initializes the stack pointer +// and the base addresses of the local and argument segments, +// and sets argument[0] to n and argument [1] to the base address +// of the generated series. + +load FibonacciSeries.vm, +compare-to FibonacciSeries.cmp, + +set sp 256, +set local 300, +set argument 400, +set argument[0] 6, +set argument[1] 3000, + +repeat 73 { + vmstep; +} + +// Outputs the series of values generated and written by the code. +output-list RAM[3000]%D1.6.2 RAM[3001]%D1.6.2 RAM[3002]%D1.6.2 + RAM[3003]%D1.6.2 RAM[3004]%D1.6.2 RAM[3005]%D1.6.2; +output; +`; + +export const hdl_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/ProgramFlow/FibonacciSeries/FibonacciSeries.tst + +// Tests FibonacciSeries.asm on the CPU emulator. +// Before executing the code, initializes the stack pointer +// and the base addresses of the local and argument segments, +// and sets argument[0] and argument [1]. + +compare-to FibonacciSeries.cmp, + +set RAM[0] 256, // SP +set RAM[1] 300, // LCL +set RAM[2] 400, // ARG +set RAM[400] 6, // argument[0], n +set RAM[401] 3000, // argument[1], base address of the generated series + +repeat 1100 { + ticktock; +} + +// Outputs the series of values generated and written by the code. +output-list RAM[3000]%D1.6.2 RAM[3001]%D1.6.2 RAM[3002]%D1.6.2 + RAM[3003]%D1.6.2 RAM[3004]%D1.6.2 RAM[3005]%D1.6.2; +output; +`; + +export const cmp = `|RAM[3000]|RAM[3001]|RAM[3002]|RAM[3003]|RAM[3004]|RAM[3005]| +| 0 | 1 | 1 | 2 | 3 | 5 | +`; diff --git a/web-ide-main/projects/src/project_08/20_simple_function.ts b/web-ide-main/projects/src/project_08/20_simple_function.ts new file mode 100644 index 0000000..0f104ed --- /dev/null +++ b/web-ide-main/projects/src/project_08/20_simple_function.ts @@ -0,0 +1,96 @@ +export const vm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/SimpleFunction/SimpleFunction.vm + +// Performs a simple calculation and returns the result. +// argument[0] and argument[1] must be set by the caller. + +function SimpleFunction.test 2 + push local 0 + push local 1 + add + not + push argument 0 + add + push argument 1 + sub + return +`; + +export const vm_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/SimpleFunction/SimpleFunctionVME.tst + +// Tests and illustrates SimpleFunction.vm in the VM emulator. +// Before executing the code, initializes the stack pointer +// and the base addresses of some of the memory segments, +// and sets some values in the argument segment. + +load SimpleFunction.vm, +compare-to SimpleFunction.cmp, + +set sp 317, +set local 317, +set argument 310, +set this 3000, +set that 4000, +set argument[0] 1234, +set argument[1] 37, +set argument[2] 9, +set argument[3] 305, +set argument[4] 300, +set argument[5] 3010, +set argument[6] 4010, + +repeat 10 { + vmstep; +} + +// Outputs SP, LCL, ARG, THIS, THAT, and the return value. +output-list RAM[0]%D1.6.1 RAM[1]%D1.6.1 RAM[2]%D1.6.1 + RAM[3]%D1.6.1 RAM[4]%D1.6.1 RAM[310]%D1.6.1; +output; +`; + +export const hdl_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/SimpleFunction/SimpleFunction.tst + +// Tests SimpleFunction.asm in the CPU emulator. +// In particular, tests how the assembly implementation of the 'function' +// VM command initializes local variables, and how the assembly implementation +// of the 'return' VM command handles the return value, SP, LCL, ARG, THIS, and THAT. +// Before executing the code, initializes the stack pointer and the pointers of some +// of the memory segments, and sets some values in the argument segment. + +compare-to SimpleFunction.cmp, + +set RAM[0] 317, // SP +set RAM[1] 317, // LCL +set RAM[2] 310, // ARG +set RAM[3] 3000, // THIS +set RAM[4] 4000, // THAT +set RAM[310] 1234, +set RAM[311] 37, +set RAM[312] 1000, +set RAM[313] 305, +set RAM[314] 300, +set RAM[315] 3010, +set RAM[316] 4010, + +repeat 300 { + ticktock; +} + +// Outputs SP, LCL, ARG, THIS, THAT, and the return value. +output-list RAM[0]%D1.6.1 RAM[1]%D1.6.1 RAM[2]%D1.6.1 + RAM[3]%D1.6.1 RAM[4]%D1.6.1 RAM[310]%D1.6.1; +output; +`; + +export const cmp = `| RAM[0] | RAM[1] | RAM[2] | RAM[3] | RAM[4] |RAM[310]| +| 311 | 305 | 300 | 3010 | 4010 | 1196 | +`; diff --git a/web-ide-main/projects/src/project_08/21_nested_call.ts b/web-ide-main/projects/src/project_08/21_nested_call.ts new file mode 100644 index 0000000..4439ac8 --- /dev/null +++ b/web-ide-main/projects/src/project_08/21_nested_call.ts @@ -0,0 +1,204 @@ +export const sys = `// Sys.vm. Tested by the NestedCall test script. +// Consists of three functions: Sys.init, Sys.main, and Sys.add12. + +// Calls Sys.main() and stores a return value in temp 1. +// Does not return (enters infinite loop). +// The VM implementation starts running the Sys.init function, by default. +function Sys.init 0 + push constant 4000 // tests that THIS and THAT are handled correctly + pop pointer 0 + push constant 5000 + pop pointer 1 + call Sys.main 0 + pop temp 1 + label LOOP + goto LOOP + +// Sets locals 1, 2 and 3 to some values. Leaves locals 0 and 4 unchanged, +// to test that the 'function' VM command initializes them to 0 (the test +// script sets them to -1 before this code starts running). +// Calls Sys.add12(123) and stores the return value (should be 135) in temp 0. +// Returns local 0 + local 1 + local 2 + local 3 + local 4 (should be 456), to +// confirm that locals were not mangled by the function call. +function Sys.main 5 + push constant 4001 + pop pointer 0 + push constant 5001 + pop pointer 1 + push constant 200 + pop local 1 + push constant 40 + pop local 2 + push constant 6 + pop local 3 + push constant 123 + call Sys.add12 1 + pop temp 0 + push local 0 + push local 1 + push local 2 + push local 3 + push local 4 + add + add + add + add + return + +// Returns (argument 0) + 12. +function Sys.add12 0 + push constant 4002 + pop pointer 0 + push constant 5002 + pop pointer 1 + push argument 0 + push constant 12 + add + return +`; + +export const vm_tst = `// Tests and illustrates how the VM implementation handles function-call-and-return, +// by executing the functions in Sys.vm in the VM emulator. +// In particular, loads and runs the functions in Sys.vm. + +load Sys.vm, +compare-to NestedCall.cmp, +output-list RAM[0]%D1.6.1 RAM[1]%D1.6.1 RAM[2]%D1.6.1 RAM[3]%D1.6.1 RAM[4]%D1.6.1 RAM[5]%D1.6.1 RAM[6]%D1.6.1; + +set RAM[0] 261, +set RAM[1] 261, +set RAM[2] 256, +set RAM[3] -3, +set RAM[4] -4, +set RAM[5] -1, // test results +set RAM[6] -1, +set RAM[256] 1234, // fake stack frame from call Sys.init +set RAM[257] -1, +set RAM[258] -2, +set RAM[259] -3, +set RAM[260] -4, + +set RAM[261] -1, // Initialize stack to check for local segment +set RAM[262] -1, // being cleared to zero. +set RAM[263] -1, +set RAM[264] -1, +set RAM[265] -1, +set RAM[266] -1, +set RAM[267] -1, +set RAM[268] -1, +set RAM[269] -1, +set RAM[270] -1, +set RAM[271] -1, +set RAM[272] -1, +set RAM[273] -1, +set RAM[274] -1, +set RAM[275] -1, +set RAM[276] -1, +set RAM[277] -1, +set RAM[278] -1, +set RAM[279] -1, +set RAM[280] -1, +set RAM[281] -1, +set RAM[282] -1, +set RAM[283] -1, +set RAM[284] -1, +set RAM[285] -1, +set RAM[286] -1, +set RAM[287] -1, +set RAM[288] -1, +set RAM[289] -1, +set RAM[290] -1, +set RAM[291] -1, +set RAM[292] -1, +set RAM[293] -1, +set RAM[294] -1, +set RAM[295] -1, +set RAM[296] -1, +set RAM[297] -1, +set RAM[298] -1, +set RAM[299] -1, + +set sp 261, +set local 261, +set argument 256, +set this 3000, +set that 4000; + +repeat 50 { + vmstep; +} +output; +`; + +export const hdl_tst = `// Tests how the VM implementation handles function-call-and-return, +// by executing the functions in Sys.vm. +// In particular, loads and runs NestedCall.asm, which results when +// the VM translator is applied to the NestedCall folder, which +// includes only one VM file: Sys.vm. + +compare-to NestedCall.cmp, + +set RAM[0] 261, +set RAM[1] 261, +set RAM[2] 256, +set RAM[3] -3, +set RAM[4] -4, +set RAM[5] -1, // test results +set RAM[6] -1, +set RAM[256] 1234, // fake stack frame from call Sys.init +set RAM[257] -1, +set RAM[258] -2, +set RAM[259] -3, +set RAM[260] -4, + +set RAM[261] -1, // Initializes the stack, to check that the local segment +set RAM[262] -1, // is initialized to zeros by the 'function' VM command. +set RAM[263] -1, +set RAM[264] -1, +set RAM[265] -1, +set RAM[266] -1, +set RAM[267] -1, +set RAM[268] -1, +set RAM[269] -1, +set RAM[270] -1, +set RAM[271] -1, +set RAM[272] -1, +set RAM[273] -1, +set RAM[274] -1, +set RAM[275] -1, +set RAM[276] -1, +set RAM[277] -1, +set RAM[278] -1, +set RAM[279] -1, +set RAM[280] -1, +set RAM[281] -1, +set RAM[282] -1, +set RAM[283] -1, +set RAM[284] -1, +set RAM[285] -1, +set RAM[286] -1, +set RAM[287] -1, +set RAM[288] -1, +set RAM[289] -1, +set RAM[290] -1, +set RAM[291] -1, +set RAM[292] -1, +set RAM[293] -1, +set RAM[294] -1, +set RAM[295] -1, +set RAM[296] -1, +set RAM[297] -1, +set RAM[298] -1, +set RAM[299] -1, + +repeat 4000 { + ticktock; +} + +output-list RAM[0]%D1.6.1 RAM[1]%D1.6.1 RAM[2]%D1.6.1 RAM[3]%D1.6.1 RAM[4]%D1.6.1 RAM[5]%D1.6.1 RAM[6]%D1.6.1; +output; +`; + +export const cmp = `| RAM[0] | RAM[1] | RAM[2] | RAM[3] | RAM[4] | RAM[5] | RAM[6] | +| 261 | 261 | 256 | 4000 | 5000 | 135 | 246 | +`; diff --git a/web-ide-main/projects/src/project_08/22_fibonacci_element.ts b/web-ide-main/projects/src/project_08/22_fibonacci_element.ts new file mode 100644 index 0000000..94e81c9 --- /dev/null +++ b/web-ide-main/projects/src/project_08/22_fibonacci_element.ts @@ -0,0 +1,98 @@ +export const main = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/FibonacciElement/Main.vm + +// Contains one function: Main.fibonacci. + +// Computes the n'th element of the Fibonacci series, recursively. +// n is given in argument[0]. Called by the Sys.init function +// (part of the Sys.vm file), which sets argument[0] to an input +// value and then calls Main.fibonacci. +function Main.fibonacci 0 + push argument 0 + push constant 2 + lt + if-goto N_LT_2 + goto N_GE_2 +label N_LT_2 // if n < 2 returns n + push argument 0 + return +label N_GE_2 // if n >= 2 returns fib(n - 2) + fib(n - 1) + push argument 0 + push constant 2 + sub + call Main.fibonacci 1 // computes fib(n - 2) + push argument 0 + push constant 1 + sub + call Main.fibonacci 1 // computes fib(n - 1) + add // returns fib(n - 1) + fib(n - 2) + return +`; + +export const sys = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/FibonacciElement/Sys.vm + +// Containts one function: Sys.init. + +// Pushes a constant n onto the stack, and calls the Main.fibonacii +// function, which computes the n'th element of the Fibonacci series. +// Note that by convention, the Sys.init function is called "automatically" +// by the bootstrap code generated by the VM translator. +function Sys.init 0 + // Computes fibonacci(4) + push constant 4 + // Calls the function, informing that one argument was pushed onto the stack + call Main.fibonacci 1 +label END + goto END // loops infinitely`; + +export const vm_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/FibonacciElement/FibonacciElementVME.tst + +// Tests and illustrates the given Fibonacci element program on the VM emulator. + +load, +compare-to FibonacciElement.cmp, + +set sp 261, + +repeat 110 { + vmstep; +} + +// Outputs the stack pointer and the value at the stack's base. +// That's where the implementation should put the return value. +output-list RAM[0]%D1.6.1 RAM[261]%D1.6.1; +output; +`; + +export const hdl_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/FibonacciElement/FibonacciElement.tst + +// Tests FibonacciElement.asm on the CPU emulator. +// FibonacciElement.asm results from translating Main.vm and Sys.vm into +// a single assembly program, stored in the file FibonacciElement.asm. + +compare-to FibonacciElement.cmp, + +repeat 6000 { + ticktock; +} + +// Outputs the stack pointer and the value at the stack's base. +// That's where the implementation should put the return value. +output-list RAM[0]%D1.6.1 RAM[261]%D1.6.1; +output; +`; + +export const cmp = `| RAM[0] |RAM[261]| +| 262 | 3 | +`; diff --git a/web-ide-main/projects/src/project_08/23_statics_test.ts b/web-ide-main/projects/src/project_08/23_statics_test.ts new file mode 100644 index 0000000..835d471 --- /dev/null +++ b/web-ide-main/projects/src/project_08/23_statics_test.ts @@ -0,0 +1,107 @@ +export const class1 = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/StaticsTest/Class1.vm + +// Stores two supplied arguments in static[0] and static[1]. +function Class1.set 0 + push argument 0 + pop static 0 + push argument 1 + pop static 1 + push constant 0 + return + +// Returns static[0] - static[1]. +function Class1.get 0 + push static 0 + push static 1 + sub + return`; + +export const class2 = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/StaticsTest/Class2.vm + +// Stores two supplied arguments in static[0] and static[1]. +function Class2.set 0 + push argument 0 + pop static 0 + push argument 1 + pop static 1 + push constant 0 + return + +// Returns static[0] - static[1]. +function Class2.get 0 + push static 0 + push static 1 + sub + return`; + +export const sys = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/StaticsTest/Sys.vm + +// Tests that different functions, stored in two different +// class files, manipulate the static segment correctly. + +function Sys.init 0 + push constant 6 + push constant 8 + call Class1.set 2 + pop temp 0 // dumps the return value + push constant 23 + push constant 15 + call Class2.set 2 + pop temp 0 // dumps the return value + call Class1.get 0 + call Class2.get 0 +label END + goto END`; + +export const vm_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/StaticsTest/StaticsTestVME.tst + +// Tests and illustrates the statics test on the VM emulator. + +load, +compare-to StaticsTest.cmp, + +set sp 261, + +repeat 36 { + vmstep; +} + +output-list RAM[0]%D1.6.1 RAM[261]%D1.6.1 RAM[262]%D1.6.1; +output; +`; + +export const hdl_tst = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/8/FunctionCalls/StaticsTest/StaticsTest.tst + +// Tests StaticTest.asm in the CPU emulator. +// This assembly file results from translating the staticsTest folder. + +compare-to StaticsTest.cmp, + +set RAM[0] 256, + +repeat 2500 { + ticktock; +} + +output-list RAM[0]%D1.6.1 RAM[261]%D1.6.1 RAM[262]%D1.6.1; +output; +`; + +export const cmp = `| RAM[0] |RAM[261]|RAM[262]| +| 263 | -2 | 8 | +`; diff --git a/web-ide-main/projects/src/project_08/index.ts b/web-ide-main/projects/src/project_08/index.ts new file mode 100644 index 0000000..08cbe2c --- /dev/null +++ b/web-ide-main/projects/src/project_08/index.ts @@ -0,0 +1,64 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { resetBySuffix } from "../reset.js"; +import * as basic_loop from "./11_basic_loop.js"; +import * as fibonacci_series from "./12_fibonacci_series.js"; +import * as simple_function from "./20_simple_function.js"; +import * as nested_call from "./21_nested_call.js"; +import * as fibonacci_element from "./22_fibonacci_element.js"; +import * as statics_test from "./23_statics_test.js"; + +export const VMS = { + BasicLoop: { + "BasicLoop.vm": basic_loop.vm, + "BasicLoopVME.tst": basic_loop.vm_tst, + "BasicLoop.cmp": basic_loop.cmp, + "BasicLoop.tst": basic_loop.hdl_tst, + }, + FibonacciSeries: { + "FibonacciSeries.vm": fibonacci_series.vm, + "FibonacciSeriesVME.tst": fibonacci_series.vm_tst, + "FibonacciSeries.cmp": fibonacci_series.cmp, + "FibonacciSeries.tst": fibonacci_series.hdl_tst, + }, + SimpleFunction: { + "SimpleFunction.vm": simple_function.vm, + "SimpleFunctionVME.tst": simple_function.vm_tst, + "SimpleFunction.cmp": simple_function.cmp, + "SimpleFunction.tst": simple_function.hdl_tst, + }, + NestedCall: { + "Sys.vm": nested_call.sys, // Test uses a special name here + "NestedCallVME.tst": nested_call.vm_tst, + "NestedCall.cmp": nested_call.cmp, + "NestedCall.tst": nested_call.hdl_tst, + }, + FibonacciElement: { + "Sys.vm": fibonacci_element.sys, + "Main.vm": fibonacci_element.main, + "FibonacciElementVME.tst": fibonacci_element.vm_tst, + "FibonacciElement.cmp": fibonacci_element.cmp, + "FibonacciElement.tst": fibonacci_element.hdl_tst, + }, + StaticsTest: { + "Class1.vm": statics_test.class1, + "Class2.vm": statics_test.class2, + "Sys.vm": statics_test.sys, + "StaticsTestVME.tst": statics_test.vm_tst, + "StaticsTest.cmp": statics_test.cmp, + "StaticsTest.tst": statics_test.hdl_tst, + }, +}; + +export async function resetFiles(fs: FileSystem): Promise { + await fs.pushd("/projects/08"); + await reset(fs, VMS); + await fs.popd(); +} + +export async function resetTests(fs: FileSystem): Promise { + await fs.pushd("/projects/08"); + await resetBySuffix(fs, VMS, ".tst"); + await resetBySuffix(fs, VMS, "VME.tst"); + await resetBySuffix(fs, VMS, ".cmp"); + await fs.popd(); +} diff --git a/web-ide-main/projects/src/reset.ts b/web-ide-main/projects/src/reset.ts new file mode 100644 index 0000000..6f54f99 --- /dev/null +++ b/web-ide-main/projects/src/reset.ts @@ -0,0 +1,40 @@ +import { Tree } from "@davidsouther/jiffies/lib/esm/fs"; +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; + +export async function resetBySuffix( + fs: FileSystem, + tree: Tree, + suffix: string, +) { + for (const [key, value] of Object.entries(tree)) { + if (typeof value === "string") { + if (key.endsWith(`${suffix}`)) { + await fs.writeFile(key, value); + } + } else { + fs.cd(key); + await resetBySuffix(fs, value as Tree, suffix); + fs.cd(".."); + } + } +} + +export async function reset( + fs: FileSystem, + tree: Tree, + base?: string, + override = true, +) { + const items = (await fs.scandir(base ?? "/")).map((item) => item.name); + for (const [key, value] of Object.entries(tree)) { + const path = `${base ? `${base}/` : ""}${key}`; + if (typeof value === "string") { + if (override || !items.includes(key)) { + await fs.writeFile(path, value); + } + } else { + await fs.mkdir(path); + await reset(fs, value as Tree, path); + } + } +} diff --git a/web-ide-main/projects/src/samples/Mult.cmp b/web-ide-main/projects/src/samples/Mult.cmp new file mode 100644 index 0000000..188d9f7 --- /dev/null +++ b/web-ide-main/projects/src/samples/Mult.cmp @@ -0,0 +1,7 @@ +| RAM[2] | +| 0 | +| 0 | +| 0 | +| 3 | +| 8 | +| 42 | \ No newline at end of file diff --git a/web-ide-main/projects/src/samples/Mult.tst b/web-ide-main/projects/src/samples/Mult.tst new file mode 100644 index 0000000..c5ebbfe --- /dev/null +++ b/web-ide-main/projects/src/samples/Mult.tst @@ -0,0 +1,48 @@ +output-list RAM[2]%D2.6.2; + +set RAM[0] 0, +set RAM[1] 0; +repeat 20 { + ticktock; +} +output; + +set PC 0, +set RAM[0] 1, +set RAM[1] 0; +repeat 50 { + ticktock; +} +output; + +set PC 0, +set RAM[0] 0, +set RAM[1] 2; +repeat 80 { + ticktock; +} +output; + +set PC 0, +set RAM[0] 3, +set RAM[1] 1; +repeat 120 { + ticktock; +} +output; + +set PC 0, +set RAM[0] 2, +set RAM[1] 4; +repeat 150 { + ticktock; +} +output; + +set PC 0, +set RAM[0] 6, +set RAM[1] 7; +repeat 210 { + ticktock; +} +output; \ No newline at end of file diff --git a/web-ide-main/projects/src/samples/asm.ts b/web-ide-main/projects/src/samples/asm.ts new file mode 100644 index 0000000..52851d4 --- /dev/null +++ b/web-ide-main/projects/src/samples/asm.ts @@ -0,0 +1,276 @@ +export const Fill = `// Runs an infinite loop that listens to the keyboard input. +// When a key is pressed (any key), the program blackens the screen, +// i.e. writes "black" in every pixel. When no key is pressed, +// the screen should be cleared. + +// initialize variables +(START) // while (true) + @SCREEN + D=A + @i + M=D // i = SCREEN + +(LOOP) // while (i < screen - 1) + @i + D=M + @24575 // screen - 1 + D=A-D + @START + D;JLT // i < screen - 1 (negative check) + @KBD + D=M + @BLACKEN // if (kbd != 0) + D;JNE + +// Clear the screen (write "white" in every pixel) + @i + D=M + A=D + M=0 // write "white" + @CONTINUE + 0;JMP + +(BLACKEN) + @i + D=M + A=D + M=-1 // write "black" + +(CONTINUE) + @i + M=M+1 // i++ + @LOOP + 0;JMP + `; + +export const FillAlt1 = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/04/Fill.asm + +// This version uses two similar loops to fill the screen either with +// black or white. Each loop always starts filling the screen from +// the top. The press or release of a key flips between the two loops. +// +// The advantage of this program over the single loop program is that +// it is much more responsive to changes in key state. One can watch +// it working even when the CPU simulator is running with animation. + +(FILL_WHITE) + @SCREEN + D=A + @pScreen + M=D // pScreen = pointer to SCREEN + +(WHITE_LOOP) + @KBD // if key down fill screen with black + D=M + @FILL_BLACK + D;JNE + @pScreen // Memory[pScreen] = black (0) + A=M + M=0 + + @pScreen // pScreen = pScreen + 1 + MD=M+1 + + @24576 // SCREEN + size of screen + D=D-A + @WHITE_LOOP + D;JLT // loop if pScreen still within screen + + @FILL_WHITE // restart at beginning of screen + 0;JMP + + +(FILL_BLACK) + @SCREEN + D=A + @pScreen + M=D // pScreen = pointer to SCREEN + +(BLACK_LOOP) + @KBD // if key down fill screen with white + D=M + @FILL_WHITE + D;JEQ + @pScreen // Memory[pScreen] = white (-1) + A=M + M=-1 + + @pScreen // pScreen = pScreen + 1 + MD=M+1 + + @24576 // SCREEN + size of screen + D=D-A + @BLACK_LOOP + D;JLT // loop if pScreen still within screen + + @FILL_BLACK // restart at beginning of screen + 0;JMP +`; + +export const FillAlt2 = `// This version uses a single loop. When a key is down, the loop +// writes black and increments the screen pointer. When no key is +// down, it decrements the screen pointer and writes white. +// +// The advantages of this program over the original single loop program +// and the double loop program are that it is much more responsive to +// changes in key state and that it does not leave partially written +// black bands temporarily visible on the screen. (And it looks cool!) + + @SCREEN + D=A + @pScreen + M=D // pScreen = pointer to SCREEN + +(LOOP) + @KBD // if key down fill screen with black + D=M + @FILL_BLACK + D;JNE + // Roll back the darkness + @pScreen + D=M + @SCREEN // if pScreen <= SCREEN there is nothing to do + D=D-A + @LOOP + D;JLE + + @pScreen + AM=M-1 // A = pScreen = pScreen - 1 + M=0 // Memory[pScreen] = white (0) + + @LOOP + 0;JMP + +(FILL_BLACK) // Let darkness descend + @pScreen + D=M + @24576 // if pScreen >= SCREEN + size of screen, + D=D-A // there is nothing to do + @LOOP + D;JGE + + @pScreen // Memory[pScreen] = black (-1) + A=M + M=-1 + + @pScreen // pScreen = pScreen + 1 + M=M+1 + + @LOOP + 0;JMP +`; + +export const Mult = `// Multiplies R0 and R1 and stores the result in R2. +// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.) +// The algorithm is based on repetitive addition. + +// Initialize the variables + @sum + M=0 + @R0 + D=M + @i + M=D +(LOOP) + @i + MD=M-1 // decrement the counter + @FINISH + D;JLT + @R1 + D=M + @sum + M=D+M // tally the sum + @LOOP + 0;JMP +(FINISH) + @sum + D=M + @R2 + M=D +(END) + @END + 0;JMP`; + +export const MultAlt1 = `// Multiplies R0 and R1 and stores the result in R2. +// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.) +// The algorithm is based on repetitive addition. + + @R2 // Zero the partial product + M=0 + +(LOOP) + @R1 + MD=M-1 // Decrement and test the multiplier + @HALT + D;JLT + + @R0 // Add the multiplicand to the partial product + D=M + @R2 + M=D+M + @LOOP + 0;JMP + +(HALT) + @HALT + 0;JMP`; + +export const MultCmp = `| RAM[2] | +| 0 | +| 0 | +| 0 | +| 3 | +| 8 | +| 42 |`; + +export const MultTst = `output-list RAM[2]%D2.6.2; + +set RAM[0] 0, +set RAM[1] 0; +repeat 20 { + ticktock; +} +output; + +set PC 0, +set RAM[0] 1, +set RAM[1] 0; +repeat 50 { + ticktock; +} +output; + +set PC 0, +set RAM[0] 0, +set RAM[1] 2; +repeat 80 { + ticktock; +} +output; + +set PC 0, +set RAM[0] 3, +set RAM[1] 1; +repeat 120 { + ticktock; +} +output; + +set PC 0, +set RAM[0] 2, +set RAM[1] 4; +repeat 150 { + ticktock; +} +output; + +set PC 0, +set RAM[0] 6, +set RAM[1] 7; +repeat 210 { + ticktock; +} +output;`; diff --git a/web-ide-main/projects/src/samples/hack.ts b/web-ide-main/projects/src/samples/hack.ts new file mode 100644 index 0000000..2fb1653 --- /dev/null +++ b/web-ide-main/projects/src/samples/hack.ts @@ -0,0 +1,52 @@ +export const Add = ` +0000000000000010 +1110110000010000 +0000000000000011 +1110000010010000 +0000000000000000 +1110001100001000`; + +export const Max = ` +0000000000000000 +1111110000010000 +0000000000000001 +1111010011010000 +0000000000001010 +1110001100000001 +0000000000000001 +1111110000010000 +0000000000001100 +1110101010000111 +0000000000000000 +1111110000010000 +0000000000000010 +1110001100001000 +0000000000001110 +1110101010000111`; + +export const Rect = ` +0000000000000000 +1111110000010000 +0000000000010111 +1110001100000110 +0000000000010000 +1110001100001000 +0100000000000000 +1110110000010000 +0000000000010001 +1110001100001000 +0000000000010001 +1111110000100000 +1110111010001000 +0000000000010001 +1111110000010000 +0000000000100000 +1110000010010000 +0000000000010001 +1110001100001000 +0000000000010000 +1111110010011000 +0000000000001010 +1110001100000001 +0000000000010111 +1110101010000111`; diff --git a/web-ide-main/projects/src/samples/hack/Fill.asm b/web-ide-main/projects/src/samples/hack/Fill.asm new file mode 100644 index 0000000..75e6205 --- /dev/null +++ b/web-ide-main/projects/src/samples/hack/Fill.asm @@ -0,0 +1,43 @@ +// Runs an infinite loop that listens to the keyboard input. +// When a key is pressed (any key), the program blackens the screen, +// i.e. writes "black" in every pixel. When no key is pressed, +// the screen should be cleared. + +// initialize variables +(START) // while (true) + @SCREEN + D=A + @i + M=D // i = SCREEN + +(LOOP) // while (i < screen - 1) + @i + D=M + @24575 // screen - 1 + D=A-D + @START + D;JLT // i < screen - 1 (negative check) + @KBD + D=M + @BLACKEN // if (kbd != 0) + D;JNE + +// Clear the screen (write "white" in every pixel) + @i + D=M + A=D + M=0 // write "white" + @CONTINUE + 0;JMP + +(BLACKEN) + @i + D=M + A=D + M=-1 // write "black" + +(CONTINUE) + @i + M=M+1 // i++ + @LOOP + 0;JMP \ No newline at end of file diff --git a/web-ide-main/projects/src/samples/hack/FillAlt1.asm b/web-ide-main/projects/src/samples/hack/FillAlt1.asm new file mode 100644 index 0000000..b493ffb --- /dev/null +++ b/web-ide-main/projects/src/samples/hack/FillAlt1.asm @@ -0,0 +1,65 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/04/Fill.asm + +// This version uses two similar loops to fill the screen either with +// black or white. Each loop always starts filling the screen from +// the top. The press or release of a key flips between the two loops. +// +// The advantage of this program over the single loop program is that +// it is much more responsive to changes in key state. One can watch +// it working even when the CPU simulator is running with animation. + +(FILL_WHITE) + @SCREEN + D=A + @pScreen + M=D // pScreen = pointer to SCREEN + +(WHITE_LOOP) + @KBD // if key down fill screen with black + D=M + @FILL_BLACK + D;JNE + @pScreen // Memory[pScreen] = black (0) + A=M + M=0 + + @pScreen // pScreen = pScreen + 1 + MD=M+1 + + @24576 // SCREEN + size of screen + D=D-A + @WHITE_LOOP + D;JLT // loop if pScreen still within screen + + @FILL_WHITE // restart at beginning of screen + 0;JMP + + +(FILL_BLACK) + @SCREEN + D=A + @pScreen + M=D // pScreen = pointer to SCREEN + +(BLACK_LOOP) + @KBD // if key down fill screen with white + D=M + @FILL_WHITE + D;JEQ + @pScreen // Memory[pScreen] = white (-1) + A=M + M=-1 + + @pScreen // pScreen = pScreen + 1 + MD=M+1 + + @24576 // SCREEN + size of screen + D=D-A + @BLACK_LOOP + D;JLT // loop if pScreen still within screen + + @FILL_BLACK // restart at beginning of screen + 0;JMP \ No newline at end of file diff --git a/web-ide-main/projects/src/samples/hack/FillAlt2.asm b/web-ide-main/projects/src/samples/hack/FillAlt2.asm new file mode 100644 index 0000000..d151133 --- /dev/null +++ b/web-ide-main/projects/src/samples/hack/FillAlt2.asm @@ -0,0 +1,83 @@ +// This version uses a single loop. When a key is down, the loop +// writes black and increments the screen pointer. When no key is +// down, it decrements the screen pointer and writes white. +// +// The advantages of this program over the original single loop program +// and the double loop program are that it is much more responsive to +// changes in key state and that it does not leave partially written +// black bands temporarily visible on the screen. (And it looks cool!) + + @SCREEN + D=A + @pScreen + M=D // pScreen = pointer to SCREEN + +(LOOP) + @KBD // if key down fill screen with black + D=M + @FILL_BLACK + D;JNE + // Roll back the darkness + @pScreen + D=M + @SCREEN // if pScreen <= SCREEN there is nothing to do + D=D-A + @LOOP + D;JLE + + @pScreen + AM=M-1 // A = pScreen = pScreen - 1 + M=0 // Memory[pScreen] = white (0) + + @LOOP + 0;JMP + +(FILL_BLACK) // Let darkness descend + @pScreen + D=M + @24576 // if pScreen >= SCREEN + size of screen, + D=D-A // there is nothing to do + @LOOP + D;JGE + + @pScreen // Memory[pScreen] = black (-1) + A=M + M=-1 + + @pScreen // pScreen = pScreen + 1 + M=M+1 + + @LOOP + 0;JMP +`; + +export const Mult = `// Multiplies R0 and R1 and stores the result in R2. +// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.) +// The algorithm is based on repetitive addition. + +// Initialize the variables + @sum + M=0 + @R0 + D=M + @i + M=D +(LOOP) + @i + MD=M-1 // decrement the counter + @FINISH + D;JLT + @R1 + D=M + @sum + M=D+M // tally the sum + @LOOP + 0;JMP +(FINISH) + @sum + D=M + @R2 + M=D +(END) + @END + 0;JMP \ No newline at end of file diff --git a/web-ide-main/projects/src/samples/hack/Life.asm b/web-ide-main/projects/src/samples/hack/Life.asm new file mode 100644 index 0000000..e69de29 diff --git a/web-ide-main/projects/src/samples/hack/Life.hack b/web-ide-main/projects/src/samples/hack/Life.hack new file mode 100644 index 0000000..e6bc1b5 --- /dev/null +++ b/web-ide-main/projects/src/samples/hack/Life.hack @@ -0,0 +1,7099 @@ +0000101011101011 +1110101010000111 +0100000000000000 +1110110010010000 +0000000000000000 +1110001100001000 +0000000000010001 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110010001000 +0010001010101111 +1110110000010000 +0000100101110110 +1110101010000111 +0110000000000000 +1111110000010000 +0000000001110101 +1110001100001000 +0000000110010001 +1110001100000101 +0110000000000000 +1111110000010000 +0000000001110101 +1110001100000101 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +1110001100010000 +0000000000010011 +1111110010011000 +0000000000010111 +1110001100000101 +0000000000010100 +1111110000010000 +0000000000010011 +1110001100001000 +0000000000010001 +1111110000110000 +1110000010110000 +1110000010110000 +1110000010110000 +1110000010110000 +1110000010110000 +1110000010110000 +1110000010110000 +0100000000100000 +1110000010010000 +0010011010101111 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000010000 +1111000000010000 +0000000011100111 +1110000010100000 +1111110000010000 +0010011010110000 +1110001100001000 +0000000000010000 +1111110000010000 +0000000001100111 +1110000010100000 +1111110000010000 +0010011010101111 +1111000010101000 +1111110000010000 +0010011010110001 +1110001100001000 +0010011010110000 +1111010101010000 +0010011010110010 +1110001100001000 +0010011010110001 +1111110000010000 +0010011010110000 +1111000000010000 +1110001101010000 +0010011010110010 +1111000000010000 +0010011010110011 +1110001100001000 +0010011010101111 +1111110000100000 +1110001100001000 +0010011010101111 +1111110000010000 +0000000000100000 +1110000010010000 +0010011010101111 +1110001100001000 +0010011010110011 +1111110000010000 +0010011010101111 +1111110000100000 +1110001100001000 +0000000000010111 +1110101010000111 +0010011010110100 +1110001100001000 +0010011010110100 +1111110000010000 +0000000010000011 +1110010011010000 +0000000100101010 +1110001100000010 +0010011010110100 +1111110000010000 +0000000010000101 +1110010011010000 +0000000100110110 +1110001100000010 +0010011010110100 +1111110000010000 +0000000010000100 +1110010011010000 +0000000101001110 +1110001100000010 +0010011010110100 +1111110000010000 +0000000010000010 +1110010011010000 +0000000101000010 +1110001100000010 +0010011010110100 +1111110000010000 +0000000001010111 +1110010011010000 +0000000100101010 +1110001100000010 +0010011010110100 +1111110000010000 +0000000001011000 +1110010011010000 +0000000100110110 +1110001100000010 +0010011010110100 +1111110000010000 +0000000001000100 +1110010011010000 +0000000101001110 +1110001100000010 +0010011010110100 +1111110000010000 +0000000001000001 +1110010011010000 +0000000101000010 +1110001100000010 +0010011010110100 +1111110000010000 +0000000001010001 +1110010011010000 +0000000100100101 +1110001100000010 +0010011010110100 +1111110000010000 +0000000001000101 +1110010011010000 +0000000101001001 +1110001100000010 +0010011010110100 +1111110000010000 +0000000001011010 +1110010011010000 +0000000100111101 +1110001100000010 +0010011010110100 +1111110000010000 +0000000001000011 +1110010011010000 +0000000100110001 +1110001100000010 +0010011010110100 +1111110000010000 +0000000000100000 +1110010011010000 +0000000100010001 +1110001100000010 +0010011010110100 +1111110000010000 +0000000010000000 +1110010011010000 +0000000101101111 +1110001100000010 +0010011010110100 +1111110000010000 +0000000010000001 +1110010011010000 +0000000100011100 +1110001100000010 +0010011010110100 +1111110000010000 +0000000001100000 +1110010011010000 +0000000101010101 +1110001100000010 +0010011010110100 +1111110000010000 +0000000001010011 +1110010011010000 +0000000101010101 +1110001100000010 +0000000110010001 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110010001000 +0010011010110100 +1111110000010000 +0000000000110000 +1110010011010000 +0000000100001001 +1110001100000010 +1110001110010000 +0000000100001101 +1110001100000010 +1110001110010000 +0010011010110101 +1110001100000010 +1110001110010000 +0000000100000101 +1110001100000010 +1110001110010000 +0000000100000101 +1110001100000010 +1110001110010000 +0000000100000101 +1110001100000010 +1110001110010000 +0000000100000101 +1110001100000010 +1110001110010000 +0000000100000101 +1110001100000010 +1110001110010000 +0000000100000101 +1110001100000010 +1110001110010000 +0000000100000101 +1110001100000010 +0000000000000000 +1111110111001000 +0000000110010001 +1110101010000111 +0010011010110110 +1110110000010000 +0000100101110110 +1110101010000111 +0010010010101111 +1110110000010000 +0000100101110110 +1110101010000111 +0000000100011010 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110010001000 +0000000110011011 +1110101010000111 +0000000110010001 +1110101010000111 +0000000110001000 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110010001000 +0000100111010000 +1110101010000111 +0000000001111111 +1110110000010000 +0000000000010000 +1111110010001000 +1111000000001000 +0000000000111111 +1110110000010000 +0000000000010001 +1111110010001000 +1111000000001000 +0000000110001000 +1110101010000111 +0000000001111111 +1110110000010000 +0000000000010000 +1111110111001000 +1111000000001000 +0000000000111111 +1110110000010000 +0000000000010001 +1111110111001000 +1111000000001000 +0000000110001000 +1110101010000111 +0000000000111111 +1110110000010000 +0000000000010001 +1111110111001000 +1111000000001000 +0000000001111111 +1110110000010000 +0000000000010000 +1111110010001000 +1111000000001000 +0000000110001000 +1110101010000111 +0000000000111111 +1110110000010000 +0000000000010001 +1111110010001000 +1111000000001000 +0000000001111111 +1110110000010000 +0000000000010000 +1111110111001000 +1111000000001000 +0000000110001000 +1110101010000111 +0000000000010001 +1111110000010000 +0000000011101011 +1110000010100000 +1111110000010000 +0000000000010000 +1111000010010000 +0010011010110111 +1110001100101000 +1111110000010000 +0000000101100111 +1110001100000010 +1110101010010000 +0010011010110111 +1111110000100000 +1110001100001000 +0000000110001000 +1110101010000111 +0100000000000000 +1110110000010000 +1110000010010000 +0010011010110111 +1111110000100000 +1110001100001000 +0000000110001000 +1110101010000111 +0000000101111000 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110010001000 +0000000110011011 +1110101010000111 +0110000000000000 +1111110000010000 +0010011010110100 +1111010011010000 +0000000101101111 +1110001100000010 +0010011010110100 +1110101010001000 +0110000000000000 +1111110000010000 +0000000101101111 +1110001100000010 +0010011010110100 +1110001100001000 +0000000110010001 +1110101010000111 +0000000110010001 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110010001000 +0000100111100110 +1110101010000111 +0010011010110100 +1111110000010000 +0110000000000000 +1111010011010000 +0000000110010001 +1110001100000010 +0000000000010111 +1110101010000111 +0000000110011010 +1110101010000111 +0000000110101110 +1110110000010000 +0010011010111000 +1110001100001000 +0010011010111000 +1111110000100000 +1111110000010000 +0000000110111100 +1110001100000011 +0010011010111000 +1111110000010000 +0000000010000011 +1110010011100000 +1111110111001000 +1110110111100000 +1111110111001000 +1110110111100000 +1111110111001000 +1110110000010000 +0000000010000000 +1110000010100000 +1111110111001000 +1110110111100000 +1110110111100000 +1111110111001000 +1110110000010000 +0000000010000000 +1110000010100000 +1111110111001000 +1110110111100000 +1111110111001000 +1110110111100000 +1111110111001000 +0010011010111000 +1111110111011000 +0010001000101100 +1110010011010000 +0000000110011111 +1110001100000101 +0000000100101011 +1111110000010000 +1110101010001000 +0010001000101011 +1111000010001000 +0000000101101100 +1111110000010000 +1110101010001000 +0010000110101100 +1111000010001000 +0010001000101101 +1111110000010000 +1110101010001000 +0000001000101101 +1111000010001000 +0010001010101110 +1111110000010000 +1110101010001000 +0000000110101110 +1111000010001000 +0000000100101100 +1111110000010000 +1110101010001000 +0010000110101100 +1111000010001000 +0010001000101110 +1111110000010000 +1110101010001000 +0000000110101110 +1111000010001000 +0000000100101101 +1111110000010000 +1110101010001000 +0010000110101101 +1111000010001000 +0010001000101111 +1111110000010000 +1110101010001000 +0000000110101111 +1111000010001000 +0000000100101110 +1111110000010000 +1110101010001000 +0010000110101110 +1111000010001000 +0010001000110000 +1111110000010000 +1110101010001000 +0000000110110000 +1111000010001000 +0000000100101111 +1111110000010000 +1110101010001000 +0010000110101111 +1111000010001000 +0010001000110001 +1111110000010000 +1110101010001000 +0000000110110001 +1111000010001000 +0000000100110000 +1111110000010000 +1110101010001000 +0010000110110000 +1111000010001000 +0010001000110010 +1111110000010000 +1110101010001000 +0000000110110010 +1111000010001000 +0000000100110001 +1111110000010000 +1110101010001000 +0010000110110001 +1111000010001000 +0010001000110011 +1111110000010000 +1110101010001000 +0000000110110011 +1111000010001000 +0000000100110010 +1111110000010000 +1110101010001000 +0010000110110010 +1111000010001000 +0010001000110100 +1111110000010000 +1110101010001000 +0000000110110100 +1111000010001000 +0000000100110011 +1111110000010000 +1110101010001000 +0010000110110011 +1111000010001000 +0010001000110101 +1111110000010000 +1110101010001000 +0000000110110101 +1111000010001000 +0000000100110100 +1111110000010000 +1110101010001000 +0010000110110100 +1111000010001000 +0010001000110110 +1111110000010000 +1110101010001000 +0000000110110110 +1111000010001000 +0000000100110101 +1111110000010000 +1110101010001000 +0010000110110101 +1111000010001000 +0010001000110111 +1111110000010000 +1110101010001000 +0000000110110111 +1111000010001000 +0000000100110110 +1111110000010000 +1110101010001000 +0010000110110110 +1111000010001000 +0010001000111000 +1111110000010000 +1110101010001000 +0000000110111000 +1111000010001000 +0000000100110111 +1111110000010000 +1110101010001000 +0010000110110111 +1111000010001000 +0010001000111001 +1111110000010000 +1110101010001000 +0000000110111001 +1111000010001000 +0000000100111000 +1111110000010000 +1110101010001000 +0010000110111000 +1111000010001000 +0010001000111010 +1111110000010000 +1110101010001000 +0000000110111010 +1111000010001000 +0000000100111001 +1111110000010000 +1110101010001000 +0010000110111001 +1111000010001000 +0010001000111011 +1111110000010000 +1110101010001000 +0000000110111011 +1111000010001000 +0000000100111010 +1111110000010000 +1110101010001000 +0010000110111010 +1111000010001000 +0010001000111100 +1111110000010000 +1110101010001000 +0000000110111100 +1111000010001000 +0000000100111011 +1111110000010000 +1110101010001000 +0010000110111011 +1111000010001000 +0010001000111101 +1111110000010000 +1110101010001000 +0000000110111101 +1111000010001000 +0000000100111100 +1111110000010000 +1110101010001000 +0010000110111100 +1111000010001000 +0010001000111110 +1111110000010000 +1110101010001000 +0000000110111110 +1111000010001000 +0000000100111101 +1111110000010000 +1110101010001000 +0010000110111101 +1111000010001000 +0010001000111111 +1111110000010000 +1110101010001000 +0000000110111111 +1111000010001000 +0000000100111110 +1111110000010000 +1110101010001000 +0010000110111110 +1111000010001000 +0010001001000000 +1111110000010000 +1110101010001000 +0000000111000000 +1111000010001000 +0000000100111111 +1111110000010000 +1110101010001000 +0010000110111111 +1111000010001000 +0010001001000001 +1111110000010000 +1110101010001000 +0000000111000001 +1111000010001000 +0000000101000000 +1111110000010000 +1110101010001000 +0010000111000000 +1111000010001000 +0010001001000010 +1111110000010000 +1110101010001000 +0000000111000010 +1111000010001000 +0000000101000001 +1111110000010000 +1110101010001000 +0010000111000001 +1111000010001000 +0010001001000011 +1111110000010000 +1110101010001000 +0000000111000011 +1111000010001000 +0000000101000010 +1111110000010000 +1110101010001000 +0010000111000010 +1111000010001000 +0010001001000100 +1111110000010000 +1110101010001000 +0000000111000100 +1111000010001000 +0000000101000011 +1111110000010000 +1110101010001000 +0010000111000011 +1111000010001000 +0010001001000101 +1111110000010000 +1110101010001000 +0000000111000101 +1111000010001000 +0000000101000100 +1111110000010000 +1110101010001000 +0010000111000100 +1111000010001000 +0010001001000110 +1111110000010000 +1110101010001000 +0000000111000110 +1111000010001000 +0000000101000101 +1111110000010000 +1110101010001000 +0010000111000101 +1111000010001000 +0010001001000111 +1111110000010000 +1110101010001000 +0000000111000111 +1111000010001000 +0000000101000110 +1111110000010000 +1110101010001000 +0010000111000110 +1111000010001000 +0010001001001000 +1111110000010000 +1110101010001000 +0000000111001000 +1111000010001000 +0000000101000111 +1111110000010000 +1110101010001000 +0010000111000111 +1111000010001000 +0010001001001001 +1111110000010000 +1110101010001000 +0000000111001001 +1111000010001000 +0000000101001000 +1111110000010000 +1110101010001000 +0010000111001000 +1111000010001000 +0010001001001010 +1111110000010000 +1110101010001000 +0000000111001010 +1111000010001000 +0000000101001001 +1111110000010000 +1110101010001000 +0010000111001001 +1111000010001000 +0010001001001011 +1111110000010000 +1110101010001000 +0000000111001011 +1111000010001000 +0000000101001010 +1111110000010000 +1110101010001000 +0010000111001010 +1111000010001000 +0010001001001100 +1111110000010000 +1110101010001000 +0000000111001100 +1111000010001000 +0000000101001011 +1111110000010000 +1110101010001000 +0010000111001011 +1111000010001000 +0010001001001101 +1111110000010000 +1110101010001000 +0000000111001101 +1111000010001000 +0000000101001100 +1111110000010000 +1110101010001000 +0010000111001100 +1111000010001000 +0010001001001110 +1111110000010000 +1110101010001000 +0000000111001110 +1111000010001000 +0000000101001101 +1111110000010000 +1110101010001000 +0010000111001101 +1111000010001000 +0010001001001111 +1111110000010000 +1110101010001000 +0000000111001111 +1111000010001000 +0000000101001110 +1111110000010000 +1110101010001000 +0010000111001110 +1111000010001000 +0010001001010000 +1111110000010000 +1110101010001000 +0000000111010000 +1111000010001000 +0000000101001111 +1111110000010000 +1110101010001000 +0010000111001111 +1111000010001000 +0010001001010001 +1111110000010000 +1110101010001000 +0000000111010001 +1111000010001000 +0000000101010000 +1111110000010000 +1110101010001000 +0010000111010000 +1111000010001000 +0010001001010010 +1111110000010000 +1110101010001000 +0000000111010010 +1111000010001000 +0000000101010001 +1111110000010000 +1110101010001000 +0010000111010001 +1111000010001000 +0010001001010011 +1111110000010000 +1110101010001000 +0000000111010011 +1111000010001000 +0000000101010010 +1111110000010000 +1110101010001000 +0010000111010010 +1111000010001000 +0010001001010100 +1111110000010000 +1110101010001000 +0000000111010100 +1111000010001000 +0000000101010011 +1111110000010000 +1110101010001000 +0010000111010011 +1111000010001000 +0010001001010101 +1111110000010000 +1110101010001000 +0000000111010101 +1111000010001000 +0000000101010100 +1111110000010000 +1110101010001000 +0010000111010100 +1111000010001000 +0010001001010110 +1111110000010000 +1110101010001000 +0000000111010110 +1111000010001000 +0000000101010101 +1111110000010000 +1110101010001000 +0010000111010101 +1111000010001000 +0010001001010111 +1111110000010000 +1110101010001000 +0000000111010111 +1111000010001000 +0000000101010110 +1111110000010000 +1110101010001000 +0010000111010110 +1111000010001000 +0010001001011000 +1111110000010000 +1110101010001000 +0000000111011000 +1111000010001000 +0000000101010111 +1111110000010000 +1110101010001000 +0010000111010111 +1111000010001000 +0010001001011001 +1111110000010000 +1110101010001000 +0000000111011001 +1111000010001000 +0000000101011000 +1111110000010000 +1110101010001000 +0010000111011000 +1111000010001000 +0010001001011010 +1111110000010000 +1110101010001000 +0000000111011010 +1111000010001000 +0000000101011001 +1111110000010000 +1110101010001000 +0010000111011001 +1111000010001000 +0010001001011011 +1111110000010000 +1110101010001000 +0000000111011011 +1111000010001000 +0000000101011010 +1111110000010000 +1110101010001000 +0010000111011010 +1111000010001000 +0010001001011100 +1111110000010000 +1110101010001000 +0000000111011100 +1111000010001000 +0000000101011011 +1111110000010000 +1110101010001000 +0010000111011011 +1111000010001000 +0010001001011101 +1111110000010000 +1110101010001000 +0000000111011101 +1111000010001000 +0000000101011100 +1111110000010000 +1110101010001000 +0010000111011100 +1111000010001000 +0010001001011110 +1111110000010000 +1110101010001000 +0000000111011110 +1111000010001000 +0000000101011101 +1111110000010000 +1110101010001000 +0010000111011101 +1111000010001000 +0010001001011111 +1111110000010000 +1110101010001000 +0000000111011111 +1111000010001000 +0000000101011110 +1111110000010000 +1110101010001000 +0010000111011110 +1111000010001000 +0010001001100000 +1111110000010000 +1110101010001000 +0000000111100000 +1111000010001000 +0000000101011111 +1111110000010000 +1110101010001000 +0010000111011111 +1111000010001000 +0010001001100001 +1111110000010000 +1110101010001000 +0000000111100001 +1111000010001000 +0000000101100000 +1111110000010000 +1110101010001000 +0010000111100000 +1111000010001000 +0010001001100010 +1111110000010000 +1110101010001000 +0000000111100010 +1111000010001000 +0000000101100001 +1111110000010000 +1110101010001000 +0010000111100001 +1111000010001000 +0010001001100011 +1111110000010000 +1110101010001000 +0000000111100011 +1111000010001000 +0000000101100010 +1111110000010000 +1110101010001000 +0010000111100010 +1111000010001000 +0010001001100100 +1111110000010000 +1110101010001000 +0000000111100100 +1111000010001000 +0000000101100011 +1111110000010000 +1110101010001000 +0010000111100011 +1111000010001000 +0010001001100101 +1111110000010000 +1110101010001000 +0000000111100101 +1111000010001000 +0000000101100100 +1111110000010000 +1110101010001000 +0010000111100100 +1111000010001000 +0010001001100110 +1111110000010000 +1110101010001000 +0000000111100110 +1111000010001000 +0000000101100101 +1111110000010000 +1110101010001000 +0010000111100101 +1111000010001000 +0010001001100111 +1111110000010000 +1110101010001000 +0000000111100111 +1111000010001000 +0000000101100110 +1111110000010000 +1110101010001000 +0010000111100110 +1111000010001000 +0010001001101000 +1111110000010000 +1110101010001000 +0000000111101000 +1111000010001000 +0000000101100111 +1111110000010000 +1110101010001000 +0010000111100111 +1111000010001000 +0010001001101001 +1111110000010000 +1110101010001000 +0000000111101001 +1111000010001000 +0000000101101000 +1111110000010000 +1110101010001000 +0010000111101000 +1111000010001000 +0010001001101010 +1111110000010000 +1110101010001000 +0000000111101010 +1111000010001000 +0000000101101001 +1111110000010000 +1110101010001000 +0010000111101001 +1111000010001000 +0010001001101011 +1111110000010000 +1110101010001000 +0000000111101011 +1111000010001000 +0000000101101010 +1111110000010000 +1110101010001000 +0010000111101010 +1111000010001000 +0010001001101100 +1111110000010000 +1110101010001000 +0000000111101100 +1111000010001000 +0000000101101011 +1111110000010000 +1110101010001000 +0010000111101011 +1111000010001000 +0010001001101101 +1111110000010000 +1110101010001000 +0000000111101101 +1111000010001000 +0000000101101100 +1111110000010000 +1110101010001000 +0010000111101100 +1111000010001000 +0010001001101110 +1111110000010000 +1110101010001000 +0000000111101110 +1111000010001000 +0000000101101101 +1111110000010000 +1110101010001000 +0010000111101101 +1111000010001000 +0010001001101111 +1111110000010000 +1110101010001000 +0000000111101111 +1111000010001000 +0000000101101110 +1111110000010000 +1110101010001000 +0010000111101110 +1111000010001000 +0010001001110000 +1111110000010000 +1110101010001000 +0000000111110000 +1111000010001000 +0000000101101111 +1111110000010000 +1110101010001000 +0010000111101111 +1111000010001000 +0010001001110001 +1111110000010000 +1110101010001000 +0000000111110001 +1111000010001000 +0000000101110000 +1111110000010000 +1110101010001000 +0010000111110000 +1111000010001000 +0010001001110010 +1111110000010000 +1110101010001000 +0000000111110010 +1111000010001000 +0000000101110001 +1111110000010000 +1110101010001000 +0010000111110001 +1111000010001000 +0010001001110011 +1111110000010000 +1110101010001000 +0000000111110011 +1111000010001000 +0000000101110010 +1111110000010000 +1110101010001000 +0010000111110010 +1111000010001000 +0010001001110100 +1111110000010000 +1110101010001000 +0000000111110100 +1111000010001000 +0000000101110011 +1111110000010000 +1110101010001000 +0010000111110011 +1111000010001000 +0010001001110101 +1111110000010000 +1110101010001000 +0000000111110101 +1111000010001000 +0000000101110100 +1111110000010000 +1110101010001000 +0010000111110100 +1111000010001000 +0010001001110110 +1111110000010000 +1110101010001000 +0000000111110110 +1111000010001000 +0000000101110101 +1111110000010000 +1110101010001000 +0010000111110101 +1111000010001000 +0010001001110111 +1111110000010000 +1110101010001000 +0000000111110111 +1111000010001000 +0000000101110110 +1111110000010000 +1110101010001000 +0010000111110110 +1111000010001000 +0010001001111000 +1111110000010000 +1110101010001000 +0000000111111000 +1111000010001000 +0000000101110111 +1111110000010000 +1110101010001000 +0010000111110111 +1111000010001000 +0010001001111001 +1111110000010000 +1110101010001000 +0000000111111001 +1111000010001000 +0000000101111000 +1111110000010000 +1110101010001000 +0010000111111000 +1111000010001000 +0010001001111010 +1111110000010000 +1110101010001000 +0000000111111010 +1111000010001000 +0000000101111001 +1111110000010000 +1110101010001000 +0010000111111001 +1111000010001000 +0010001001111011 +1111110000010000 +1110101010001000 +0000000111111011 +1111000010001000 +0000000101111010 +1111110000010000 +1110101010001000 +0010000111111010 +1111000010001000 +0010001001111100 +1111110000010000 +1110101010001000 +0000000111111100 +1111000010001000 +0000000101111011 +1111110000010000 +1110101010001000 +0010000111111011 +1111000010001000 +0010001001111101 +1111110000010000 +1110101010001000 +0000000111111101 +1111000010001000 +0000000101111100 +1111110000010000 +1110101010001000 +0010000111111100 +1111000010001000 +0010001001111110 +1111110000010000 +1110101010001000 +0000000111111110 +1111000010001000 +0000000101111101 +1111110000010000 +1110101010001000 +0010000111111101 +1111000010001000 +0010001001111111 +1111110000010000 +1110101010001000 +0000000111111111 +1111000010001000 +0000000101111110 +1111110000010000 +1110101010001000 +0010000111111110 +1111000010001000 +0010001010000000 +1111110000010000 +1110101010001000 +0000001000000000 +1111000010001000 +0000000101111111 +1111110000010000 +1110101010001000 +0010000111111111 +1111000010001000 +0010001010000001 +1111110000010000 +1110101010001000 +0000001000000001 +1111000010001000 +0000000110000000 +1111110000010000 +1110101010001000 +0010001000000000 +1111000010001000 +0010001010000010 +1111110000010000 +1110101010001000 +0000001000000010 +1111000010001000 +0000000110000001 +1111110000010000 +1110101010001000 +0010001000000001 +1111000010001000 +0010001010000011 +1111110000010000 +1110101010001000 +0000001000000011 +1111000010001000 +0000000110000010 +1111110000010000 +1110101010001000 +0010001000000010 +1111000010001000 +0010001010000100 +1111110000010000 +1110101010001000 +0000001000000100 +1111000010001000 +0000000110000011 +1111110000010000 +1110101010001000 +0010001000000011 +1111000010001000 +0010001010000101 +1111110000010000 +1110101010001000 +0000001000000101 +1111000010001000 +0000000110000100 +1111110000010000 +1110101010001000 +0010001000000100 +1111000010001000 +0010001010000110 +1111110000010000 +1110101010001000 +0000001000000110 +1111000010001000 +0000000110000101 +1111110000010000 +1110101010001000 +0010001000000101 +1111000010001000 +0010001010000111 +1111110000010000 +1110101010001000 +0000001000000111 +1111000010001000 +0000000110000110 +1111110000010000 +1110101010001000 +0010001000000110 +1111000010001000 +0010001010001000 +1111110000010000 +1110101010001000 +0000001000001000 +1111000010001000 +0000000110000111 +1111110000010000 +1110101010001000 +0010001000000111 +1111000010001000 +0010001010001001 +1111110000010000 +1110101010001000 +0000001000001001 +1111000010001000 +0000000110001000 +1111110000010000 +1110101010001000 +0010001000001000 +1111000010001000 +0010001010001010 +1111110000010000 +1110101010001000 +0000001000001010 +1111000010001000 +0000000110001001 +1111110000010000 +1110101010001000 +0010001000001001 +1111000010001000 +0010001010001011 +1111110000010000 +1110101010001000 +0000001000001011 +1111000010001000 +0000000110001010 +1111110000010000 +1110101010001000 +0010001000001010 +1111000010001000 +0010001010001100 +1111110000010000 +1110101010001000 +0000001000001100 +1111000010001000 +0000000110001011 +1111110000010000 +1110101010001000 +0010001000001011 +1111000010001000 +0010001010001101 +1111110000010000 +1110101010001000 +0000001000001101 +1111000010001000 +0000000110001100 +1111110000010000 +1110101010001000 +0010001000001100 +1111000010001000 +0010001010001110 +1111110000010000 +1110101010001000 +0000001000001110 +1111000010001000 +0000000110001101 +1111110000010000 +1110101010001000 +0010001000001101 +1111000010001000 +0010001010001111 +1111110000010000 +1110101010001000 +0000001000001111 +1111000010001000 +0000000110001110 +1111110000010000 +1110101010001000 +0010001000001110 +1111000010001000 +0010001010010000 +1111110000010000 +1110101010001000 +0000001000010000 +1111000010001000 +0000000110001111 +1111110000010000 +1110101010001000 +0010001000001111 +1111000010001000 +0010001010010001 +1111110000010000 +1110101010001000 +0000001000010001 +1111000010001000 +0000000110010000 +1111110000010000 +1110101010001000 +0010001000010000 +1111000010001000 +0010001010010010 +1111110000010000 +1110101010001000 +0000001000010010 +1111000010001000 +0000000110010001 +1111110000010000 +1110101010001000 +0010001000010001 +1111000010001000 +0010001010010011 +1111110000010000 +1110101010001000 +0000001000010011 +1111000010001000 +0000000110010010 +1111110000010000 +1110101010001000 +0010001000010010 +1111000010001000 +0010001010010100 +1111110000010000 +1110101010001000 +0000001000010100 +1111000010001000 +0000000110010011 +1111110000010000 +1110101010001000 +0010001000010011 +1111000010001000 +0010001010010101 +1111110000010000 +1110101010001000 +0000001000010101 +1111000010001000 +0000000110010100 +1111110000010000 +1110101010001000 +0010001000010100 +1111000010001000 +0010001010010110 +1111110000010000 +1110101010001000 +0000001000010110 +1111000010001000 +0000000110010101 +1111110000010000 +1110101010001000 +0010001000010101 +1111000010001000 +0010001010010111 +1111110000010000 +1110101010001000 +0000001000010111 +1111000010001000 +0000000110010110 +1111110000010000 +1110101010001000 +0010001000010110 +1111000010001000 +0010001010011000 +1111110000010000 +1110101010001000 +0000001000011000 +1111000010001000 +0000000110010111 +1111110000010000 +1110101010001000 +0010001000010111 +1111000010001000 +0010001010011001 +1111110000010000 +1110101010001000 +0000001000011001 +1111000010001000 +0000000110011000 +1111110000010000 +1110101010001000 +0010001000011000 +1111000010001000 +0010001010011010 +1111110000010000 +1110101010001000 +0000001000011010 +1111000010001000 +0000000110011001 +1111110000010000 +1110101010001000 +0010001000011001 +1111000010001000 +0010001010011011 +1111110000010000 +1110101010001000 +0000001000011011 +1111000010001000 +0000000110011010 +1111110000010000 +1110101010001000 +0010001000011010 +1111000010001000 +0010001010011100 +1111110000010000 +1110101010001000 +0000001000011100 +1111000010001000 +0000000110011011 +1111110000010000 +1110101010001000 +0010001000011011 +1111000010001000 +0010001010011101 +1111110000010000 +1110101010001000 +0000001000011101 +1111000010001000 +0000000110011100 +1111110000010000 +1110101010001000 +0010001000011100 +1111000010001000 +0010001010011110 +1111110000010000 +1110101010001000 +0000001000011110 +1111000010001000 +0000000110011101 +1111110000010000 +1110101010001000 +0010001000011101 +1111000010001000 +0010001010011111 +1111110000010000 +1110101010001000 +0000001000011111 +1111000010001000 +0000000110011110 +1111110000010000 +1110101010001000 +0010001000011110 +1111000010001000 +0010001010100000 +1111110000010000 +1110101010001000 +0000001000100000 +1111000010001000 +0000000110011111 +1111110000010000 +1110101010001000 +0010001000011111 +1111000010001000 +0010001010100001 +1111110000010000 +1110101010001000 +0000001000100001 +1111000010001000 +0000000110100000 +1111110000010000 +1110101010001000 +0010001000100000 +1111000010001000 +0010001010100010 +1111110000010000 +1110101010001000 +0000001000100010 +1111000010001000 +0000000110100001 +1111110000010000 +1110101010001000 +0010001000100001 +1111000010001000 +0010001010100011 +1111110000010000 +1110101010001000 +0000001000100011 +1111000010001000 +0000000110100010 +1111110000010000 +1110101010001000 +0010001000100010 +1111000010001000 +0010001010100100 +1111110000010000 +1110101010001000 +0000001000100100 +1111000010001000 +0000000110100011 +1111110000010000 +1110101010001000 +0010001000100011 +1111000010001000 +0010001010100101 +1111110000010000 +1110101010001000 +0000001000100101 +1111000010001000 +0000000110100100 +1111110000010000 +1110101010001000 +0010001000100100 +1111000010001000 +0010001010100110 +1111110000010000 +1110101010001000 +0000001000100110 +1111000010001000 +0000000110100101 +1111110000010000 +1110101010001000 +0010001000100101 +1111000010001000 +0010001010100111 +1111110000010000 +1110101010001000 +0000001000100111 +1111000010001000 +0000000110100110 +1111110000010000 +1110101010001000 +0010001000100110 +1111000010001000 +0010001010101000 +1111110000010000 +1110101010001000 +0000001000101000 +1111000010001000 +0000000110100111 +1111110000010000 +1110101010001000 +0010001000100111 +1111000010001000 +0010001010101001 +1111110000010000 +1110101010001000 +0000001000101001 +1111000010001000 +0000000110101000 +1111110000010000 +1110101010001000 +0010001000101000 +1111000010001000 +0010001010101010 +1111110000010000 +1110101010001000 +0000001000101010 +1111000010001000 +0000000110101001 +1111110000010000 +1110101010001000 +0010001000101001 +1111000010001000 +0010001010101011 +1111110000010000 +1110101010001000 +0000001000101011 +1111000010001000 +0000000110101010 +1111110000010000 +1110101010001000 +0010001000101010 +1111000010001000 +0010001010101100 +1111110000010000 +1110101010001000 +0000001000101100 +1111000010001000 +0000000110101011 +1111110000010000 +1110101010001000 +0010001000101011 +1111000010001000 +0010001010101101 +1111110000010000 +1110101010001000 +0000001000101101 +1111000010001000 +0000000110101101 +1111110000010000 +1110101010001000 +0000001000101101 +1111000010001000 +0000001000101110 +1111110000010000 +1110101010001000 +0000000110101110 +1111000010001000 +0000001000101111 +1111110000010000 +1110101010001000 +0000001010101111 +1111000010001000 +0000001010110000 +1111110000010000 +1110101010001000 +0000001000110000 +1111000010001000 +0000001010110001 +1111110000010000 +1110101010001000 +0000001100110001 +1111000010001000 +0000001100110010 +1111110000010000 +1110101010001000 +0000001010110010 +1111000010001000 +0000001100110011 +1111110000010000 +1110101010001000 +0000001110110011 +1111000010001000 +0000001110110100 +1111110000010000 +1110101010001000 +0000001100110100 +1111000010001000 +0000001110110101 +1111110000010000 +1110101010001000 +0000010000110101 +1111000010001000 +0000010000110110 +1111110000010000 +1110101010001000 +0000001110110110 +1111000010001000 +0000010000110111 +1111110000010000 +1110101010001000 +0000010010110111 +1111000010001000 +0000010010111000 +1111110000010000 +1110101010001000 +0000010000111000 +1111000010001000 +0000010010111001 +1111110000010000 +1110101010001000 +0000010100111001 +1111000010001000 +0000010100111010 +1111110000010000 +1110101010001000 +0000010010111010 +1111000010001000 +0000010100111011 +1111110000010000 +1110101010001000 +0000010110111011 +1111000010001000 +0000010110111100 +1111110000010000 +1110101010001000 +0000010100111100 +1111000010001000 +0000010110111101 +1111110000010000 +1110101010001000 +0000011000111101 +1111000010001000 +0000011000111110 +1111110000010000 +1110101010001000 +0000010110111110 +1111000010001000 +0000011000111111 +1111110000010000 +1110101010001000 +0000011010111111 +1111000010001000 +0000011011000000 +1111110000010000 +1110101010001000 +0000011001000000 +1111000010001000 +0000011011000001 +1111110000010000 +1110101010001000 +0000011101000001 +1111000010001000 +0000011101000010 +1111110000010000 +1110101010001000 +0000011011000010 +1111000010001000 +0000011101000011 +1111110000010000 +1110101010001000 +0000011111000011 +1111000010001000 +0000011111000100 +1111110000010000 +1110101010001000 +0000011101000100 +1111000010001000 +0000011111000101 +1111110000010000 +1110101010001000 +0000100001000101 +1111000010001000 +0000100001000110 +1111110000010000 +1110101010001000 +0000011111000110 +1111000010001000 +0000100001000111 +1111110000010000 +1110101010001000 +0000100011000111 +1111000010001000 +0000100011001000 +1111110000010000 +1110101010001000 +0000100001001000 +1111000010001000 +0000100011001001 +1111110000010000 +1110101010001000 +0000100101001001 +1111000010001000 +0000100101001010 +1111110000010000 +1110101010001000 +0000100011001010 +1111000010001000 +0000100101001011 +1111110000010000 +1110101010001000 +0000100111001011 +1111000010001000 +0000100111001100 +1111110000010000 +1110101010001000 +0000100101001100 +1111000010001000 +0000100111001101 +1111110000010000 +1110101010001000 +0000101001001101 +1111000010001000 +0000101001001110 +1111110000010000 +1110101010001000 +0000100111001110 +1111000010001000 +0000101001001111 +1111110000010000 +1110101010001000 +0000101011001111 +1111000010001000 +0000101011010000 +1111110000010000 +1110101010001000 +0000101001010000 +1111000010001000 +0000101011010001 +1111110000010000 +1110101010001000 +0000101101010001 +1111000010001000 +0000101101010010 +1111110000010000 +1110101010001000 +0000101011010010 +1111000010001000 +0000101101010011 +1111110000010000 +1110101010001000 +0000101111010011 +1111000010001000 +0000101111010100 +1111110000010000 +1110101010001000 +0000101101010100 +1111000010001000 +0000101111010101 +1111110000010000 +1110101010001000 +0000110001010101 +1111000010001000 +0000110001010110 +1111110000010000 +1110101010001000 +0000101111010110 +1111000010001000 +0000110001010111 +1111110000010000 +1110101010001000 +0000110011010111 +1111000010001000 +0000110011011000 +1111110000010000 +1110101010001000 +0000110001011000 +1111000010001000 +0000110011011001 +1111110000010000 +1110101010001000 +0000110101011001 +1111000010001000 +0000110101011010 +1111110000010000 +1110101010001000 +0000110011011010 +1111000010001000 +0000110101011011 +1111110000010000 +1110101010001000 +0000110111011011 +1111000010001000 +0000110111011100 +1111110000010000 +1110101010001000 +0000110101011100 +1111000010001000 +0000110111011101 +1111110000010000 +1110101010001000 +0000111001011101 +1111000010001000 +0000111001011110 +1111110000010000 +1110101010001000 +0000110111011110 +1111000010001000 +0000111001011111 +1111110000010000 +1110101010001000 +0000111011011111 +1111000010001000 +0000111011100000 +1111110000010000 +1110101010001000 +0000111001100000 +1111000010001000 +0000111011100001 +1111110000010000 +1110101010001000 +0000111101100001 +1111000010001000 +0000111101100010 +1111110000010000 +1110101010001000 +0000111011100010 +1111000010001000 +0000111101100011 +1111110000010000 +1110101010001000 +0000111111100011 +1111000010001000 +0000111111100100 +1111110000010000 +1110101010001000 +0000111101100100 +1111000010001000 +0000111111100101 +1111110000010000 +1110101010001000 +0001000001100101 +1111000010001000 +0001000001100110 +1111110000010000 +1110101010001000 +0000111111100110 +1111000010001000 +0001000001100111 +1111110000010000 +1110101010001000 +0001000011100111 +1111000010001000 +0001000011101000 +1111110000010000 +1110101010001000 +0001000001101000 +1111000010001000 +0001000011101001 +1111110000010000 +1110101010001000 +0001000101101001 +1111000010001000 +0001000101101010 +1111110000010000 +1110101010001000 +0001000011101010 +1111000010001000 +0001000101101011 +1111110000010000 +1110101010001000 +0001000111101011 +1111000010001000 +0001000111101100 +1111110000010000 +1110101010001000 +0001000101101100 +1111000010001000 +0001000111101101 +1111110000010000 +1110101010001000 +0001001001101101 +1111000010001000 +0001001001101110 +1111110000010000 +1110101010001000 +0001000111101110 +1111000010001000 +0001001001101111 +1111110000010000 +1110101010001000 +0001001011101111 +1111000010001000 +0001001011110000 +1111110000010000 +1110101010001000 +0001001001110000 +1111000010001000 +0001001011110001 +1111110000010000 +1110101010001000 +0001001101110001 +1111000010001000 +0001001101110010 +1111110000010000 +1110101010001000 +0001001011110010 +1111000010001000 +0001001101110011 +1111110000010000 +1110101010001000 +0001001111110011 +1111000010001000 +0001001111110100 +1111110000010000 +1110101010001000 +0001001101110100 +1111000010001000 +0001001111110101 +1111110000010000 +1110101010001000 +0001010001110101 +1111000010001000 +0001010001110110 +1111110000010000 +1110101010001000 +0001001111110110 +1111000010001000 +0001010001110111 +1111110000010000 +1110101010001000 +0001010011110111 +1111000010001000 +0001010011111000 +1111110000010000 +1110101010001000 +0001010001111000 +1111000010001000 +0001010011111001 +1111110000010000 +1110101010001000 +0001010101111001 +1111000010001000 +0001010101111010 +1111110000010000 +1110101010001000 +0001010011111010 +1111000010001000 +0001010101111011 +1111110000010000 +1110101010001000 +0001010111111011 +1111000010001000 +0001010111111100 +1111110000010000 +1110101010001000 +0001010101111100 +1111000010001000 +0001010111111101 +1111110000010000 +1110101010001000 +0001011001111101 +1111000010001000 +0001011001111110 +1111110000010000 +1110101010001000 +0001010111111110 +1111000010001000 +0001011001111111 +1111110000010000 +1110101010001000 +0001011011111111 +1111000010001000 +0001011100000000 +1111110000010000 +1110101010001000 +0001011010000000 +1111000010001000 +0001011100000001 +1111110000010000 +1110101010001000 +0001011110000001 +1111000010001000 +0001011110000010 +1111110000010000 +1110101010001000 +0001011100000010 +1111000010001000 +0001011110000011 +1111110000010000 +1110101010001000 +0001100000000011 +1111000010001000 +0001100000000100 +1111110000010000 +1110101010001000 +0001011110000100 +1111000010001000 +0001100000000101 +1111110000010000 +1110101010001000 +0001100010000101 +1111000010001000 +0001100010000110 +1111110000010000 +1110101010001000 +0001100000000110 +1111000010001000 +0001100010000111 +1111110000010000 +1110101010001000 +0001100100000111 +1111000010001000 +0001100100001000 +1111110000010000 +1110101010001000 +0001100010001000 +1111000010001000 +0001100100001001 +1111110000010000 +1110101010001000 +0001100110001001 +1111000010001000 +0001100110001010 +1111110000010000 +1110101010001000 +0001100100001010 +1111000010001000 +0001100110001011 +1111110000010000 +1110101010001000 +0001101000001011 +1111000010001000 +0001101000001100 +1111110000010000 +1110101010001000 +0001100110001100 +1111000010001000 +0001101000001101 +1111110000010000 +1110101010001000 +0001101010001101 +1111000010001000 +0001101010001110 +1111110000010000 +1110101010001000 +0001101000001110 +1111000010001000 +0001101010001111 +1111110000010000 +1110101010001000 +0001101100001111 +1111000010001000 +0001101100010000 +1111110000010000 +1110101010001000 +0001101010010000 +1111000010001000 +0001101100010001 +1111110000010000 +1110101010001000 +0001101110010001 +1111000010001000 +0001101110010010 +1111110000010000 +1110101010001000 +0001101100010010 +1111000010001000 +0001101110010011 +1111110000010000 +1110101010001000 +0001110000010011 +1111000010001000 +0001110000010100 +1111110000010000 +1110101010001000 +0001101110010100 +1111000010001000 +0001110000010101 +1111110000010000 +1110101010001000 +0001110010010101 +1111000010001000 +0001110010010110 +1111110000010000 +1110101010001000 +0001110000010110 +1111000010001000 +0001110010010111 +1111110000010000 +1110101010001000 +0001110100010111 +1111000010001000 +0001110100011000 +1111110000010000 +1110101010001000 +0001110010011000 +1111000010001000 +0001110100011001 +1111110000010000 +1110101010001000 +0001110110011001 +1111000010001000 +0001110110011010 +1111110000010000 +1110101010001000 +0001110100011010 +1111000010001000 +0001110110011011 +1111110000010000 +1110101010001000 +0001111000011011 +1111000010001000 +0001111000011100 +1111110000010000 +1110101010001000 +0001110110011100 +1111000010001000 +0001111000011101 +1111110000010000 +1110101010001000 +0001111010011101 +1111000010001000 +0001111010011110 +1111110000010000 +1110101010001000 +0001111000011110 +1111000010001000 +0001111010011111 +1111110000010000 +1110101010001000 +0001111100011111 +1111000010001000 +0001111100100000 +1111110000010000 +1110101010001000 +0001111010100000 +1111000010001000 +0001111100100001 +1111110000010000 +1110101010001000 +0001111110100001 +1111000010001000 +0001111110100010 +1111110000010000 +1110101010001000 +0001111100100010 +1111000010001000 +0001111110100011 +1111110000010000 +1110101010001000 +0010000000100011 +1111000010001000 +0010000000100100 +1111110000010000 +1110101010001000 +0001111110100100 +1111000010001000 +0010000000100101 +1111110000010000 +1110101010001000 +0010000010100101 +1111000010001000 +0010000010100110 +1111110000010000 +1110101010001000 +0010000000100110 +1111000010001000 +0010000010100111 +1111110000010000 +1110101010001000 +0010000100100111 +1111000010001000 +0010000100101000 +1111110000010000 +1110101010001000 +0010000010101000 +1111000010001000 +0010000100101001 +1111110000010000 +1110101010001000 +0010000110101001 +1111000010001000 +0010000110101010 +1111110000010000 +1110101010001000 +0010000100101010 +1111000010001000 +0010000110101011 +1111110000010000 +1110101010001000 +0010001000101011 +1111000010001000 +0010001000101100 +1111110000010000 +1110101010001000 +0010000110101100 +1111000010001000 +0000000110101110 +1110110000010000 +0010011010111000 +1110001100001000 +0010011010111000 +1111110000100000 +1111110000010000 +0000100101100110 +1110001100000100 +0000100101101110 +1110001100000010 +0000000000011110 +1110000010100000 +1111110000010000 +0000100101101011 +1110101010000111 +0000000000001111 +1110000000010000 +0000000000010101 +1110000010100000 +1111110000010000 +0010011010111000 +1111110000100000 +1110001100001000 +0010011010111000 +1111110111011000 +0010001000101100 +1110010011010000 +0000100101011010 +1110001100000100 +0000100111100110 +1110101010000111 +0010011010111001 +1110001100001000 +0000100110000001 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110010001000 +0000100111010000 +1110101010000111 +0000000110101110 +1110110000010000 +0010011010111010 +1110001100001000 +0000000001000000 +1110110000010000 +0010011010111011 +1110001100001000 +0000100110010010 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110010001000 +0000100110011000 +1110101010000111 +0010011010111011 +1111110010011000 +0000100110001001 +1110001100000001 +0000100111100110 +1110101010000111 +0000000000001000 +1110110000010000 +0010011010111100 +1110001100001000 +0000100110100101 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110010001000 +0000100110110000 +1110101010000111 +0010011010111100 +1111110010011000 +0000100110011100 +1110001100000001 +0010011010111010 +1111110111001000 +1111110111001000 +0000000000000000 +1111110111101000 +1111110000100000 +1110101010000111 +0000000000010000 +1110110000010000 +0010011010111101 +1110001100001000 +0010011010111001 +1111110000100000 +1111110000010000 +0010011010111110 +1110001100001000 +0010011010111110 +1111110000010000 +1111000010001000 +0111111111111111 +1110001101010000 +1110010101010000 +1110001101010000 +0010011010111010 +1111110000100000 +1110001100001000 +1110110111010000 +0010011010111010 +1110001100001000 +0010011010111101 +1111110010011000 +0000100110111001 +1110001100000001 +0010011010111001 +1111110111001000 +0000000000000000 +1111110111101000 +1111110000100000 +1110101010000111 +0010000110000100 +1110110000010000 +0010011010111111 +1110001100001000 +0000000100101011 +1110110000010000 +0010011011000000 +1110001100001000 +0010011011000000 +1111110000100000 +1110101010001000 +1110110111010000 +0010011011000000 +1110001100001000 +0010011010111111 +1111110010011000 +0000100111011000 +1110001100000001 +0000000000000000 +1111110111101000 +1111110000100000 +1110101010000111 +0100000000000000 +1110110000010000 +0010011011000001 +1110001100001000 +0000000110101110 +1110110000010000 +0010011011000010 +1110001100001000 +0000000001000000 +1110110000010000 +0010011011000011 +1110001100001000 +0000100111111011 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110010001000 +0000101000000011 +1110101010000111 +0010011011000011 +1111110010011000 +0000100111110010 +1110001100000001 +0000000000000000 +1111110111101000 +1111110000100000 +1110101010000111 +0000000000100000 +1110110000010000 +0010011011000100 +1110001100001000 +0010011011000010 +1111110000100000 +1111110000010000 +0000101001011111 +1110001100000010 +0010011011000010 +1111110111101000 +1111110000010000 +0000101000111110 +1110001100000010 +0010011011000010 +1111110111101000 +1111110000010000 +0000101000110000 +1110001100000010 +0010011011000010 +1111110111101000 +1111110000010000 +0000101000101100 +1110001100000010 +0000000000100000 +1110110000010000 +0010011011000001 +1111110000100000 +1110111010001000 +1110000010100000 +1110111010001000 +1110000010100000 +1110111010001000 +1110000010100000 +1110111010001000 +0010011011000001 +1111110111001000 +0010011011000010 +1111110111001000 +0000101011011100 +1110101010000111 +0000111111111111 +1110110000010000 +0000101010110011 +1110101010000111 +0010011011000010 +1111110111101000 +1111110000010000 +0000101000111010 +1110001100000010 +0000111100000000 +1110111010010000 +1110010011010000 +0000101010110011 +1110101010000111 +0000000011111111 +1110110000010000 +0000101010110011 +1110101010000111 +0010011011000010 +1111110111101000 +1111110000010000 +0000101001010001 +1110001100000010 +0010011011000010 +1111110111101000 +1111110000010000 +0000101001001101 +1110001100000010 +0000000011110000 +1110111010010000 +1110010011010000 +0000101010110011 +1110101010000111 +0000111100001111 +1110110000010000 +0000101010110011 +1110101010000111 +0010011011000010 +1111110111101000 +1111110000010000 +0000101001011011 +1110001100000010 +0000111111110000 +1110111010010000 +1110010011010000 +0000101010110011 +1110101010000111 +0000000000001111 +1110110000010000 +0000101010110011 +1110101010000111 +0010011011000010 +1111110111101000 +1111110000010000 +0000101010000101 +1110001100000010 +0010011011000010 +1111110111101000 +1111110000010000 +0000101001110111 +1110001100000010 +0010011011000010 +1111110111101000 +1111110000010000 +0000101001110011 +1110001100000010 +0000000000001111 +1110111010010000 +1110010011010000 +0000101010110011 +1110101010000111 +0000111111110000 +1110110000010000 +0000101010110011 +1110101010000111 +0010011011000010 +1111110111101000 +1111110000010000 +0000101010000001 +1110001100000010 +0000111100001111 +1110111010010000 +1110010011010000 +0000101010110011 +1110101010000111 +0000000011110000 +1110110000010000 +0000101010110011 +1110101010000111 +0010011011000010 +1111110111101000 +1111110000010000 +0000101010011000 +1110001100000010 +0010011011000010 +1111110111101000 +1111110000010000 +0000101010010100 +1110001100000010 +0000000011111111 +1110111010010000 +1110010011010000 +0000101010110011 +1110101010000111 +0000111100000000 +1110110000010000 +0000101010110011 +1110101010000111 +0010011011000010 +1111110111101000 +1111110000010000 +0000101010100010 +1110001100000010 +0000111111111111 +1110111010010000 +1110010011010000 +0000101010110011 +1110101010000111 +0000000000100000 +1110110000010000 +0010011011000001 +1111110000100000 +1110101010001000 +1110000010100000 +1110101010001000 +1110000010100000 +1110101010001000 +1110000010100000 +1110101010001000 +0010011011000001 +1111110111001000 +0010011011000010 +1111110111001000 +0000101011011100 +1110101010000111 +0010011011000101 +1110001100001000 +0010011011000001 +1111110000100000 +1110001100001000 +1110110000010000 +0000000000100000 +1110000010010000 +0010011011000001 +1110001100001000 +0010011011000101 +1111110000010000 +0010011011000001 +1111110000100000 +1110001100001000 +1110110000010000 +0000000000100000 +1110000010010000 +0010011011000001 +1110001100001000 +0010011011000101 +1111110000010000 +0010011011000001 +1111110000100000 +1110001100001000 +1110110000010000 +0000000000100000 +1110000010010000 +0010011011000001 +1110001100001000 +0010011011000101 +1111110000010000 +0010011011000001 +1111110000100000 +1110001100001000 +0000000001011111 +1110110000010000 +0010011011000001 +1111000111001000 +0010011011000010 +1111110111001000 +0010011011000100 +1111110010011000 +0000101000000111 +1110001100000001 +0010011011000010 +1111110111001000 +1111110111001000 +0000000001100000 +1110110000010000 +0010011011000001 +1111000010001000 +0000000000000000 +1111110111101000 +1111110000100000 +1110101010000111 +0000000001000000 +1110110000010000 +0000000000010000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000010001 +1110001100001000 +0000000000010010 +1110101010001000 +0000000000010011 +1110111111001000 +0111111111111111 +1110110000010000 +0000000000010100 +1110001100001000 +0000000000010101 +1110101010001000 +0000000000010110 +1110101010001000 +1110111010010000 +0111111111111111 +1110010011010000 +0000000000010111 +1110001100001000 +1110111010010000 +0111111111111111 +1110010011010000 +0000000000011000 +1110001100001000 +0000000000011001 +1110101010001000 +0000000000011010 +1110101010001000 +0000000000011011 +1110101010001000 +0000000000011100 +1110101010001000 +0000000000011101 +1110101010001000 +0000000000011110 +1110101010001000 +0000000000011111 +1110101010001000 +0000000000100000 +1110101010001000 +1110111010010000 +0111111111111111 +1110010011010000 +0000000000100001 +1110001100001000 +0000000000100010 +1110101010001000 +0000000000100011 +1110101010001000 +0000000000100100 +1110101010001000 +0000000000100101 +1110101010001000 +0000000000100110 +1110101010001000 +0000000000100111 +1110101010001000 +0000000000101000 +1110101010001000 +0000000000101001 +1110111111001000 +0000000000101010 +1110111111001000 +0000000000000010 +1110110000010000 +0000000000101011 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000101100 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000101101 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000101110 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000101111 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000110000 +1110001100001000 +0000000000000101 +1110110000010000 +0000000000110001 +1110001100001000 +0000000000000101 +1110110000010000 +0000000000110010 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000110011 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000110100 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000110101 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000110110 +1110001100001000 +0000000000001000 +1110110000010000 +0000000000110111 +1110001100001000 +0000000000001000 +1110110000010000 +0000000000111000 +1110001100001000 +0000000000001001 +1110110000010000 +0000000000111001 +1110001100001000 +0000000000001001 +1110110000010000 +0000000000111010 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000111011 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000111100 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000111101 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000111110 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000111111 +1110001100001000 +0000000000001100 +1110110000010000 +0000000001000000 +1110001100001000 +0000000000001101 +1110110000010000 +0000000001000001 +1110001100001000 +0000000000001101 +1110110000010000 +0000000001000010 +1110001100001000 +0000000000001110 +1110110000010000 +0000000001000011 +1110001100001000 +0000000000001110 +1110110000010000 +0000000001000100 +1110001100001000 +0000000000001111 +1110110000010000 +0000000001000101 +1110001100001000 +0000000000001111 +1110110000010000 +0000000001000110 +1110001100001000 +0000000000010000 +1110110000010000 +0000000001000111 +1110001100001000 +0000000000010000 +1110110000010000 +0000000001001000 +1110001100001000 +0000000000010001 +1110110000010000 +0000000001001001 +1110001100001000 +0000000000010001 +1110110000010000 +0000000001001010 +1110001100001000 +0000000000010010 +1110110000010000 +0000000001001011 +1110001100001000 +0000000000010010 +1110110000010000 +0000000001001100 +1110001100001000 +0000000000010011 +1110110000010000 +0000000001001101 +1110001100001000 +0000000000010011 +1110110000010000 +0000000001001110 +1110001100001000 +0000000000010100 +1110110000010000 +0000000001001111 +1110001100001000 +0000000000010100 +1110110000010000 +0000000001010000 +1110001100001000 +0000000000010101 +1110110000010000 +0000000001010001 +1110001100001000 +0000000000010101 +1110110000010000 +0000000001010010 +1110001100001000 +0000000000010110 +1110110000010000 +0000000001010011 +1110001100001000 +0000000000010110 +1110110000010000 +0000000001010100 +1110001100001000 +0000000000010111 +1110110000010000 +0000000001010101 +1110001100001000 +0000000000010111 +1110110000010000 +0000000001010110 +1110001100001000 +0000000000011000 +1110110000010000 +0000000001010111 +1110001100001000 +0000000000011000 +1110110000010000 +0000000001011000 +1110001100001000 +0000000000011001 +1110110000010000 +0000000001011001 +1110001100001000 +0000000000011001 +1110110000010000 +0000000001011010 +1110001100001000 +0000000000011010 +1110110000010000 +0000000001011011 +1110001100001000 +0000000000011010 +1110110000010000 +0000000001011100 +1110001100001000 +0000000000011011 +1110110000010000 +0000000001011101 +1110001100001000 +0000000000011011 +1110110000010000 +0000000001011110 +1110001100001000 +0000000000011100 +1110110000010000 +0000000001011111 +1110001100001000 +0000000000011100 +1110110000010000 +0000000001100000 +1110001100001000 +0000000000011101 +1110110000010000 +0000000001100001 +1110001100001000 +0000000000011101 +1110110000010000 +0000000001100010 +1110001100001000 +0000000000011110 +1110110000010000 +0000000001100011 +1110001100001000 +0000000000011110 +1110110000010000 +0000000001100100 +1110001100001000 +0000000000011111 +1110110000010000 +0000000001100101 +1110001100001000 +0000000000011111 +1110110000010000 +0000000001100110 +1110001100001000 +0000000001100111 +1110101010001000 +0000000001101000 +1110101010001000 +0000000001101001 +1110101010001000 +0000000001101010 +1110101010001000 +0000000001101011 +1110111111001000 +0000000001101100 +1110111111001000 +0000000001101101 +1110111111001000 +0000000001101110 +1110111111001000 +0000000000000010 +1110110000010000 +0000000001101111 +1110001100001000 +0000000000000010 +1110110000010000 +0000000001110000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000001110001 +1110001100001000 +0000000000000010 +1110110000010000 +0000000001110010 +1110001100001000 +0000000000000011 +1110110000010000 +0000000001110011 +1110001100001000 +0000000000000011 +1110110000010000 +0000000001110100 +1110001100001000 +0000000000000011 +1110110000010000 +0000000001110101 +1110001100001000 +0000000000000011 +1110110000010000 +0000000001110110 +1110001100001000 +0000000000000100 +1110110000010000 +0000000001110111 +1110001100001000 +0000000000000100 +1110110000010000 +0000000001111000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000001111001 +1110001100001000 +0000000000000100 +1110110000010000 +0000000001111010 +1110001100001000 +0000000000000101 +1110110000010000 +0000000001111011 +1110001100001000 +0000000000000101 +1110110000010000 +0000000001111100 +1110001100001000 +0000000000000101 +1110110000010000 +0000000001111101 +1110001100001000 +0000000000000101 +1110110000010000 +0000000001111110 +1110001100001000 +0000000000000110 +1110110000010000 +0000000001111111 +1110001100001000 +0000000000000110 +1110110000010000 +0000000010000000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000010000001 +1110001100001000 +0000000000000110 +1110110000010000 +0000000010000010 +1110001100001000 +0000000000000111 +1110110000010000 +0000000010000011 +1110001100001000 +0000000000000111 +1110110000010000 +0000000010000100 +1110001100001000 +0000000000000111 +1110110000010000 +0000000010000101 +1110001100001000 +0000000000000111 +1110110000010000 +0000000010000110 +1110001100001000 +0000000000001000 +1110110000010000 +0000000010000111 +1110001100001000 +0000000000001000 +1110110000010000 +0000000010001000 +1110001100001000 +0000000000001000 +1110110000010000 +0000000010001001 +1110001100001000 +0000000000001000 +1110110000010000 +0000000010001010 +1110001100001000 +0000000000001001 +1110110000010000 +0000000010001011 +1110001100001000 +0000000000001001 +1110110000010000 +0000000010001100 +1110001100001000 +0000000000001001 +1110110000010000 +0000000010001101 +1110001100001000 +0000000000001001 +1110110000010000 +0000000010001110 +1110001100001000 +0000000000001010 +1110110000010000 +0000000010001111 +1110001100001000 +0000000000001010 +1110110000010000 +0000000010010000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000010010001 +1110001100001000 +0000000000001010 +1110110000010000 +0000000010010010 +1110001100001000 +0000000000001011 +1110110000010000 +0000000010010011 +1110001100001000 +0000000000001011 +1110110000010000 +0000000010010100 +1110001100001000 +0000000000001011 +1110110000010000 +0000000010010101 +1110001100001000 +0000000000001011 +1110110000010000 +0000000010010110 +1110001100001000 +0000000000001100 +1110110000010000 +0000000010010111 +1110001100001000 +0000000000001100 +1110110000010000 +0000000010011000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000010011001 +1110001100001000 +0000000000001100 +1110110000010000 +0000000010011010 +1110001100001000 +0000000000001101 +1110110000010000 +0000000010011011 +1110001100001000 +0000000000001101 +1110110000010000 +0000000010011100 +1110001100001000 +0000000000001101 +1110110000010000 +0000000010011101 +1110001100001000 +0000000000001101 +1110110000010000 +0000000010011110 +1110001100001000 +0000000000001110 +1110110000010000 +0000000010011111 +1110001100001000 +0000000000001110 +1110110000010000 +0000000010100000 +1110001100001000 +0000000000001110 +1110110000010000 +0000000010100001 +1110001100001000 +0000000000001110 +1110110000010000 +0000000010100010 +1110001100001000 +0000000000001111 +1110110000010000 +0000000010100011 +1110001100001000 +0000000000001111 +1110110000010000 +0000000010100100 +1110001100001000 +0000000000001111 +1110110000010000 +0000000010100101 +1110001100001000 +0000000000001111 +1110110000010000 +0000000010100110 +1110001100001000 +0000000000010000 +1110110000010000 +0000000010100111 +1110001100001000 +0000000000010000 +1110110000010000 +0000000010101000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000010101001 +1110001100001000 +0000000000010000 +1110110000010000 +0000000010101010 +1110001100001000 +0000000000010001 +1110110000010000 +0000000010101011 +1110001100001000 +0000000000010001 +1110110000010000 +0000000010101100 +1110001100001000 +0000000000010001 +1110110000010000 +0000000010101101 +1110001100001000 +0000000000010001 +1110110000010000 +0000000010101110 +1110001100001000 +0000000000010010 +1110110000010000 +0000000010101111 +1110001100001000 +0000000000010010 +1110110000010000 +0000000010110000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000010110001 +1110001100001000 +0000000000010010 +1110110000010000 +0000000010110010 +1110001100001000 +0000000000010011 +1110110000010000 +0000000010110011 +1110001100001000 +0000000000010011 +1110110000010000 +0000000010110100 +1110001100001000 +0000000000010011 +1110110000010000 +0000000010110101 +1110001100001000 +0000000000010011 +1110110000010000 +0000000010110110 +1110001100001000 +0000000000010100 +1110110000010000 +0000000010110111 +1110001100001000 +0000000000010100 +1110110000010000 +0000000010111000 +1110001100001000 +0000000000010100 +1110110000010000 +0000000010111001 +1110001100001000 +0000000000010100 +1110110000010000 +0000000010111010 +1110001100001000 +0000000000010101 +1110110000010000 +0000000010111011 +1110001100001000 +0000000000010101 +1110110000010000 +0000000010111100 +1110001100001000 +0000000000010101 +1110110000010000 +0000000010111101 +1110001100001000 +0000000000010101 +1110110000010000 +0000000010111110 +1110001100001000 +0000000000010110 +1110110000010000 +0000000010111111 +1110001100001000 +0000000000010110 +1110110000010000 +0000000011000000 +1110001100001000 +0000000000010110 +1110110000010000 +0000000011000001 +1110001100001000 +0000000000010110 +1110110000010000 +0000000011000010 +1110001100001000 +0000000000010111 +1110110000010000 +0000000011000011 +1110001100001000 +0000000000010111 +1110110000010000 +0000000011000100 +1110001100001000 +0000000000010111 +1110110000010000 +0000000011000101 +1110001100001000 +0000000000010111 +1110110000010000 +0000000011000110 +1110001100001000 +0000000000011000 +1110110000010000 +0000000011000111 +1110001100001000 +0000000000011000 +1110110000010000 +0000000011001000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000011001001 +1110001100001000 +0000000000011000 +1110110000010000 +0000000011001010 +1110001100001000 +0000000000011001 +1110110000010000 +0000000011001011 +1110001100001000 +0000000000011001 +1110110000010000 +0000000011001100 +1110001100001000 +0000000000011001 +1110110000010000 +0000000011001101 +1110001100001000 +0000000000011001 +1110110000010000 +0000000011001110 +1110001100001000 +0000000000011010 +1110110000010000 +0000000011001111 +1110001100001000 +0000000000011010 +1110110000010000 +0000000011010000 +1110001100001000 +0000000000011010 +1110110000010000 +0000000011010001 +1110001100001000 +0000000000011010 +1110110000010000 +0000000011010010 +1110001100001000 +0000000000011011 +1110110000010000 +0000000011010011 +1110001100001000 +0000000000011011 +1110110000010000 +0000000011010100 +1110001100001000 +0000000000011011 +1110110000010000 +0000000011010101 +1110001100001000 +0000000000011011 +1110110000010000 +0000000011010110 +1110001100001000 +0000000000011100 +1110110000010000 +0000000011010111 +1110001100001000 +0000000000011100 +1110110000010000 +0000000011011000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000011011001 +1110001100001000 +0000000000011100 +1110110000010000 +0000000011011010 +1110001100001000 +0000000000011101 +1110110000010000 +0000000011011011 +1110001100001000 +0000000000011101 +1110110000010000 +0000000011011100 +1110001100001000 +0000000000011101 +1110110000010000 +0000000011011101 +1110001100001000 +0000000000011101 +1110110000010000 +0000000011011110 +1110001100001000 +0000000000011110 +1110110000010000 +0000000011011111 +1110001100001000 +0000000000011110 +1110110000010000 +0000000011100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000011100001 +1110001100001000 +0000000000011110 +1110110000010000 +0000000011100010 +1110001100001000 +0000000000011111 +1110110000010000 +0000000011100011 +1110001100001000 +0000000000011111 +1110110000010000 +0000000011100100 +1110001100001000 +0000000000011111 +1110110000010000 +0000000011100101 +1110001100001000 +0000000000011111 +1110110000010000 +0000000011100110 +1110001100001000 +0000000000000110 +1110110000010000 +0000000011100111 +1110001100001000 +0000000001100000 +1110110000010000 +0000000011101000 +1110001100001000 +0000011000000000 +1110110000010000 +0000000011101001 +1110001100001000 +0110000000000000 +1110110000010000 +0000000011101010 +1110001100001000 +0000000110101110 +1110110000010000 +0000000011101011 +1110001100001000 +0000001000110000 +1110110000010000 +0000000011101100 +1110001100001000 +0000001010110010 +1110110000010000 +0000000011101101 +1110001100001000 +0000001100110100 +1110110000010000 +0000000011101110 +1110001100001000 +0000001110110110 +1110110000010000 +0000000011101111 +1110001100001000 +0000010000111000 +1110110000010000 +0000000011110000 +1110001100001000 +0000010010111010 +1110110000010000 +0000000011110001 +1110001100001000 +0000010100111100 +1110110000010000 +0000000011110010 +1110001100001000 +0000010110111110 +1110110000010000 +0000000011110011 +1110001100001000 +0000011001000000 +1110110000010000 +0000000011110100 +1110001100001000 +0000011011000010 +1110110000010000 +0000000011110101 +1110001100001000 +0000011101000100 +1110110000010000 +0000000011110110 +1110001100001000 +0000011111000110 +1110110000010000 +0000000011110111 +1110001100001000 +0000100001001000 +1110110000010000 +0000000011111000 +1110001100001000 +0000100011001010 +1110110000010000 +0000000011111001 +1110001100001000 +0000100101001100 +1110110000010000 +0000000011111010 +1110001100001000 +0000100111001110 +1110110000010000 +0000000011111011 +1110001100001000 +0000101001010000 +1110110000010000 +0000000011111100 +1110001100001000 +0000101011010010 +1110110000010000 +0000000011111101 +1110001100001000 +0000101101010100 +1110110000010000 +0000000011111110 +1110001100001000 +0000101111010110 +1110110000010000 +0000000011111111 +1110001100001000 +0000110001011000 +1110110000010000 +0000000100000000 +1110001100001000 +0000110011011010 +1110110000010000 +0000000100000001 +1110001100001000 +0000110101011100 +1110110000010000 +0000000100000010 +1110001100001000 +0000110111011110 +1110110000010000 +0000000100000011 +1110001100001000 +0000111001100000 +1110110000010000 +0000000100000100 +1110001100001000 +0000111011100010 +1110110000010000 +0000000100000101 +1110001100001000 +0000111101100100 +1110110000010000 +0000000100000110 +1110001100001000 +0000111111100110 +1110110000010000 +0000000100000111 +1110001100001000 +0001000001101000 +1110110000010000 +0000000100001000 +1110001100001000 +0001000011101010 +1110110000010000 +0000000100001001 +1110001100001000 +0001000101101100 +1110110000010000 +0000000100001010 +1110001100001000 +0001000111101110 +1110110000010000 +0000000100001011 +1110001100001000 +0001001001110000 +1110110000010000 +0000000100001100 +1110001100001000 +0001001011110010 +1110110000010000 +0000000100001101 +1110001100001000 +0001001101110100 +1110110000010000 +0000000100001110 +1110001100001000 +0001001111110110 +1110110000010000 +0000000100001111 +1110001100001000 +0001010001111000 +1110110000010000 +0000000100010000 +1110001100001000 +0001010011111010 +1110110000010000 +0000000100010001 +1110001100001000 +0001010101111100 +1110110000010000 +0000000100010010 +1110001100001000 +0001010111111110 +1110110000010000 +0000000100010011 +1110001100001000 +0001011010000000 +1110110000010000 +0000000100010100 +1110001100001000 +0001011100000010 +1110110000010000 +0000000100010101 +1110001100001000 +0001011110000100 +1110110000010000 +0000000100010110 +1110001100001000 +0001100000000110 +1110110000010000 +0000000100010111 +1110001100001000 +0001100010001000 +1110110000010000 +0000000100011000 +1110001100001000 +0001100100001010 +1110110000010000 +0000000100011001 +1110001100001000 +0001100110001100 +1110110000010000 +0000000100011010 +1110001100001000 +0001101000001110 +1110110000010000 +0000000100011011 +1110001100001000 +0001101010010000 +1110110000010000 +0000000100011100 +1110001100001000 +0001101100010010 +1110110000010000 +0000000100011101 +1110001100001000 +0001101110010100 +1110110000010000 +0000000100011110 +1110001100001000 +0001110000010110 +1110110000010000 +0000000100011111 +1110001100001000 +0001110010011000 +1110110000010000 +0000000100100000 +1110001100001000 +0001110100011010 +1110110000010000 +0000000100100001 +1110001100001000 +0001110110011100 +1110110000010000 +0000000100100010 +1110001100001000 +0001111000011110 +1110110000010000 +0000000100100011 +1110001100001000 +0001111010100000 +1110110000010000 +0000000100100100 +1110001100001000 +0001111100100010 +1110110000010000 +0000000100100101 +1110001100001000 +0001111110100100 +1110110000010000 +0000000100100110 +1110001100001000 +0010000000100110 +1110110000010000 +0000000100100111 +1110001100001000 +0010000010101000 +1110110000010000 +0000000100101000 +1110001100001000 +0010000100101010 +1110110000010000 +0000000100101001 +1110001100001000 +0010000110101100 +1110110000010000 +0000000100101010 +1110001100001000 +0010001010101111 +1110111010001000 +0010001010110000 +1110111010001000 +0010001010110001 +1110111010001000 +0010001010110010 +1110111010001000 +0010001010110011 +1110111010001000 +0010001010110100 +1110111010001000 +0010001010110101 +1110111010001000 +0010001010110110 +1110111010001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001010110111 +1110001100001000 +0010001010111000 +1110101010001000 +0010001010111001 +1110101010001000 +0010001010111010 +1110101010001000 +0010001010111011 +1110101010001000 +0010001010111100 +1110101010001000 +0010001010111101 +1110101010001000 +0010001010111110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001010111111 +1110001100001000 +0010001011000000 +1110101010001000 +0010001011000001 +1110101010001000 +0010001011000010 +1110101010001000 +0010001011000011 +1110101010001000 +0010001011000100 +1110101010001000 +0010001011000101 +1110101010001000 +0010001011000110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001011000111 +1110001100001000 +0010001011001000 +1110101010001000 +0010001011001001 +1110101010001000 +0010001011001010 +1110101010001000 +0010001011001011 +1110101010001000 +0010001011001100 +1110101010001000 +0010001011001101 +1110101010001000 +0010001011001110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001011001111 +1110001100001000 +0010001011010000 +1110101010001000 +0010001011010001 +1110101010001000 +0010001011010010 +1110101010001000 +0010001011010011 +1110101010001000 +0010001011010100 +1110101010001000 +0010001011010101 +1110101010001000 +0010001011010110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001011010111 +1110001100001000 +0010001011011000 +1110101010001000 +0010001011011001 +1110101010001000 +0010001011011010 +1110101010001000 +0010001011011011 +1110101010001000 +0010001011011100 +1110101010001000 +0010001011011101 +1110101010001000 +0010001011011110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001011011111 +1110001100001000 +0010001011100000 +1110101010001000 +0010001011100001 +1110101010001000 +0010001011100010 +1110101010001000 +0010001011100011 +1110101010001000 +0010001011100100 +1110101010001000 +0010001011100101 +1110101010001000 +0010001011100110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001011100111 +1110001100001000 +0010001011101000 +1110101010001000 +0010001011101001 +1110101010001000 +0010001011101010 +1110101010001000 +0010001011101011 +1110101010001000 +0010001011101100 +1110101010001000 +0010001011101101 +1110101010001000 +0010001011101110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001011101111 +1110001100001000 +0010001011110000 +1110101010001000 +0010001011110001 +1110101010001000 +0010001011110010 +1110101010001000 +0010001011110011 +1110101010001000 +0010001011110100 +1110101010001000 +0010001011110101 +1110101010001000 +0010001011110110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001011110111 +1110001100001000 +0001111111110001 +1110110000010000 +0010001011111000 +1110001100001000 +1110111010010000 +0000000011000011 +1110010011010000 +0010001011111001 +1110001100001000 +0111101111000001 +1110110000010000 +0010001011111010 +1110001100001000 +1110111010010000 +0001100000000011 +1110010011010000 +0010001011111011 +1110001100001000 +1110111010010000 +0000111100001000 +1110010011010000 +0010001011111100 +1110001100001000 +0011111111110000 +1110110000010000 +0010001011111101 +1110001100001000 +0010001011111110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001011111111 +1110001100001000 +0011111111111011 +1110110000010000 +0010001100000000 +1110001100001000 +1110111010010000 +0000000001000001 +1110010011010000 +0010001100000001 +1110001100001000 +0111101111000001 +1110110000010000 +0010001100000010 +1110001100001000 +1110111010010000 +0001000000000001 +1110010011010000 +0010001100000011 +1110001100001000 +1110111010010000 +0000111100001000 +1110010011010000 +0010001100000100 +1110001100001000 +0111111111110000 +1110110000010000 +0010001100000101 +1110001100001000 +0010001100000110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001100000111 +1110001100001000 +0011110001111011 +1110110000010000 +0010001100001000 +1110001100001000 +1110111010010000 +0011100001000000 +1110010011010000 +0010001100001001 +1110001100001000 +0111101111000001 +1110110000010000 +0010001100001010 +1110001100001000 +1110111010010000 +0001000011100001 +1110010011010000 +0010001100001011 +1110001100001000 +1110111010010000 +0000111100001111 +1110010011010000 +0010001100001100 +1110001100001000 +0111100000000000 +1110110000010000 +0010001100001101 +1110001100001000 +0010001100001110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001100001111 +1110001100001000 +0011110001111011 +1110110000010000 +0010001100010000 +1110001100001000 +1110111010010000 +0011100001000000 +1110010011010000 +0010001100010001 +1110001100001000 +1110111010010000 +0000010000110110 +1110010011010000 +0010001100010010 +1110001100001000 +1110111010010000 +0001000011100001 +1110010011010000 +0010001100010011 +1110001100001000 +1110111010010000 +0000011000001111 +1110010011010000 +0010001100010100 +1110001100001000 +0111100000000000 +1110110000010000 +0010001100010101 +1110001100001000 +0010001100010110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001100010111 +1110001100001000 +0011110000000011 +1110110000010000 +0010001100011000 +1110001100001000 +1110111010010000 +0011100001000000 +1110010011010000 +0010001100011001 +1110001100001000 +1110111010010000 +0000010000100010 +1110010011010000 +0010001100011010 +1110001100001000 +1110111010010000 +0001000000000001 +1110010011010000 +0010001100011011 +1110001100001000 +0111111111100000 +1110110000010000 +0010001100011100 +1110001100001000 +0111111111100000 +1110110000010000 +0010001100011101 +1110001100001000 +0010001100011110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001100011111 +1110001100001000 +0011110000000011 +1110110000010000 +0010001100100000 +1110001100001000 +1110111010010000 +0011100001000010 +1110010011010000 +0010001100100001 +1110001100001000 +1110111010010000 +0000010000000000 +1110010011010000 +0010001100100010 +1110001100001000 +1110111010010000 +0001000000000001 +1110010011010000 +0010001100100011 +1110001100001000 +0011111111000000 +1110110000010000 +0010001100100100 +1110001100001000 +0011111111110000 +1110110000010000 +0010001100100101 +1110001100001000 +0010001100100110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001100100111 +1110001100001000 +0011110001111011 +1110110000010000 +0010001100101000 +1110001100001000 +1110111010010000 +0011100001000011 +1110010011010000 +0010001100101001 +1110001100001000 +1110111010010000 +0000010000000000 +1110010011010000 +0010001100101010 +1110001100001000 +1110111010010000 +0001000011100001 +1110010011010000 +0010001100101011 +1110001100001000 +0000111100000000 +1110110000010000 +0010001100101100 +1110001100001000 +0000000011110000 +1110110000010000 +0010001100101101 +1110001100001000 +0010001100101110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001100101111 +1110001100001000 +0011110001111011 +1110110000010000 +0010001100110000 +1110001100001000 +1110111010010000 +0011100001000011 +1110010011010000 +0010001100110001 +1110001100001000 +0111101111110111 +1110110000010000 +0010001100110010 +1110001100001000 +1110111010010000 +0001000011100001 +1110010011010000 +0010001100110011 +1110001100001000 +0000111100000000 +1110110000010000 +0010001100110100 +1110001100001000 +0000000011110000 +1110110000010000 +0010001100110101 +1110001100001000 +0010001100110110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001100110111 +1110001100001000 +0011111111111011 +1110110000010000 +0010001100111000 +1110001100001000 +1110111010010000 +0000000001000011 +1110010011010000 +0010001100111001 +1110001100001000 +0111101111100011 +1110110000010000 +0010001100111010 +1110001100001000 +1110111010010000 +0001000011100001 +1110010011010000 +0010001100111011 +1110001100001000 +0000111100000000 +1110110000010000 +0010001100111100 +1110001100001000 +0111111111110000 +1110110000010000 +0010001100111101 +1110001100001000 +0010001100111110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001100111111 +1110001100001000 +0001111111110001 +1110110000010000 +0010001101000000 +1110001100001000 +1110111010010000 +0000000011000011 +1110010011010000 +0010001101000001 +1110001100001000 +0111101111000001 +1110110000010000 +0010001101000010 +1110001100001000 +1110111010010000 +0001000011100001 +1110010011010000 +0010001101000011 +1110001100001000 +0000111100000000 +1110110000010000 +0010001101000100 +1110001100001000 +0111111111100000 +1110110000010000 +0010001101000101 +1110001100001000 +0010001101000110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001101000111 +1110001100001000 +0010001101001000 +1110101010001000 +0010001101001001 +1110101010001000 +0010001101001010 +1110101010001000 +0010001101001011 +1110101010001000 +0010001101001100 +1110101010001000 +0010001101001101 +1110101010001000 +0010001101001110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001101001111 +1110001100001000 +0010001101010000 +1110101010001000 +0010001101010001 +1110101010001000 +0010001101010010 +1110101010001000 +0010001101010011 +1110101010001000 +0010001101010100 +1110101010001000 +0010001101010101 +1110101010001000 +0010001101010110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001101010111 +1110001100001000 +0010001101011000 +1110101010001000 +0010001101011001 +1110101010001000 +0010001101011010 +1110101010001000 +0010001101011011 +1110101010001000 +0010001101011100 +1110101010001000 +0010001101011101 +1110101010001000 +0010001101011110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001101011111 +1110001100001000 +0001111000000001 +1110110000010000 +0010001101100000 +1110001100001000 +1110111010010000 +0000000001100000 +1110010011010000 +0010001101100001 +1110001100001000 +1110111010010000 +0000011000000000 +1110010011010000 +0010001101100010 +1110001100001000 +1110111010010000 +0111111111000000 +1110010011010000 +0010001101100011 +1110001100001000 +1110111010010000 +0000110000000001 +1110010011010000 +0010001101100100 +1110001100001000 +0111111111100000 +1110110000010000 +0010001101100101 +1110001100001000 +0010001101100110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001101100111 +1110001100001000 +0001111000000001 +1110110000010000 +0010001101101000 +1110001100001000 +1110111010010000 +0000000001000000 +1110010011010000 +0010001101101001 +1110001100001000 +1110111010010000 +0000010000000000 +1110010011010000 +0010001101101010 +1110001100001000 +1110111010010000 +0111111110000000 +1110010011010000 +0010001101101011 +1110001100001000 +1110111010010000 +0000100000000000 +1110010011010000 +0010001101101100 +1110001100001000 +0111111111110000 +1110110000010000 +0010001101101101 +1110001100001000 +0010001101101110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001101101111 +1110001100001000 +0001111000000000 +1110110000010000 +0010001101110000 +1110001100001000 +0011110000111100 +1110110000010000 +0010001101110001 +1110001100001000 +0000001111000000 +1110110000010000 +0010001101110010 +1110001100001000 +0000000001111000 +1110110000010000 +0010001101110011 +1110001100001000 +0000011110001111 +1110110000010000 +0010001101110100 +1110001100001000 +0111100011110000 +1110110000010000 +0010001101110101 +1110001100001000 +0010001101110110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001101110111 +1110001100001000 +0001111000000000 +1110110000010000 +0010001101111000 +1110001100001000 +0011110000111100 +1110110000010000 +0010001101111001 +1110001100001000 +0000001111000000 +1110110000010000 +0010001101111010 +1110001100001000 +0000000001111000 +1110110000010000 +0010001101111011 +1110001100001000 +0000011110001111 +1110110000010000 +0010001101111100 +1110001100001000 +0111100011110000 +1110110000010000 +0010001101111101 +1110001100001000 +0010001101111110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001101111111 +1110001100001000 +0001111000000000 +1110110000010000 +0010001110000000 +1110001100001000 +0011110000111111 +1110110000010000 +0010001110000001 +1110001100001000 +1110111010010000 +0111110000000111 +1110010011010000 +0010001110000010 +1110001100001000 +0000000001111111 +1110110000010000 +0010001110000011 +1110001100001000 +0000011110001111 +1110110000010000 +0010001110000100 +1110001100001000 +0111111111100000 +1110110000010000 +0010001110000101 +1110001100001000 +0010001110000110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001110000111 +1110001100001000 +0001111000000000 +1110110000010000 +0010001110001000 +1110001100001000 +0011110000111111 +1110110000010000 +0010001110001001 +1110001100001000 +1110111010010000 +0111110000000111 +1110010011010000 +0010001110001010 +1110001100001000 +0000000001111111 +1110110000010000 +0010001110001011 +1110001100001000 +0000011110001111 +1110110000010000 +0010001110001100 +1110001100001000 +0111111111100000 +1110110000010000 +0010001110001101 +1110001100001000 +0010001110001110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001110001111 +1110001100001000 +0001111000000000 +1110110000010000 +0010001110010000 +1110001100001000 +0011110000111100 +1110110000010000 +0010001110010001 +1110001100001000 +0000001111000000 +1110110000010000 +0010001110010010 +1110001100001000 +0000000001111000 +1110110000010000 +0010001110010011 +1110001100001000 +0000011110001111 +1110110000010000 +0010001110010100 +1110001100001000 +0111100011110000 +1110110000010000 +0010001110010101 +1110001100001000 +0010001110010110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001110010111 +1110001100001000 +0001111000000000 +1110110000010000 +0010001110011000 +1110001100001000 +0011110000111100 +1110110000010000 +0010001110011001 +1110001100001000 +0000001111000000 +1110110000010000 +0010001110011010 +1110001100001000 +0000000001111000 +1110110000010000 +0010001110011011 +1110001100001000 +0000011110001111 +1110110000010000 +0010001110011100 +1110001100001000 +0111100011110000 +1110110000010000 +0010001110011101 +1110001100001000 +0010001110011110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001110011111 +1110001100001000 +0001111111111101 +1110110000010000 +0010001110100000 +1110001100001000 +1110111010010000 +0000000001000011 +1110010011010000 +0010001110100001 +1110001100001000 +0000001111111111 +1110110000010000 +0010001110100010 +1110001100001000 +1110111010010000 +0111111110000111 +1110010011010000 +0010001110100011 +1110001100001000 +0000011111111111 +1110110000010000 +0010001110100100 +1110001100001000 +0111100011110000 +1110110000010000 +0010001110100101 +1110001100001000 +0010001110100110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001110100111 +1110001100001000 +0001111111111101 +1110110000010000 +0010001110101000 +1110001100001000 +1110111010010000 +0000000001000011 +1110010011010000 +0010001110101001 +1110001100001000 +0000000111111111 +1110110000010000 +0010001110101010 +1110001100001000 +1110111010010000 +0111111110000111 +1110010011010000 +0010001110101011 +1110001100001000 +0000001111111110 +1110110000010000 +0010001110101100 +1110001100001000 +0111100011110000 +1110110000010000 +0010001110101101 +1110001100001000 +0010001110101110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001110101111 +1110001100001000 +0010001110110000 +1110101010001000 +0010001110110001 +1110101010001000 +0010001110110010 +1110101010001000 +0010001110110011 +1110101010001000 +0010001110110100 +1110101010001000 +0010001110110101 +1110101010001000 +0010001110110110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001110110111 +1110001100001000 +0010001110111000 +1110101010001000 +0010001110111001 +1110101010001000 +0010001110111010 +1110101010001000 +0010001110111011 +1110101010001000 +0010001110111100 +1110101010001000 +0010001110111101 +1110101010001000 +0010001110111110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001110111111 +1110001100001000 +0010001111000000 +1110101010001000 +0010001111000001 +1110101010001000 +0010001111000010 +1110101010001000 +0010001111000011 +1110101010001000 +0010001111000100 +1110101010001000 +0010001111000101 +1110101010001000 +0010001111000110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001111000111 +1110001100001000 +0010001111001000 +1110101010001000 +0000000111100011 +1110110000010000 +0010001111001001 +1110001100001000 +1110111010010000 +0011000000000111 +1110010011010000 +0010001111001010 +1110001100001000 +1110111010010000 +0000000001100001 +1110010011010000 +0010001111001011 +1110001100001000 +0011111000000000 +1110110000010000 +0010001111001100 +1110001100001000 +0010001111001101 +1110101010001000 +0010001111001110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001111001111 +1110001100001000 +0010001111010000 +1110101010001000 +0000000111100011 +1110110000010000 +0010001111010001 +1110001100001000 +1110111010010000 +0010000000000010 +1110010011010000 +0010001111010010 +1110001100001000 +1110111010010000 +0000000000100001 +1110010011010000 +0010001111010011 +1110001100001000 +0111111000000000 +1110110000010000 +0010001111010100 +1110001100001000 +0010001111010101 +1110101010001000 +0010001111010110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001111010111 +1110001100001000 +0010001111011000 +1110101010001000 +0000000111100011 +1110110000010000 +0010001111011001 +1110001100001000 +1110111010010000 +0010000111000010 +1110010011010000 +0010001111011010 +1110001100001000 +1110111010010000 +0001110000100001 +1110010011010000 +0010001111011011 +1110001100001000 +1110111010010000 +0000001111111111 +1110010011010000 +0010001111011100 +1110001100001000 +0010001111011101 +1110101010001000 +0010001111011110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001111011111 +1110001100001000 +0010001111100000 +1110101010001000 +0000000111100011 +1110110000010000 +0010001111100001 +1110001100001000 +1110111010010000 +0010000111000010 +1110010011010000 +0010001111100010 +1110001100001000 +1110111010010000 +0001110000100000 +1110010011010000 +0010001111100011 +1110001100001000 +1110111010010000 +0000011111111111 +1110010011010000 +0010001111100100 +1110001100001000 +0010001111100101 +1110101010001000 +0010001111100110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001111100111 +1110001100001000 +0010001111101000 +1110101010001000 +0000000111111111 +1110110000010000 +0010001111101001 +1110001100001000 +1110111010010000 +0010000000000010 +1110010011010000 +0010001111101010 +1110001100001000 +1110111010010000 +0001111111100000 +1110010011010000 +0010001111101011 +1110001100001000 +1110111010010000 +0000111111111111 +1110010011010000 +0010001111101100 +1110001100001000 +0010001111101101 +1110101010001000 +0010001111101110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001111101111 +1110001100001000 +0010001111110000 +1110101010001000 +0000000111111111 +1110110000010000 +0010001111110001 +1110001100001000 +1110111010010000 +0010000000000010 +1110010011010000 +0010001111110010 +1110001100001000 +1110111010010000 +0001111111100000 +1110010011010000 +0010001111110011 +1110001100001000 +1110111010010000 +0000111111111111 +1110010011010000 +0010001111110100 +1110001100001000 +0010001111110101 +1110101010001000 +0010001111110110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001111110111 +1110001100001000 +0010001111111000 +1110101010001000 +0000000111100011 +1110110000010000 +0010001111111001 +1110001100001000 +1110111010010000 +0010000111000010 +1110010011010000 +0010001111111010 +1110001100001000 +1110111010010000 +0001110000100000 +1110010011010000 +0010001111111011 +1110001100001000 +1110111010010000 +0000011111111111 +1110010011010000 +0010001111111100 +1110001100001000 +0010001111111101 +1110101010001000 +0010001111111110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010001111111111 +1110001100001000 +0010010000000000 +1110101010001000 +0000000111100011 +1110110000010000 +0010010000000001 +1110001100001000 +1110111010010000 +0010000111000010 +1110010011010000 +0010010000000010 +1110001100001000 +1110111010010000 +0001110000100001 +1110010011010000 +0010010000000011 +1110001100001000 +1110111010010000 +0000001111111111 +1110010011010000 +0010010000000100 +1110001100001000 +0010010000000101 +1110101010001000 +0010010000000110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010000000111 +1110001100001000 +0010010000001000 +1110101010001000 +0000000111100011 +1110110000010000 +0010010000001001 +1110001100001000 +1110111010010000 +0010000111000010 +1110010011010000 +0010010000001010 +1110001100001000 +1110111010010000 +0000000000100001 +1110010011010000 +0010010000001011 +1110001100001000 +0111111000000000 +1110110000010000 +0010010000001100 +1110001100001000 +0010010000001101 +1110101010001000 +0010010000001110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010000001111 +1110001100001000 +0010010000010000 +1110101010001000 +0000000111100011 +1110110000010000 +0010010000010001 +1110001100001000 +1110111010010000 +0010000111000011 +1110010011010000 +0010010000010010 +1110001100001000 +1110111010010000 +0000000001100001 +1110010011010000 +0010010000010011 +1110001100001000 +0011111000000000 +1110110000010000 +0010010000010100 +1110001100001000 +0010010000010101 +1110101010001000 +0010010000010110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010000010111 +1110001100001000 +0010010000011000 +1110101010001000 +0010010000011001 +1110101010001000 +0010010000011010 +1110101010001000 +0010010000011011 +1110101010001000 +0010010000011100 +1110101010001000 +0010010000011101 +1110101010001000 +0010010000011110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010000011111 +1110001100001000 +0010010000100000 +1110101010001000 +0010010000100001 +1110101010001000 +0010010000100010 +1110101010001000 +0010010000100011 +1110101010001000 +0010010000100100 +1110101010001000 +0010010000100101 +1110101010001000 +0010010000100110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010000100111 +1110001100001000 +0010010000101000 +1110101010001000 +0010010000101001 +1110101010001000 +0010010000101010 +1110101010001000 +0010010000101011 +1110101010001000 +0010010000101100 +1110101010001000 +0010010000101101 +1110101010001000 +0010010000101110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010000101111 +1110001100001000 +0010010000110000 +1110101010001000 +0010010000110001 +1110101010001000 +0010010000110010 +1110101010001000 +0010010000110011 +1110101010001000 +0010010000110100 +1110101010001000 +0010010000110101 +1110101010001000 +0010010000110110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010000110111 +1110001100001000 +0010010000111000 +1110101010001000 +0010010000111001 +1110101010001000 +0010010000111010 +1110101010001000 +0010010000111011 +1110101010001000 +0010010000111100 +1110101010001000 +0010010000111101 +1110101010001000 +0010010000111110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010000111111 +1110001100001000 +0010010001000000 +1110101010001000 +0010010001000001 +1110101010001000 +0010010001000010 +1110101010001000 +0010010001000011 +1110101010001000 +0010010001000100 +1110101010001000 +0010010001000101 +1110101010001000 +0010010001000110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010001000111 +1110001100001000 +0010010001001000 +1110101010001000 +0010010001001001 +1110101010001000 +0010010001001010 +1110101010001000 +0010010001001011 +1110101010001000 +0010010001001100 +1110101010001000 +0010010001001101 +1110101010001000 +0010010001001110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010001001111 +1110001100001000 +0010010001010000 +1110101010001000 +0010010001010001 +1110101010001000 +0010010001010010 +1110101010001000 +0010010001010011 +1110101010001000 +0010010001010100 +1110101010001000 +0010010001010101 +1110101010001000 +0010010001010110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010001010111 +1110001100001000 +0010010001011000 +1110101010001000 +0010010001011001 +1110101010001000 +0010010001011010 +1110101010001000 +0010010001011011 +1110101010001000 +0010010001011100 +1110101010001000 +0010010001011101 +1110101010001000 +0010010001011110 +1110111111001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010001011111 +1110001100001000 +0010010001100000 +1110101010001000 +0010010001100001 +1110101010001000 +0010010001100010 +1110101010001000 +0010010001100011 +1110101010001000 +0010010001100100 +1110101010001000 +0010010001100101 +1110101010001000 +0010010001100110 +1110111111001000 +1110111010010000 +0111100001100001 +1110010011010000 +0010010001100111 +1110001100001000 +1110111010010000 +0000010000100001 +1110010011010000 +0010010001101000 +1110001100001000 +0000011110001110 +1110110000010000 +0010010001101001 +1110001100001000 +0111100111110111 +1110110000010000 +0010010001101010 +1110001100001000 +1110111010010000 +0110000011111101 +1110010011010000 +0010010001101011 +1110001100001000 +0010011100011100 +1110110000010000 +0010010001101100 +1110001100001000 +1110111010010000 +0000110111010000 +1110010011010000 +0010010001101101 +1110001100001000 +1110111010010000 +0110001100001110 +1110010011010000 +0010010001101110 +1110001100001000 +1110111010010000 +0111011110111101 +1110010011010000 +0010010001101111 +1110001100001000 +1110111010010000 +0111011110111101 +1110010011010000 +0010010001110000 +1110001100001000 +0000010001010001 +1110110000010000 +0010010001110001 +1110001100001000 +0100010100000100 +1110110000010000 +0010010001110010 +1110001100001000 +0100010000000010 +1110110000010000 +0010010001110011 +1110001100001000 +0010100010100010 +1110110000010000 +0010010001110100 +1110001100001000 +1110111010010000 +0111010111010111 +1110010011010000 +0010010001110101 +1110001100001000 +0010001010001001 +1110110000010000 +0010010001110110 +1110001100001000 +1110111010010000 +0111010010111101 +1110010011010000 +0010010001110111 +1110001100001000 +1110111010010000 +0111011110111101 +1110010011010000 +0010010001111000 +1110001100001000 +0000010001010001 +1110110000010000 +0010010001111001 +1110001100001000 +0100010100000100 +1110110000010000 +0010010001111010 +1110001100001000 +0100010000000010 +1110110000010000 +0010010001111011 +1110001100001000 +0010100010100010 +1110110000010000 +0010010001111100 +1110001100001000 +1110111010010000 +0111010111010111 +1110010011010000 +0010010001111101 +1110001100001000 +0010001010001001 +1110110000010000 +0010010001111110 +1110001100001000 +1110111010010000 +0111010110100001 +1110010011010000 +0010010001111111 +1110001100001000 +1110111010010000 +0111010000100001 +1110010011010000 +0010010010000000 +1110001100001000 +0000011110010001 +1110110000010000 +0010010010000001 +1110001100001000 +0111100111100111 +1110110000010000 +0010010010000010 +1110001100001000 +1110111010010000 +0111101111111101 +1110010011010000 +0010010010000011 +1110001100001000 +0010100010100010 +1110110000010000 +0010010010000100 +1110001100001000 +1110111010010000 +0111010000010000 +1110010011010000 +0010010010000101 +1110001100001000 +0011111010001001 +1110110000010000 +0010010010000110 +1110001100001000 +1110111010010000 +0111010010101111 +1110010011010000 +0010010010000111 +1110001100001000 +1110111010010000 +0111010111111101 +1110010011010000 +0010010010001000 +1110001100001000 +0000010001010001 +1110110000010000 +0010010010001001 +1110001100001000 +0100010100000100 +1110110000010000 +0010010010001010 +1110001100001000 +0100010000000010 +1110110000010000 +0010010010001011 +1110001100001000 +1110111010010000 +0101011101011101 +1110010011010000 +0010010010001100 +1110001100001000 +1110111010010000 +0111010111010111 +1110010011010000 +0010010010001101 +1110001100001000 +0010001010001001 +1110110000010000 +0010010010001110 +1110001100001000 +1110111010010000 +0111011110101111 +1110010011010000 +0010010010001111 +1110001100001000 +1110111010010000 +0111010111111101 +1110010011010000 +0010010010010000 +1110001100001000 +0000010001010001 +1110110000010000 +0010010010010001 +1110001100001000 +0100010100000100 +1110110000010000 +0010010010010010 +1110001100001000 +0100010000000010 +1110110000010000 +0010010010010011 +1110001100001000 +1110111010010000 +0101011101011101 +1110010011010000 +0010010010010100 +1110001100001000 +1110111010010000 +0111010111010111 +1110010011010000 +0010010010010101 +1110001100001000 +0010001010001001 +1110110000010000 +0010010010010110 +1110001100001000 +1110111010010000 +0111100001100001 +1110010011010000 +0010010010010111 +1110001100001000 +1110111010010000 +0000010000100001 +1110010011010000 +0010010010011000 +1110001100001000 +0000010001001110 +1110110000010000 +0010010010011001 +1110001100001000 +0111100111110100 +1110110000010000 +0010010010011010 +1110001100001000 +0100010000000001 +1110110000010000 +0010010010011011 +1110001100001000 +0100011100011100 +1110110000010000 +0010010010011100 +1110001100001000 +1110111010010000 +0000110111010000 +1110010011010000 +0010010010011101 +1110001100001000 +1110111010010000 +0101110100001110 +1110010011010000 +0010010010011110 +1110001100001000 +1110111010010000 +0111111111111111 +1110010011010000 +0010010010011111 +1110001100001000 +0010010010100000 +1110101010001000 +0010010010100001 +1110101010001000 +0010010010100010 +1110101010001000 +0010010010100011 +1110101010001000 +0010010010100100 +1110101010001000 +0010010010100101 +1110101010001000 +0010010010100110 +1110111111001000 +0010010010100111 +1110111010001000 +0010010010101000 +1110111010001000 +0010010010101001 +1110111010001000 +0010010010101010 +1110111010001000 +0010010010101011 +1110111010001000 +0010010010101100 +1110111010001000 +0010010010101101 +1110111010001000 +0010010010101110 +1110111010001000 +0010010010101111 +1110111010001000 +0010010010110000 +1110111010001000 +0010010010110001 +1110111010001000 +1110111010010000 +0000000000111100 +1110010011010000 +0010010010110010 +1110001100001000 +0010010010110011 +1110111010001000 +0010010010110100 +1110111010001000 +0010010010110101 +1110111010001000 +0010010010110110 +1110111010001000 +0010010010110111 +1110111010001000 +0010010010111000 +1110111010001000 +0010010010111001 +1110111010001000 +1110111010010000 +0000011111111111 +1110010011010000 +0010010010111010 +1110001100001000 +0001111111111111 +1110110000010000 +0010010010111011 +1110001100001000 +0010010010111100 +1110111010001000 +0010010010111101 +1110111010001000 +0010010010111110 +1110111010001000 +0010010010111111 +1110111010001000 +0010010011000000 +1110111010001000 +0010010011000001 +1110111010001000 +1110111010010000 +0011111111101111 +1110010011010000 +0010010011000010 +1110001100001000 +0100011111111111 +1110110000010000 +0010010011000011 +1110001100001000 +0010010011000100 +1110111010001000 +0010010011000101 +1110111010001000 +0010010011000110 +1110111010001000 +0010010011000111 +1110111010001000 +0010010011001000 +1110111010001000 +0010010011001001 +1110111010001000 +0001001000000100 +1110110000010000 +0010010011001010 +1110001100001000 +0000000111111111 +1110110000010000 +0010010011001011 +1110001100001000 +0010010011001100 +1110111010001000 +0010010011001101 +1110111010001000 +0010010011001110 +1110111010001000 +0010010011001111 +1110111010001000 +0010010011010000 +1110111010001000 +1110111010010000 +0000000000000001 +1110010011010000 +0010010011010001 +1110001100001000 +0100000010000001 +1110110000010000 +0010010011010010 +1110001100001000 +0010100001111111 +1110110000010000 +0010010011010011 +1110001100001000 +0010010011010100 +1110111010001000 +0010010011010101 +1110111010001000 +0010010011010110 +1110111010001000 +0010010011010111 +1110111010001000 +0010010011011000 +1110111010001000 +1110111010010000 +0000000000000110 +1110010011010000 +0010010011011001 +1110001100001000 +1110111010010000 +0101001111011111 +1110010011010000 +0010010011011010 +1110001100001000 +0000011000011111 +1110110000010000 +0010010011011011 +1110001100001000 +0010010011011100 +1110111010001000 +0010010011011101 +1110111010001000 +0010010011011110 +1110111010001000 +0010010011011111 +1110111010001000 +0010010011100000 +1110111010001000 +1110111010010000 +0000000000001101 +1110010011010000 +0010010011100001 +1110001100001000 +0010000000000010 +1110110000010000 +0010010011100010 +1110001100001000 +0001000010011111 +1110110000010000 +0010010011100011 +1110001100001000 +0010010011100100 +1110111010001000 +0010010011100101 +1110111010001000 +0010010011100110 +1110111010001000 +0010010011100111 +1110111010001000 +0010010011101000 +1110111010001000 +1110111010010000 +0000000000011001 +1110010011010000 +0010010011101001 +1110001100001000 +1110111010010000 +0111110111110111 +1110010011010000 +0010010011101010 +1110001100001000 +0000000100101111 +1110110000010000 +0010010011101011 +1110001100001000 +0010010011101100 +1110111010001000 +0010010011101101 +1110111010001000 +0010010011101110 +1110111010001000 +0010010011101111 +1110111010001000 +0010010011110000 +1110111010001000 +1110111010010000 +0000000000011110 +1110010011010000 +0010010011110001 +1110001100001000 +0011000000000000 +1110110000010000 +0010010011110010 +1110001100001000 +0100100100001111 +1110110000010000 +0010010011110011 +1110001100001000 +0010010011110100 +1110111010001000 +0010010011110101 +1110111010001000 +0010010011110110 +1110111010001000 +0010010011110111 +1110111010001000 +0010010011111000 +1110111010001000 +1110111010010000 +0000000000110011 +1110010011010000 +0010010011111001 +1110001100001000 +0100010000000000 +1110110000010000 +0010010011111010 +1110001100001000 +0000001001000111 +1110110000010000 +0010010011111011 +1110001100001000 +0010010011111100 +1110111010001000 +0010010011111101 +1110111010001000 +0010010011111110 +1110111010001000 +0010010011111111 +1110111010001000 +0010010100000000 +1110111010001000 +1110111010010000 +0000000000111001 +1110010011010000 +0010010100000001 +1110001100001000 +1110111010010000 +0111111111011111 +1110010011010000 +0010010100000010 +1110001100001000 +0000000010010111 +1110110000010000 +0010010100000011 +1110001100001000 +0010010100000100 +1110111010001000 +0010010100000101 +1110111010001000 +0010010100000110 +1110111010001000 +0010010100000111 +1110111010001000 +0010010100001000 +1110111010001000 +1110111010010000 +0000000001101101 +1110010011010000 +0010010100001001 +1110001100001000 +0010100100000000 +1110110000010000 +0010010100001010 +1110001100001000 +0100110010000011 +1110110000010000 +0010010100001011 +1110001100001000 +0010010100001100 +1110111010001000 +0010010100001101 +1110111010001000 +0010010100001110 +1110111010001000 +0010010100001111 +1110111010001000 +0010010100010000 +1110111010001000 +1110111010010000 +0000000001100110 +1110010011010000 +0010010100010001 +1110001100001000 +1110111010010000 +0111111111111101 +1110010011010000 +0010010100010010 +1110001100001000 +0000000001100011 +1110110000010000 +0010010100010011 +1110001100001000 +0010010100010100 +1110111010001000 +0010010100010101 +1110111010001000 +0010010100010110 +1110111010001000 +0010010100010111 +1110111010001000 +0010010100011000 +1110111010001000 +1110111010010000 +0000000000110011 +1110010011010000 +0010010100011001 +1110001100001000 +1110111010010000 +0010110111110111 +1110010011010000 +0010010100011010 +1110001100001000 +0010001100001011 +1110110000010000 +0010010100011011 +1110001100001000 +0010010100011100 +1110111010001000 +0010010100011101 +1110111010001000 +0010010100011110 +1110111010001000 +0010010100011111 +1110111010001000 +0010010100100000 +1110111010001000 +1110111010010000 +0000000001001001 +1110010011010000 +0010010100100001 +1110001100001000 +0001000010000001 +1110110000010000 +0010010100100010 +1110001100001000 +0000100010010011 +1110110000010000 +0010010100100011 +1110001100001000 +0010010100100100 +1110111010001000 +0010010100100101 +1110111010001000 +0010010100100110 +1110111010001000 +0010010100100111 +1110111010001000 +0010010100101000 +1110111010001000 +1110111010010000 +0000000001001100 +1110010011010000 +0010010100101001 +1110001100001000 +0110010000100000 +1110110000010000 +0010010100101010 +1110001100001000 +0100001001000011 +1110110000010000 +0010010100101011 +1110001100001000 +0010010100101100 +1110111010001000 +0010010100101101 +1110111010001000 +0010010100101110 +1110111010001000 +0010010100101111 +1110111010001000 +0010010100110000 +1110111010001000 +1110111010010000 +0000000000110110 +1110010011010000 +0010010100110001 +1110001100001000 +0000100100001000 +1110110000010000 +0010010100110010 +1110001100001000 +0001000100110011 +1110110000010000 +0010010100110011 +1110001100001000 +0010010100110100 +1110111010001000 +0010010100110101 +1110111010001000 +0010010100110110 +1110111010001000 +0010010100110111 +1110111010001000 +0010010100111000 +1110111010001000 +1110111010010000 +0000000001000011 +1110010011010000 +0010010100111001 +1110001100001000 +1110111010010000 +0011011111111101 +1110010011010000 +0010010100111010 +1110001100001000 +0000010010001001 +1110110000010000 +0010010100111011 +1110001100001000 +0010010100111100 +1110111010001000 +0010010100111101 +1110111010001000 +0010010100111110 +1110111010001000 +0010010100111111 +1110111010001000 +0010010101000000 +1110111010001000 +1110111010010000 +0000000001011001 +1110010011010000 +0010010101000001 +1110001100001000 +0100001000010000 +1110110000010000 +0010010101000010 +1110001100001000 +0100001001001001 +1110110000010000 +0010010101000011 +1110001100001000 +0010010101000100 +1110111010001000 +0010010101000101 +1110111010001000 +0010010101000110 +1110111010001000 +0010010101000111 +1110111010001000 +0010010101001000 +1110111010001000 +1110111010010000 +0000000000100110 +1110010011010000 +0010010101001001 +1110001100001000 +0011000001000001 +1110110000010000 +0010010101001010 +1110001100001000 +0001100001010011 +1110110000010000 +0010010101001011 +1110001100001000 +0111111111111111 +1110110000010000 +0010010101001100 +1110001100001000 +0010010101001101 +1110111010001000 +0010010101001110 +1110111010001000 +0010010101001111 +1110111010001000 +0010010101010000 +1110111010001000 +1110111010010000 +0000000000100100 +1110010011010000 +0010010101010001 +1110001100001000 +0010010000001000 +1110110000010000 +0010010101010010 +1110001100001000 +0010000100010100 +1110110000010000 +0010010101010011 +1110001100001000 +0111111111111111 +1110110000010000 +0010010101010100 +1110001100001000 +0010010101010101 +1110111010001000 +0010010101010110 +1110111010001000 +0010010101010111 +1110111010001000 +0010010101011000 +1110111010001000 +1110111010010000 +0000000000011001 +1110010011010000 +0010010101011001 +1110001100001000 +1110111010010000 +0111011001010101 +1110010011010000 +0010010101011010 +1110001100001000 +1110111010010000 +0111001001110010 +1110010011010000 +0010010101011011 +1110001100001000 +1110111010010000 +0010000000000000 +1110010011010000 +0010010101011100 +1110001100001000 +0010010101011101 +1110111010001000 +0010010101011110 +1110111010001000 +0010010101011111 +1110111010001000 +0010010101100000 +1110111010001000 +1110111010010000 +0000000001001011 +1110010011010000 +0010010101100001 +1110001100001000 +1110111010010000 +0011011011011011 +1110010011010000 +0010010101100010 +1110001100001000 +1110111010010000 +0000110100110110 +1110010011010000 +0010010101100011 +1110001100001000 +0011111111111111 +1110110000010000 +0010010101100100 +1110001100001000 +0010010101100101 +1110111010001000 +0010010101100110 +1110111010001000 +0010010101100111 +1110111010001000 +0010010101101000 +1110111010001000 +1110111010010000 +0000000001100110 +1110010011010000 +0010010101101001 +1110001100001000 +0111111001000111 +1110110000010000 +0010010101101010 +1110001100001000 +0101101001011000 +1110110000010000 +0010010101101011 +1110001100001000 +1110111010010000 +0110000000000000 +1110010011010000 +0010010101101100 +1110001100001000 +0010010101101101 +1110111010001000 +0010010101101110 +1110111010001000 +0010010101101111 +1110111010001000 +0010010101110000 +1110111010001000 +1110111010010000 +0000000010010100 +1110010011010000 +0010010101110001 +1110001100001000 +0010011111000001 +1110110000010000 +0010010101110010 +1110001100001000 +1110111010010000 +0000100010111001 +1110010011010000 +0010010101110011 +1110001100001000 +0101111111111111 +1110110000010000 +0010010101110100 +1110001100001000 +0010010101110101 +1110111010001000 +0010010101110110 +1110111010001000 +0010010101110111 +1110111010001000 +0010010101111000 +1110111010001000 +1110111010010000 +0000000001010100 +1110010011010000 +0010010101111001 +1110001100001000 +1110111010010000 +0100000001001100 +1110010011010000 +0010010101111010 +1110001100001000 +1110111010010000 +0100001001001000 +1110010011010000 +0010010101111011 +1110001100001000 +0101111111111111 +1110110000010000 +0010010101111100 +1110001100001000 +0010010101111101 +1110111010001000 +0010010101111110 +1110111010001000 +0010010101111111 +1110111010001000 +0010010110000000 +1110111010001000 +1110111010010000 +0000000100100101 +1110010011010000 +0010010110000001 +1110001100001000 +1110111010010000 +0000011001111001 +1110010011010000 +0010010110000010 +1110001100001000 +0100010110010011 +1110110000010000 +0010010110000011 +1110001100001000 +0001111111111111 +1110110000010000 +0010010110000100 +1110001100001000 +0010010110000101 +1110111010001000 +0010010110000110 +1110111010001000 +0010010110000111 +1110111010001000 +0010010110001000 +1110111010001000 +1110111010010000 +0000000110101001 +1110010011010000 +0010010110001001 +1110001100001000 +1110111010010000 +0011001100111110 +1110010011010000 +0010010110001010 +1110001100001000 +0111010000011000 +1110110000010000 +0010010110001011 +1110001100001000 +1110111010010000 +0100000000000000 +1110010011010000 +0010010110001100 +1110001100001000 +0010010110001101 +1110111010001000 +0010010110001110 +1110111010001000 +0010010110001111 +1110111010001000 +0010010110010000 +1110111010001000 +1110111010010000 +0000000010001010 +1110010011010000 +0010010110010001 +1110001100001000 +1110111010010000 +0100100110001110 +1110010011010000 +0010010110010010 +1110001100001000 +0000001001001100 +1110110000010000 +0010010110010011 +1110001100001000 +0011111111111111 +1110110000010000 +0010010110010100 +1110001100001000 +0010010110010101 +1110111010001000 +0010010110010110 +1110111010001000 +0010010110010111 +1110111010001000 +0010010110011000 +1110111010001000 +1110111010010000 +0000000101000100 +1110010011010000 +0010010110011001 +1110001100001000 +0010001100100100 +1110110000010000 +0010010110011010 +1110001100001000 +0000100001000101 +1110110000010000 +0010010110011011 +1110001100001000 +0101111111111111 +1110110000010000 +0010010110011100 +1110001100001000 +0010010110011101 +1110111010001000 +0010010110011110 +1110111010001000 +0010010110011111 +1110111010001000 +0010010110100000 +1110111010001000 +1110111010010000 +0000000101010111 +1110010011010000 +0010010110100001 +1110001100001000 +0000100010100010 +1110110000010000 +0010010110100010 +1110001100001000 +0010000100110100 +1110110000010000 +0010010110100011 +1110001100001000 +0111111111111111 +1110110000010000 +0010010110100100 +1110001100001000 +0010010110100101 +1110111010001000 +0010010110100110 +1110111010001000 +0010010110100111 +1110111010001000 +0010010110101000 +1110111010001000 +1110111010010000 +0000000011000011 +1110010011010000 +0010010110101001 +1110001100001000 +1110111010010000 +0011111101100110 +1110010011010000 +0010010110101010 +1110001100001000 +1110111010010000 +0111101101101001 +1110010011010000 +0010010110101011 +1110001100001000 +0011111111111111 +1110110000010000 +0010010110101100 +1110001100001000 +0010010110101101 +1110111010001000 +0010010110101110 +1110111010001000 +0010010110101111 +1110111010001000 +0010010110110000 +1110111010001000 +1110111010010000 +0000000010110001 +1110010011010000 +0010010110110001 +1110001100001000 +0100011001100000 +1110110000010000 +0010010110110010 +1110001100001000 +0100010011001000 +1110110000010000 +0010010110110011 +1110001100001000 +1110111010010000 +0100000000000000 +1110010011010000 +0010010110110100 +1110001100001000 +0010010110110101 +1110111010001000 +0010010110110110 +1110111010001000 +0010010110110111 +1110111010001000 +0010010110111000 +1110111010001000 +1110111010010000 +0000000010100100 +1110010011010000 +0010010110111001 +1110001100001000 +0011000110010010 +1110110000010000 +0010010110111010 +1110001100001000 +0101000100101100 +1110110000010000 +0010010110111011 +1110001100001000 +0111111111111111 +1110110000010000 +0010010110111100 +1110001100001000 +0010010110111101 +1110111010001000 +0010010110111110 +1110111010001000 +0010010110111111 +1110111010001000 +0010010111000000 +1110111010001000 +1110111010010000 +0000000001101100 +1110010011010000 +0010010111000001 +1110001100001000 +1110111010010000 +0111011101101110 +1110010011010000 +0010010111000010 +1110001100001000 +0011000100100110 +1110110000010000 +0010010111000011 +1110001100001000 +0111111111111111 +1110110000010000 +0010010111000100 +1110001100001000 +0010010111000101 +1110111010001000 +0010010111000110 +1110111010001000 +0010010111000111 +1110111010001000 +0010010111001000 +1110111010001000 +1110111010010000 +0000000001000011 +1110010011010000 +0010010111001001 +1110001100001000 +1110111010010000 +0011010100011010 +1110010011010000 +0010010111001010 +1110001100001000 +1110111010010000 +0011001100101101 +1110010011010000 +0010010111001011 +1110001100001000 +0010010111001100 +1110111010001000 +0010010111001101 +1110111010001000 +0010010111001110 +1110111010001000 +0010010111001111 +1110111010001000 +0010010111010000 +1110111010001000 +1110111010010000 +0000000001110010 +1110010011010000 +0010010111010001 +1110001100001000 +0110001101111101 +1110110000010000 +0010010111010010 +1110001100001000 +1110111010010000 +0011011110110010 +1110010011010000 +0010010111010011 +1110001100001000 +0010010111010100 +1110111010001000 +0010010111010101 +1110111010001000 +0010010111010110 +1110111010001000 +0010010111010111 +1110111010001000 +0010010111011000 +1110111010001000 +1110111010010000 +0000000000010010 +1110010011010000 +0010010111011001 +1110001100001000 +0010110011011010 +1110110000010000 +0010010111011010 +1110001100001000 +0010011100100111 +1110110000010000 +0010010111011011 +1110001100001000 +0010010111011100 +1110111010001000 +0010010111011101 +1110111010001000 +0010010111011110 +1110111010001000 +0010010111011111 +1110111010001000 +0010010111100000 +1110111010001000 +1110111010010000 +0000000000100100 +1110010011010000 +0010010111100001 +1110001100001000 +1110111010010000 +0110110110010001 +1110010011010000 +0010010111100010 +1110001100001000 +1110111010010000 +0110110110010100 +1110010011010000 +0010010111100011 +1110001100001000 +0010010111100100 +1110111010001000 +0010010111100101 +1110111010001000 +0010010111100110 +1110111010001000 +0010010111100111 +1110111010001000 +0010010111101000 +1110111010001000 +1110111010010000 +0000000000001101 +1110010011010000 +0010010111101001 +1110001100001000 +1110111010010000 +0010010011001011 +1110010011010000 +0010010111101010 +1110001100001000 +1110111010010000 +0011010101100100 +1110010011010000 +0010010111101011 +1110001100001000 +0010010111101100 +1110111010001000 +0010010111101101 +1110111010001000 +0010010111101110 +1110111010001000 +0010010111101111 +1110111010001000 +0010010111110000 +1110111010001000 +1110111010010000 +0000000000000001 +1110010011010000 +0010010111110001 +1110001100001000 +0110100110010010 +1110110000010000 +0010010111110010 +1110001100001000 +0010100110010111 +1110110000010000 +0010010111110011 +1110001100001000 +0010010111110100 +1110111010001000 +0010010111110101 +1110111010001000 +0010010111110110 +1110111010001000 +0010010111110111 +1110111010001000 +0010010111111000 +1110111010001000 +1110111010010000 +0000000000000010 +1110010011010000 +0010010111111001 +1110001100001000 +1110111010010000 +0110010110110110 +1110010011010000 +0010010111111010 +1110001100001000 +1110111010010000 +0101001110011000 +1110010011010000 +0010010111111011 +1110001100001000 +0010010111111100 +1110111010001000 +0010010111111101 +1110111010001000 +0010010111111110 +1110111010001000 +0010010111111111 +1110111010001000 +0010011000000000 +1110111010001000 +1110111010010000 +0000000000000010 +1110010011010000 +0010011000000001 +1110001100001000 +1110111010010000 +0110100100010010 +1110010011010000 +0010011000000010 +1110001100001000 +1110111010010000 +0100100110110000 +1110010011010000 +0010011000000011 +1110001100001000 +0010011000000100 +1110111010001000 +0010011000000101 +1110111010001000 +0010011000000110 +1110111010001000 +0010011000000111 +1110111010001000 +0010011000001000 +1110111010001000 +1110111010010000 +0000000000000001 +1110010011010000 +0010011000001001 +1110001100001000 +0110011111110110 +1110110000010000 +0010011000001010 +1110001100001000 +1110111010010000 +0010111010000000 +1110010011010000 +0010011000001011 +1110001100001000 +0010011000001100 +1110111010001000 +0010011000001101 +1110111010001000 +0010011000001110 +1110111010001000 +0010011000001111 +1110111010001000 +0010011000010000 +1110111010001000 +0010011000010001 +1110111010001000 +0110100100010010 +1110110000010000 +0010011000010010 +1110001100001000 +0000000100101111 +1110110000010000 +0010011000010011 +1110001100001000 +0010011000010100 +1110111010001000 +0010011000010101 +1110111010001000 +0010011000010110 +1110111010001000 +0010011000010111 +1110111010001000 +0010011000011000 +1110111010001000 +0010011000011001 +1110111010001000 +1110111010010000 +0110011001101111 +1110010011010000 +0010011000011010 +1110001100001000 +0110110011011111 +1110110000010000 +0010011000011011 +1110001100001000 +0010011000011100 +1110111010001000 +0010011000011101 +1110111010001000 +0010011000011110 +1110111010001000 +0010011000011111 +1110111010001000 +0010011000100000 +1110111010001000 +0010011000100001 +1110111010001000 +1110111010010000 +0001100100011010 +1110010011010000 +0010011000100010 +1110001100001000 +1110111010010000 +0110110010100000 +1110010011010000 +0010011000100011 +1110001100001000 +0010011000100100 +1110111010001000 +0010011000100101 +1110111010001000 +0010011000100110 +1110111010001000 +0010011000100111 +1110111010001000 +0010011000101000 +1110111010001000 +0010011000101001 +1110111010001000 +1110111010010000 +0100110110010010 +1110010011010000 +0010011000101010 +1110001100001000 +1110111010010000 +0110110010010000 +1110010011010000 +0010011000101011 +1110001100001000 +0010011000101100 +1110111010001000 +0010011000101101 +1110111010001000 +0010011000101110 +1110111010001000 +0010011000101111 +1110111010001000 +0010011000110000 +1110111010001000 +0010011000110001 +1110111010001000 +1110111010010000 +0010010011000101 +1110010011010000 +0010011000110010 +1110001100001000 +0110110010101111 +1110110000010000 +0010011000110011 +1110001100001000 +0010011000110100 +1110111010001000 +0010011000110101 +1110111010001000 +0010011000110110 +1110111010001000 +0010011000110111 +1110111010001000 +0010011000111000 +1110111010001000 +0010011000111001 +1110111010001000 +1110111010010000 +0001001001101100 +1110010011010000 +0010011000111010 +1110001100001000 +0010001110111110 +1110110000010000 +0010011000111011 +1110001100001000 +0010011000111100 +1110111010001000 +0010011000111101 +1110111010001000 +0010011000111110 +1110111010001000 +0010011000111111 +1110111010001000 +0010011001000000 +1110111010001000 +0010011001000001 +1110111010001000 +1110111010010000 +0001001100110011 +1110010011010000 +0010011001000010 +1110001100001000 +1110111010010000 +0110010100110000 +1110010011010000 +0010011001000011 +1110001100001000 +1110111010010000 +0100000000000000 +1110010011010000 +0010011001000100 +1110001100001000 +0010011001000101 +1110111010001000 +0010011001000110 +1110111010001000 +0010011001000111 +1110111010001000 +0010011001001000 +1110111010001000 +0010011001001001 +1110111010001000 +1110111010010000 +0000010011011111 +1110010011010000 +0010011001001010 +1110001100001000 +0000101101001111 +1110110000010000 +0010011001001011 +1110001100001000 +0010011001001100 +1110111010001000 +0010011001001101 +1110111010001000 +0010011001001110 +1110111010001000 +0010011001001111 +1110111010001000 +0010011001010000 +1110111010001000 +0010011001010001 +1110111010001000 +1110111010010000 +0000000010010100 +1110010011010000 +0010011001010010 +1110001100001000 +0110011100111111 +1110110000010000 +0010011001010011 +1110001100001000 +0111111111111111 +1110110000010000 +0010011001010100 +1110001100001000 +0010011001010101 +1110111010001000 +0010011001010110 +1110111010001000 +0010011001010111 +1110111010001000 +0010011001011000 +1110111010001000 +0010011001011001 +1110111010001000 +1110111010010000 +0010001000110110 +1110010011010000 +0010011001011010 +1110001100001000 +0011011010101111 +1110110000010000 +0010011001011011 +1110001100001000 +1110111010010000 +0001000000000000 +1110010011010000 +0010011001011100 +1110001100001000 +0010011001011101 +1110111010001000 +0010011001011110 +1110111010001000 +0010011001011111 +1110111010001000 +0010011001100000 +1110111010001000 +0010011001100001 +1110111010001000 +1110111010010000 +0000100001001001 +1110010011010000 +0010011001100010 +1110001100001000 +1110111010010000 +0010001101100001 +1110010011010000 +0010011001100011 +1110001100001000 +0010011001100100 +1110111010001000 +0010011001100101 +1110111010001000 +0010011001100110 +1110111010001000 +0010011001100111 +1110111010001000 +0010011001101000 +1110111010001000 +0010011001101001 +1110111010001000 +1110111010010000 +0000000100001001 +1110010011010000 +0010011001101010 +1110001100001000 +1110111010010000 +0010011010000000 +1110010011010000 +0010011001101011 +1110001100001000 +1110111010010000 +0010000000000000 +1110010011010000 +0010011001101100 +1110001100001000 +0010011001101101 +1110111010001000 +0010011001101110 +1110111010001000 +0010011001101111 +1110111010001000 +0010011001110000 +1110111010001000 +0010011001110001 +1110111010001000 +1110111010010000 +0011000000100100 +1110010011010000 +0010011001110010 +1110001100001000 +0110110101001111 +1110110000010000 +0010011001110011 +1110001100001000 +0010011001110100 +1110111010001000 +0010011001110101 +1110111010001000 +0010011001110110 +1110111010001000 +0010011001110111 +1110111010001000 +0010011001111000 +1110111010001000 +0010011001111001 +1110111010001000 +1110111010010000 +0000110010000000 +1110010011010000 +0010011001111010 +1110001100001000 +1110111010010000 +0001111011000000 +1110010011010000 +0010011001111011 +1110001100001000 +0111111111111111 +1110110000010000 +0010011001111100 +1110001100001000 +0010011001111101 +1110111010001000 +0010011001111110 +1110111010001000 +0010011001111111 +1110111010001000 +0010011010000000 +1110111010001000 +0010011010000001 +1110111010001000 +1110111010010000 +0000001001000010 +1110010011010000 +0010011010000010 +1110001100001000 +1110111010010000 +0100101101000000 +1110010011010000 +0010011010000011 +1110001100001000 +0010011010000100 +1110111010001000 +0010011010000101 +1110111010001000 +0010011010000110 +1110111010001000 +0010011010000111 +1110111010001000 +0010011010001000 +1110111010001000 +0010011010001001 +1110111010001000 +1110111010010000 +0001100100100100 +1110010011010000 +0010011010001010 +1110001100001000 +0001011010111111 +1110110000010000 +0010011010001011 +1110001100001000 +0010011010001100 +1110111010001000 +0010011010001101 +1110111010001000 +0010011010001110 +1110111010001000 +0010011010001111 +1110111010001000 +0010011010010000 +1110111010001000 +0010011010010001 +1110111010001000 +1110111010010000 +0001000110101001 +1110010011010000 +0010011010010010 +1110001100001000 +0110000101111111 +1110110000010000 +0010011010010011 +1110001100001000 +0010011010010100 +1110111010001000 +0010011010010101 +1110111010001000 +0010011010010110 +1110111010001000 +0010011010010111 +1110111010001000 +0010011010011000 +1110111010001000 +0010011010011001 +1110111010001000 +1110111010010000 +0000110001001110 +1110010011010000 +0010011010011010 +1110001100001000 +1110111010010000 +0110011010000000 +1110010011010000 +0010011010011011 +1110001100001000 +0010011010011100 +1110111010001000 +0010011010011101 +1110111010001000 +0010011010011110 +1110111010001000 +0010011010011111 +1110111010001000 +0010011010100000 +1110111010001000 +0010011010100001 +1110111010001000 +1110111010010000 +0000001001010011 +1110010011010000 +0010011010100010 +1110001100001000 +1110111010010000 +0110100000000000 +1110010011010000 +0010011010100011 +1110001100001000 +0010011010100100 +1110111010001000 +0010011010100101 +1110111010001000 +0010011010100110 +1110111010001000 +0010011010100111 +1110111010001000 +0010011010101000 +1110111010001000 +0010011010101001 +1110111010001000 +1110111010010000 +0000000010111101 +1110010011010000 +0010011010101010 +1110001100001000 +0111111111111111 +1110110000010000 +0010011010101011 +1110001100001000 +0010011010101100 +1110111010001000 +0010011010101101 +1110111010001000 +0010011010101110 +1110111010001000 +0000000000000010 +1110101010000111 diff --git a/web-ide-main/projects/src/samples/hack/Max.asm b/web-ide-main/projects/src/samples/hack/Max.asm new file mode 100644 index 0000000..63a3afc --- /dev/null +++ b/web-ide-main/projects/src/samples/hack/Max.asm @@ -0,0 +1,21 @@ +// Computes R2 = max(R0, R1) + + @R0 + D=M // D = first number + @R1 + D=D-M // D = first number - second number + @OUTPUT_FIRST + D;JGT // if D>0 (first is greater) goto output_first + @R1 + D=M // D = second number + @OUTPUT_D + 0;JMP // goto output_d +(OUTPUT_FIRST) + @R0 + D=M // D = first number +(OUTPUT_D) + @R2 + M=D // M[2] = D (greatest number) +(INFINITE_LOOP) + @INFINITE_LOOP + 0;JMP \ No newline at end of file diff --git a/web-ide-main/projects/src/samples/hack/Max.tst b/web-ide-main/projects/src/samples/hack/Max.tst new file mode 100644 index 0000000..ebdfda4 --- /dev/null +++ b/web-ide-main/projects/src/samples/hack/Max.tst @@ -0,0 +1,6 @@ +load Max.asm; +set %0 16548, set %1 12944; + +repeat 14 { + tick, tock; +} diff --git a/web-ide-main/projects/src/samples/hack/Mult.asm b/web-ide-main/projects/src/samples/hack/Mult.asm new file mode 100644 index 0000000..2ebc71c --- /dev/null +++ b/web-ide-main/projects/src/samples/hack/Mult.asm @@ -0,0 +1,23 @@ +// Multiplies R0 and R1 and stores the result in R2. +// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.) +// The algorithm is based on repetitive addition. + + @R2 // Zero the partial product + M=0 + +(LOOP) + @R1 + MD=M-1 // Decrement and test the multiplier + @HALT + D;JLT + + @R0 // Add the multiplicand to the partial product + D=M + @R2 + M=D+M + @LOOP + 0;JMP + +(HALT) + @HALT + 0;JMP \ No newline at end of file diff --git a/web-ide-main/projects/src/samples/hack/Pong.asm b/web-ide-main/projects/src/samples/hack/Pong.asm new file mode 100644 index 0000000..0a6e490 --- /dev/null +++ b/web-ide-main/projects/src/samples/hack/Pong.asm @@ -0,0 +1,28375 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/06/pong/Pong.asm + +// The Pong game program was originally written in the high-level Jack language. +// The Jack code was then translated by the Jack compiler into VM code. +// The VM code was then translated by the VM translator into the Hack +// assembly code shown here. + +@256 +D=A +@SP +M=D +@133 +0;JMP +@R15 +M=D +@SP +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@END_EQ +D;JNE +@SP +A=M-1 +M=-1 +(END_EQ) +@R15 +A=M +0;JMP +@R15 +M=D +@SP +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@END_GT +D;JLE +@SP +A=M-1 +M=-1 +(END_GT) +@R15 +A=M +0;JMP +@R15 +M=D +@SP +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@END_LT +D;JGE +@SP +A=M-1 +M=-1 +(END_LT) +@R15 +A=M +0;JMP +@5 +D=A +@LCL +A=M-D +D=M +@R13 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +D=A +@SP +M=D+1 +@LCL +D=M +@R14 +AM=D-1 +D=M +@THAT +M=D +@R14 +AM=M-1 +D=M +@THIS +M=D +@R14 +AM=M-1 +D=M +@ARG +M=D +@R14 +AM=M-1 +D=M +@LCL +M=D +@R13 +A=M +0;JMP +@SP +A=M +M=D +@LCL +D=M +@SP +AM=M+1 +M=D +@ARG +D=M +@SP +AM=M+1 +M=D +@THIS +D=M +@SP +AM=M+1 +M=D +@THAT +D=M +@SP +AM=M+1 +M=D +@4 +D=A +@R13 +D=D+M +@SP +D=M-D +@ARG +M=D +@SP +MD=M+1 +@LCL +M=D +@R14 +A=M +0;JMP +@0 +D=A +@R13 +M=D +@sys.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL0 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL0) +(ball.new) +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL1 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL1) +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@10 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +D=M +@11 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@12 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +D=M +@13 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL2 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL2) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ball.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL3 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL3) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.show) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL4 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL4) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL5 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL5) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.hide) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL6 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL6) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL7 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL7) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.draw) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL8 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL8) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.getleft) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ball.getright) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +(ball.setdestination) +@3 +D=A +(LOOP_ball.setdestination) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_ball.setdestination +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL9 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL9) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL10 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL10) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT0 +D=A +@38 +0;JMP +(RET_ADDRESS_LT0) +@THIS +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.setdestination$if_true0 +D;JNE +@ball.setdestination$if_false0 +0;JMP +(ball.setdestination$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT1 +D=A +@38 +0;JMP +(RET_ADDRESS_LT1) +@THIS +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT2 +D=A +@38 +0;JMP +(RET_ADDRESS_LT2) +@THIS +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ball.setdestination$if_end0 +0;JMP +(ball.setdestination$if_false0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT3 +D=A +@38 +0;JMP +(RET_ADDRESS_LT3) +@THIS +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT4 +D=A +@38 +0;JMP +(RET_ADDRESS_LT4) +@THIS +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +(ball.setdestination$if_end0) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL11 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL11) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL12 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL12) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL13 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL13) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.move) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.hide +D=A +@R14 +M=D +@RET_ADDRESS_CALL14 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL14) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT5 +D=A +@38 +0;JMP +(RET_ADDRESS_LT5) +@SP +AM=M-1 +D=M +@ball.move$if_true0 +D;JNE +@ball.move$if_false0 +0;JMP +(ball.move$if_true0) +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ball.move$if_end0 +0;JMP +(ball.move$if_false0) +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true1 +D;JNE +@ball.move$if_false1 +0;JMP +(ball.move$if_true1) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true2 +D;JNE +@ball.move$if_false2 +0;JMP +(ball.move$if_true2) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ball.move$if_end2 +0;JMP +(ball.move$if_false2) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_end2) +@ball.move$if_end1 +0;JMP +(ball.move$if_false1) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true3 +D;JNE +@ball.move$if_false3 +0;JMP +(ball.move$if_true3) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ball.move$if_end3 +0;JMP +(ball.move$if_false3) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_end3) +(ball.move$if_end1) +(ball.move$if_end0) +@THIS +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true4 +D;JNE +@ball.move$if_false4 +0;JMP +(ball.move$if_true4) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true5 +D;JNE +@ball.move$if_false5 +0;JMP +(ball.move$if_true5) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ball.move$if_end5 +0;JMP +(ball.move$if_false5) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_end5) +@ball.move$if_end4 +0;JMP +(ball.move$if_false4) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true6 +D;JNE +@ball.move$if_false6 +0;JMP +(ball.move$if_true6) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ball.move$if_end6 +0;JMP +(ball.move$if_false6) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_end6) +(ball.move$if_end4) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT0 +D=A +@22 +0;JMP +(RET_ADDRESS_GT0) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true7 +D;JNE +@ball.move$if_false7 +0;JMP +(ball.move$if_true7) +@SP +M=M+1 +A=M-1 +M=1 +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_false7) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@11 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT6 +D=A +@38 +0;JMP +(RET_ADDRESS_LT6) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true8 +D;JNE +@ball.move$if_false8 +0;JMP +(ball.move$if_true8) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@11 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_false8) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@12 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT1 +D=A +@22 +0;JMP +(RET_ADDRESS_GT1) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true9 +D;JNE +@ball.move$if_false9 +0;JMP +(ball.move$if_true9) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@12 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_false9) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@13 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT7 +D=A +@38 +0;JMP +(RET_ADDRESS_LT7) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true10 +D;JNE +@ball.move$if_false10 +0;JMP +(ball.move$if_true10) +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@13 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_false10) +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL15 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL15) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ball.bounce) +@5 +D=A +(LOOP_ball.bounce) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_ball.bounce +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL16 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL16) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL17 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL17) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ0 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ0) +@SP +AM=M-1 +D=M +@ball.bounce$if_true0 +D;JNE +@ball.bounce$if_false0 +0;JMP +(ball.bounce$if_true0) +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ball.bounce$if_end0 +0;JMP +(ball.bounce$if_false0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT8 +D=A +@38 +0;JMP +(RET_ADDRESS_LT8) +@SP +A=M-1 +M=!M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_EQ1 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ1) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT9 +D=A +@38 +0;JMP +(RET_ADDRESS_LT9) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_EQ2 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ2) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@ball.bounce$if_true1 +D;JNE +@ball.bounce$if_false1 +0;JMP +(ball.bounce$if_true1) +@20 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ball.bounce$if_end1 +0;JMP +(ball.bounce$if_false1) +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +(ball.bounce$if_end1) +(ball.bounce$if_end0) +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_EQ3 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ3) +@SP +AM=M-1 +D=M +@ball.bounce$if_true2 +D;JNE +@ball.bounce$if_false2 +0;JMP +(ball.bounce$if_true2) +@506 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL18 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL18) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL19 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL19) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL20 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL20) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ball.bounce$if_end2 +0;JMP +(ball.bounce$if_false2) +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ4 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ4) +@SP +AM=M-1 +D=M +@ball.bounce$if_true3 +D;JNE +@ball.bounce$if_false3 +0;JMP +(ball.bounce$if_true3) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL21 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL21) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL22 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL22) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL23 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL23) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ball.bounce$if_end3 +0;JMP +(ball.bounce$if_false3) +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ5 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ5) +@SP +AM=M-1 +D=M +@ball.bounce$if_true4 +D;JNE +@ball.bounce$if_false4 +0;JMP +(ball.bounce$if_true4) +@250 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL24 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL24) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL25 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL25) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL26 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL26) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ball.bounce$if_end4 +0;JMP +(ball.bounce$if_false4) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL27 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL27) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL28 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL28) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL29 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL29) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(ball.bounce$if_end4) +(ball.bounce$if_end3) +(ball.bounce$if_end2) +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@R13 +M=D +@ball.setdestination +D=A +@R14 +M=D +@RET_ADDRESS_CALL30 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL30) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.new) +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL31 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL31) +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL32 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL32) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(bat.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL33 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL33) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.show) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL34 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL34) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL35 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL35) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.hide) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL36 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL36) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL37 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL37) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.draw) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL38 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL38) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.setdirection) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.getleft) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(bat.getright) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +(bat.setwidth) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.hide +D=A +@R14 +M=D +@RET_ADDRESS_CALL39 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL39) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL40 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL40) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.move) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_EQ6 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ6) +@SP +AM=M-1 +D=M +@bat.move$if_true0 +D;JNE +@bat.move$if_false0 +0;JMP +(bat.move$if_true0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT10 +D=A +@38 +0;JMP +(RET_ADDRESS_LT10) +@SP +AM=M-1 +D=M +@bat.move$if_true1 +D;JNE +@bat.move$if_false1 +0;JMP +(bat.move$if_true1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(bat.move$if_false1) +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL41 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL41) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL42 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL42) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL43 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL43) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL44 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL44) +@SP +AM=M-1 +D=M +@R5 +M=D +@bat.move$if_end0 +0;JMP +(bat.move$if_false0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT2 +D=A +@22 +0;JMP +(RET_ADDRESS_GT2) +@SP +AM=M-1 +D=M +@bat.move$if_true2 +D;JNE +@bat.move$if_false2 +0;JMP +(bat.move$if_true2) +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(bat.move$if_false2) +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL45 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL45) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL46 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL46) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL47 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL47) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL48 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL48) +@SP +AM=M-1 +D=M +@R5 +M=D +(bat.move$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(main.main) +@SP +AM=M+1 +A=A-1 +M=0 +@0 +D=A +@R13 +M=D +@ponggame.newinstance +D=A +@R14 +M=D +@RET_ADDRESS_CALL49 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL49) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@ponggame.getinstance +D=A +@R14 +M=D +@RET_ADDRESS_CALL50 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL50) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.run +D=A +@R14 +M=D +@RET_ADDRESS_CALL51 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL51) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL52 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL52) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.new) +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL53 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL53) +@SP +AM=M-1 +D=M +@THIS +M=D +@0 +D=A +@R13 +M=D +@screen.clearscreen +D=A +@R14 +M=D +@RET_ADDRESS_CALL54 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL54) +@SP +AM=M-1 +D=M +@R5 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@230 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@229 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@bat.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL55 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL55) +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@253 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@222 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@229 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@R13 +M=D +@ball.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL56 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL56) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@400 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@3 +D=A +@R13 +M=D +@ball.setdestination +D=A +@R14 +M=D +@RET_ADDRESS_CALL57 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL57) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@238 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@240 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL58 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL58) +@SP +AM=M-1 +D=M +@R5 +M=D +@22 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@2 +D=A +@R13 +M=D +@output.movecursor +D=A +@R14 +M=D +@RET_ADDRESS_CALL59 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL59) +@SP +AM=M-1 +D=M +@R5 +M=D +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL60 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL60) +@83 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL61 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL61) +@99 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL62 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL62) +@111 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL63 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL63) +@114 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL64 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL64) +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL65 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL65) +@58 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL66 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL66) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL67 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL67) +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL68 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL68) +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL69 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL69) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ponggame.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL70 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL70) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL71 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL71) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL72 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL72) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.newinstance) +@0 +D=A +@R13 +M=D +@ponggame.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL73 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL73) +@SP +AM=M-1 +D=M +@ponggame.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.getinstance) +@ponggame.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ponggame.run) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +(ponggame.run$while_exp0) +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.run$while_end0 +D;JNE +(ponggame.run$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ7 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ7) +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.run$while_end1 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.keypressed +D=A +@R14 +M=D +@RET_ADDRESS_CALL74 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL74) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.move +D=A +@R14 +M=D +@RET_ADDRESS_CALL75 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL75) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.moveball +D=A +@R14 +M=D +@RET_ADDRESS_CALL76 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL76) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$while_exp1 +0;JMP +(ponggame.run$while_end1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@130 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ8 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ8) +@SP +AM=M-1 +D=M +@ponggame.run$if_true0 +D;JNE +@ponggame.run$if_false0 +0;JMP +(ponggame.run$if_true0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@2 +D=A +@R13 +M=D +@bat.setdirection +D=A +@R14 +M=D +@RET_ADDRESS_CALL77 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL77) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$if_end0 +0;JMP +(ponggame.run$if_false0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@132 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ9 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ9) +@SP +AM=M-1 +D=M +@ponggame.run$if_true1 +D;JNE +@ponggame.run$if_false1 +0;JMP +(ponggame.run$if_true1) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@bat.setdirection +D=A +@R14 +M=D +@RET_ADDRESS_CALL78 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL78) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$if_end1 +0;JMP +(ponggame.run$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@140 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ10 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ10) +@SP +AM=M-1 +D=M +@ponggame.run$if_true2 +D;JNE +@ponggame.run$if_false2 +0;JMP +(ponggame.run$if_true2) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +(ponggame.run$if_false2) +(ponggame.run$if_end1) +(ponggame.run$if_end0) +(ponggame.run$while_exp2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ11 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ11) +@SP +A=M-1 +M=!M +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.run$while_end2 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.keypressed +D=A +@R14 +M=D +@RET_ADDRESS_CALL79 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL79) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.move +D=A +@R14 +M=D +@RET_ADDRESS_CALL80 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL80) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.moveball +D=A +@R14 +M=D +@RET_ADDRESS_CALL81 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL81) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$while_exp2 +0;JMP +(ponggame.run$while_end2) +@ponggame.run$while_exp0 +0;JMP +(ponggame.run$while_end0) +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ponggame.run$if_true3 +D;JNE +@ponggame.run$if_false3 +0;JMP +(ponggame.run$if_true3) +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@output.movecursor +D=A +@R14 +M=D +@RET_ADDRESS_CALL82 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL82) +@SP +AM=M-1 +D=M +@R5 +M=D +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL83 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL83) +@71 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL84 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL84) +@97 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL85 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL85) +@109 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL86 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL86) +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL87 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL87) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL88 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL88) +@79 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL89 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL89) +@118 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL90 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL90) +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL91 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL91) +@114 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL92 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL92) +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL93 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL93) +@SP +AM=M-1 +D=M +@R5 +M=D +(ponggame.run$if_false3) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.moveball) +@5 +D=A +(LOOP_ponggame.moveball) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_ponggame.moveball +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.move +D=A +@R14 +M=D +@RET_ADDRESS_CALL94 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL94) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT3 +D=A +@22 +0;JMP +(RET_ADDRESS_GT3) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ12 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ12) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true0 +D;JNE +@ponggame.moveball$if_false0 +0;JMP +(ponggame.moveball$if_true0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.getleft +D=A +@R14 +M=D +@RET_ADDRESS_CALL95 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL95) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.getright +D=A +@R14 +M=D +@RET_ADDRESS_CALL96 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL96) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.getleft +D=A +@R14 +M=D +@RET_ADDRESS_CALL97 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL97) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.getright +D=A +@R14 +M=D +@RET_ADDRESS_CALL98 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL98) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ13 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ13) +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true1 +D;JNE +@ponggame.moveball$if_false1 +0;JMP +(ponggame.moveball$if_true1) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT4 +D=A +@22 +0;JMP +(RET_ADDRESS_GT4) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT11 +D=A +@38 +0;JMP +(RET_ADDRESS_LT11) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true2 +D;JNE +@ponggame.moveball$if_false2 +0;JMP +(ponggame.moveball$if_true2) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_LT12 +D=A +@38 +0;JMP +(RET_ADDRESS_LT12) +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true3 +D;JNE +@ponggame.moveball$if_false3 +0;JMP +(ponggame.moveball$if_true3) +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ponggame.moveball$if_end3 +0;JMP +(ponggame.moveball$if_false3) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@RET_ADDRESS_GT5 +D=A +@22 +0;JMP +(RET_ADDRESS_GT5) +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true4 +D;JNE +@ponggame.moveball$if_false4 +0;JMP +(ponggame.moveball$if_true4) +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(ponggame.moveball$if_false4) +(ponggame.moveball$if_end3) +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@bat.setwidth +D=A +@R14 +M=D +@RET_ADDRESS_CALL99 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL99) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@22 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@output.movecursor +D=A +@R14 +M=D +@RET_ADDRESS_CALL100 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL100) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printint +D=A +@R14 +M=D +@RET_ADDRESS_CALL101 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL101) +@SP +AM=M-1 +D=M +@R5 +M=D +(ponggame.moveball$if_false2) +(ponggame.moveball$if_false1) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@ball.bounce +D=A +@R14 +M=D +@RET_ADDRESS_CALL102 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL102) +@SP +AM=M-1 +D=M +@R5 +M=D +(ponggame.moveball$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(array.new) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT6 +D=A +@22 +0;JMP +(RET_ADDRESS_GT6) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@array.new$if_true0 +D;JNE +@array.new$if_false0 +0;JMP +(array.new$if_true0) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL103 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL103) +@SP +AM=M-1 +D=M +@R5 +M=D +(array.new$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL104 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL104) +@54 +0;JMP +(array.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL105 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL105) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(keyboard.init) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(keyboard.keypressed) +@24576 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.peek +D=A +@R14 +M=D +@RET_ADDRESS_CALL106 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL106) +@54 +0;JMP +(keyboard.readchar) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL107 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL107) +@SP +AM=M-1 +D=M +@R5 +M=D +(keyboard.readchar$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ14 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ14) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT7 +D=A +@22 +0;JMP +(RET_ADDRESS_GT7) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@keyboard.readchar$while_end0 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.keypressed +D=A +@R14 +M=D +@RET_ADDRESS_CALL108 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL108) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT8 +D=A +@22 +0;JMP +(RET_ADDRESS_GT8) +@SP +AM=M-1 +D=M +@keyboard.readchar$if_true0 +D;JNE +@keyboard.readchar$if_false0 +0;JMP +(keyboard.readchar$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(keyboard.readchar$if_false0) +@keyboard.readchar$while_exp0 +0;JMP +(keyboard.readchar$while_end0) +@0 +D=A +@R13 +M=D +@string.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL109 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL109) +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL110 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL110) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL111 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL111) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(keyboard.readline) +@5 +D=A +(LOOP_keyboard.readline) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_keyboard.readline +D;JGT +@80 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL112 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL112) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL113 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL113) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@string.newline +D=A +@R14 +M=D +@RET_ADDRESS_CALL114 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL114) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@0 +D=A +@R13 +M=D +@string.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL115 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL115) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(keyboard.readline$while_exp0) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@keyboard.readline$while_end0 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.readchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL116 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL116) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ15 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ15) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@keyboard.readline$if_true0 +D;JNE +@keyboard.readline$if_false0 +0;JMP +(keyboard.readline$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ16 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ16) +@SP +AM=M-1 +D=M +@keyboard.readline$if_true1 +D;JNE +@keyboard.readline$if_false1 +0;JMP +(keyboard.readline$if_true1) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.eraselastchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL117 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL117) +@SP +AM=M-1 +D=M +@R5 +M=D +@keyboard.readline$if_end1 +0;JMP +(keyboard.readline$if_false1) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL118 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL118) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(keyboard.readline$if_end1) +(keyboard.readline$if_false0) +@keyboard.readline$while_exp0 +0;JMP +(keyboard.readline$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(keyboard.readint) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@keyboard.readline +D=A +@R14 +M=D +@RET_ADDRESS_CALL119 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL119) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.intvalue +D=A +@R14 +M=D +@RET_ADDRESS_CALL120 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL120) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL121 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL121) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.init) +@SP +AM=M+1 +A=A-1 +M=0 +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL122 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL122) +@SP +AM=M-1 +D=M +@math.1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL123 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL123) +@SP +AM=M-1 +D=M +@math.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(math.init$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT13 +D=A +@38 +0;JMP +(RET_ADDRESS_LT13) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.init$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@math.init$while_exp0 +0;JMP +(math.init$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(math.abs) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT14 +D=A +@38 +0;JMP +(RET_ADDRESS_LT14) +@SP +AM=M-1 +D=M +@math.abs$if_true0 +D;JNE +@math.abs$if_false0 +0;JMP +(math.abs$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(math.abs$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.multiply) +@5 +D=A +(LOOP_math.multiply) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_math.multiply +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT15 +D=A +@38 +0;JMP +(RET_ADDRESS_LT15) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT9 +D=A +@22 +0;JMP +(RET_ADDRESS_GT9) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT10 +D=A +@22 +0;JMP +(RET_ADDRESS_GT10) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT16 +D=A +@38 +0;JMP +(RET_ADDRESS_LT16) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL124 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL124) +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL125 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL125) +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT17 +D=A +@38 +0;JMP +(RET_ADDRESS_LT17) +@SP +AM=M-1 +D=M +@math.multiply$if_true0 +D;JNE +@math.multiply$if_false0 +0;JMP +(math.multiply$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(math.multiply$if_false0) +(math.multiply$while_exp0) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT18 +D=A +@38 +0;JMP +(RET_ADDRESS_LT18) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.multiply$while_end0 +D;JNE +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT11 +D=A +@22 +0;JMP +(RET_ADDRESS_GT11) +@SP +AM=M-1 +D=M +@math.multiply$if_true1 +D;JNE +@math.multiply$if_false1 +0;JMP +(math.multiply$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(math.multiply$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@math.multiply$while_exp0 +0;JMP +(math.multiply$while_end0) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@math.multiply$if_true2 +D;JNE +@math.multiply$if_false2 +0;JMP +(math.multiply$if_true2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(math.multiply$if_false2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.divide) +@4 +D=A +(LOOP_math.divide) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_math.divide +D;JGT +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ17 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ17) +@SP +AM=M-1 +D=M +@math.divide$if_true0 +D;JNE +@math.divide$if_false0 +0;JMP +(math.divide$if_true0) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL126 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL126) +@SP +AM=M-1 +D=M +@R5 +M=D +(math.divide$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT19 +D=A +@38 +0;JMP +(RET_ADDRESS_LT19) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT12 +D=A +@22 +0;JMP +(RET_ADDRESS_GT12) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT13 +D=A +@22 +0;JMP +(RET_ADDRESS_GT13) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT20 +D=A +@38 +0;JMP +(RET_ADDRESS_LT20) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL127 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL127) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL128 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL128) +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(math.divide$while_exp0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$while_end0 +D;JNE +@32767 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT21 +D=A +@38 +0;JMP +(RET_ADDRESS_LT21) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$if_true1 +D;JNE +@math.divide$if_false1 +0;JMP +(math.divide$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT14 +D=A +@22 +0;JMP +(RET_ADDRESS_GT14) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$if_true2 +D;JNE +@math.divide$if_false2 +0;JMP +(math.divide$if_true2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(math.divide$if_false2) +(math.divide$if_false1) +@math.divide$while_exp0 +0;JMP +(math.divide$while_end0) +(math.divide$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT15 +D=A +@22 +0;JMP +(RET_ADDRESS_GT15) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$while_end1 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT16 +D=A +@22 +0;JMP +(RET_ADDRESS_GT16) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$if_true3 +D;JNE +@math.divide$if_false3 +0;JMP +(math.divide$if_true3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(math.divide$if_false3) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@math.divide$while_exp1 +0;JMP +(math.divide$while_end1) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@math.divide$if_true4 +D;JNE +@math.divide$if_false4 +0;JMP +(math.divide$if_true4) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(math.divide$if_false4) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.sqrt) +@4 +D=A +(LOOP_math.sqrt) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_math.sqrt +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT22 +D=A +@38 +0;JMP +(RET_ADDRESS_LT22) +@SP +AM=M-1 +D=M +@math.sqrt$if_true0 +D;JNE +@math.sqrt$if_false0 +0;JMP +(math.sqrt$if_true0) +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL129 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL129) +@SP +AM=M-1 +D=M +@R5 +M=D +(math.sqrt$if_false0) +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(math.sqrt$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT17 +D=A +@22 +0;JMP +(RET_ADDRESS_GT17) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.sqrt$while_end0 +D;JNE +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL130 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL130) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT18 +D=A +@22 +0;JMP +(RET_ADDRESS_GT18) +@SP +A=M-1 +M=!M +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT23 +D=A +@38 +0;JMP +(RET_ADDRESS_LT23) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@math.sqrt$if_true1 +D;JNE +@math.sqrt$if_false1 +0;JMP +(math.sqrt$if_true1) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(math.sqrt$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@math.sqrt$while_exp0 +0;JMP +(math.sqrt$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.max) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT19 +D=A +@22 +0;JMP +(RET_ADDRESS_GT19) +@SP +AM=M-1 +D=M +@math.max$if_true0 +D;JNE +@math.max$if_false0 +0;JMP +(math.max$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(math.max$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.min) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT24 +D=A +@38 +0;JMP +(RET_ADDRESS_LT24) +@SP +AM=M-1 +D=M +@math.min$if_true0 +D;JNE +@math.min$if_false0 +0;JMP +(math.min$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(math.min$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(memory.init) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@memory.0 +M=D +@2048 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@14334 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@2049 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@2050 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(memory.peek) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(memory.poke) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(memory.alloc) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_LT25 +D=A +@38 +0;JMP +(RET_ADDRESS_LT25) +@SP +AM=M-1 +D=M +@memory.alloc$if_true0 +D;JNE +@memory.alloc$if_false0 +0;JMP +(memory.alloc$if_true0) +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL131 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL131) +@SP +AM=M-1 +D=M +@R5 +M=D +(memory.alloc$if_false0) +@2048 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(memory.alloc$while_exp0) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT26 +D=A +@38 +0;JMP +(RET_ADDRESS_LT26) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@memory.alloc$while_end0 +D;JNE +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@memory.alloc$while_exp0 +0;JMP +(memory.alloc$while_end0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@16379 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT20 +D=A +@22 +0;JMP +(RET_ADDRESS_GT20) +@SP +AM=M-1 +D=M +@memory.alloc$if_true1 +D;JNE +@memory.alloc$if_false1 +0;JMP +(memory.alloc$if_true1) +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL132 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL132) +@SP +AM=M-1 +D=M +@R5 +M=D +(memory.alloc$if_false1) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_GT21 +D=A +@22 +0;JMP +(RET_ADDRESS_GT21) +@SP +AM=M-1 +D=M +@memory.alloc$if_true2 +D;JNE +@memory.alloc$if_false2 +0;JMP +(memory.alloc$if_true2) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_EQ18 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ18) +@SP +AM=M-1 +D=M +@memory.alloc$if_true3 +D;JNE +@memory.alloc$if_false3 +0;JMP +(memory.alloc$if_true3) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@memory.alloc$if_end3 +0;JMP +(memory.alloc$if_false3) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(memory.alloc$if_end3) +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(memory.alloc$if_false2) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +(memory.dealloc) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ19 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ19) +@SP +AM=M-1 +D=M +@memory.dealloc$if_true0 +D;JNE +@memory.dealloc$if_false0 +0;JMP +(memory.dealloc$if_true0) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@memory.dealloc$if_end0 +0;JMP +(memory.dealloc$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_EQ20 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ20) +@SP +AM=M-1 +D=M +@memory.dealloc$if_true1 +D;JNE +@memory.dealloc$if_false1 +0;JMP +(memory.dealloc$if_true1) +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@memory.dealloc$if_end1 +0;JMP +(memory.dealloc$if_false1) +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(memory.dealloc$if_end1) +(memory.dealloc$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.init) +@16384 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.4 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@output.0 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL133 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL133) +@SP +AM=M-1 +D=M +@output.3 +M=D +@0 +D=A +@R13 +M=D +@output.initmap +D=A +@R14 +M=D +@RET_ADDRESS_CALL134 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL134) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@output.createshiftedmap +D=A +@R14 +M=D +@RET_ADDRESS_CALL135 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL135) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.initmap) +@127 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL136 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL136) +@SP +AM=M-1 +D=M +@output.5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL137 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL137) +@SP +AM=M-1 +D=M +@R5 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL138 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL138) +@SP +AM=M-1 +D=M +@R5 +M=D +@33 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL139 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL139) +@SP +AM=M-1 +D=M +@R5 +M=D +@34 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@20 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL140 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL140) +@SP +AM=M-1 +D=M +@R5 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL141 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL141) +@SP +AM=M-1 +D=M +@R5 +M=D +@36 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL142 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL142) +@SP +AM=M-1 +D=M +@R5 +M=D +@37 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL143 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL143) +@SP +AM=M-1 +D=M +@R5 +M=D +@38 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL144 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL144) +@SP +AM=M-1 +D=M +@R5 +M=D +@39 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL145 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL145) +@SP +AM=M-1 +D=M +@R5 +M=D +@40 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL146 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL146) +@SP +AM=M-1 +D=M +@R5 +M=D +@41 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL147 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL147) +@SP +AM=M-1 +D=M +@R5 +M=D +@42 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL148 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL148) +@SP +AM=M-1 +D=M +@R5 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL149 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL149) +@SP +AM=M-1 +D=M +@R5 +M=D +@44 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL150 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL150) +@SP +AM=M-1 +D=M +@R5 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL151 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL151) +@SP +AM=M-1 +D=M +@R5 +M=D +@46 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL152 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL152) +@SP +AM=M-1 +D=M +@R5 +M=D +@47 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL153 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL153) +@SP +AM=M-1 +D=M +@R5 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL154 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL154) +@SP +AM=M-1 +D=M +@R5 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL155 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL155) +@SP +AM=M-1 +D=M +@R5 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL156 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL156) +@SP +AM=M-1 +D=M +@R5 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL157 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL157) +@SP +AM=M-1 +D=M +@R5 +M=D +@52 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@26 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL158 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL158) +@SP +AM=M-1 +D=M +@R5 +M=D +@53 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL159 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL159) +@SP +AM=M-1 +D=M +@R5 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL160 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL160) +@SP +AM=M-1 +D=M +@R5 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL161 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL161) +@SP +AM=M-1 +D=M +@R5 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL162 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL162) +@SP +AM=M-1 +D=M +@R5 +M=D +@57 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL163 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL163) +@SP +AM=M-1 +D=M +@R5 +M=D +@58 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL164 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL164) +@SP +AM=M-1 +D=M +@R5 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL165 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL165) +@SP +AM=M-1 +D=M +@R5 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL166 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL166) +@SP +AM=M-1 +D=M +@R5 +M=D +@61 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL167 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL167) +@SP +AM=M-1 +D=M +@R5 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL168 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL168) +@SP +AM=M-1 +D=M +@R5 +M=D +@64 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL169 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL169) +@SP +AM=M-1 +D=M +@R5 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL170 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL170) +@SP +AM=M-1 +D=M +@R5 +M=D +@65 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL171 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL171) +@SP +AM=M-1 +D=M +@R5 +M=D +@66 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL172 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL172) +@SP +AM=M-1 +D=M +@R5 +M=D +@67 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL173 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL173) +@SP +AM=M-1 +D=M +@R5 +M=D +@68 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL174 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL174) +@SP +AM=M-1 +D=M +@R5 +M=D +@69 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL175 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL175) +@SP +AM=M-1 +D=M +@R5 +M=D +@70 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL176 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL176) +@SP +AM=M-1 +D=M +@R5 +M=D +@71 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@44 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL177 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL177) +@SP +AM=M-1 +D=M +@R5 +M=D +@72 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL178 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL178) +@SP +AM=M-1 +D=M +@R5 +M=D +@73 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL179 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL179) +@SP +AM=M-1 +D=M +@R5 +M=D +@74 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL180 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL180) +@SP +AM=M-1 +D=M +@R5 +M=D +@75 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL181 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL181) +@SP +AM=M-1 +D=M +@R5 +M=D +@76 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL182 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL182) +@SP +AM=M-1 +D=M +@R5 +M=D +@77 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@33 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL183 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL183) +@SP +AM=M-1 +D=M +@R5 +M=D +@78 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL184 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL184) +@SP +AM=M-1 +D=M +@R5 +M=D +@79 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL185 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL185) +@SP +AM=M-1 +D=M +@R5 +M=D +@80 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL186 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL186) +@SP +AM=M-1 +D=M +@R5 +M=D +@81 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL187 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL187) +@SP +AM=M-1 +D=M +@R5 +M=D +@82 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL188 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL188) +@SP +AM=M-1 +D=M +@R5 +M=D +@83 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL189 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL189) +@SP +AM=M-1 +D=M +@R5 +M=D +@84 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL190 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL190) +@SP +AM=M-1 +D=M +@R5 +M=D +@85 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL191 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL191) +@SP +AM=M-1 +D=M +@R5 +M=D +@86 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL192 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL192) +@SP +AM=M-1 +D=M +@R5 +M=D +@87 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL193 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL193) +@SP +AM=M-1 +D=M +@R5 +M=D +@88 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL194 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL194) +@SP +AM=M-1 +D=M +@R5 +M=D +@89 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL195 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL195) +@SP +AM=M-1 +D=M +@R5 +M=D +@90 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL196 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL196) +@SP +AM=M-1 +D=M +@R5 +M=D +@91 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL197 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL197) +@SP +AM=M-1 +D=M +@R5 +M=D +@92 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=1 +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL198 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL198) +@SP +AM=M-1 +D=M +@R5 +M=D +@93 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL199 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL199) +@SP +AM=M-1 +D=M +@R5 +M=D +@94 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL200 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL200) +@SP +AM=M-1 +D=M +@R5 +M=D +@95 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL201 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL201) +@SP +AM=M-1 +D=M +@R5 +M=D +@96 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL202 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL202) +@SP +AM=M-1 +D=M +@R5 +M=D +@97 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL203 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL203) +@SP +AM=M-1 +D=M +@R5 +M=D +@98 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL204 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL204) +@SP +AM=M-1 +D=M +@R5 +M=D +@99 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL205 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL205) +@SP +AM=M-1 +D=M +@R5 +M=D +@100 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL206 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL206) +@SP +AM=M-1 +D=M +@R5 +M=D +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL207 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL207) +@SP +AM=M-1 +D=M +@R5 +M=D +@102 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@38 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL208 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL208) +@SP +AM=M-1 +D=M +@R5 +M=D +@103 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL209 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL209) +@SP +AM=M-1 +D=M +@R5 +M=D +@104 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL210 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL210) +@SP +AM=M-1 +D=M +@R5 +M=D +@105 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL211 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL211) +@SP +AM=M-1 +D=M +@R5 +M=D +@106 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL212 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL212) +@SP +AM=M-1 +D=M +@R5 +M=D +@107 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL213 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL213) +@SP +AM=M-1 +D=M +@R5 +M=D +@108 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL214 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL214) +@SP +AM=M-1 +D=M +@R5 +M=D +@109 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@29 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL215 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL215) +@SP +AM=M-1 +D=M +@R5 +M=D +@110 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@29 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL216 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL216) +@SP +AM=M-1 +D=M +@R5 +M=D +@111 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL217 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL217) +@SP +AM=M-1 +D=M +@R5 +M=D +@112 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL218 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL218) +@SP +AM=M-1 +D=M +@R5 +M=D +@113 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL219 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL219) +@SP +AM=M-1 +D=M +@R5 +M=D +@114 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@29 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL220 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL220) +@SP +AM=M-1 +D=M +@R5 +M=D +@115 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL221 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL221) +@SP +AM=M-1 +D=M +@R5 +M=D +@116 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL222 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL222) +@SP +AM=M-1 +D=M +@R5 +M=D +@117 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL223 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL223) +@SP +AM=M-1 +D=M +@R5 +M=D +@118 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL224 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL224) +@SP +AM=M-1 +D=M +@R5 +M=D +@119 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL225 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL225) +@SP +AM=M-1 +D=M +@R5 +M=D +@120 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL226 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL226) +@SP +AM=M-1 +D=M +@R5 +M=D +@121 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL227 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL227) +@SP +AM=M-1 +D=M +@R5 +M=D +@122 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL228 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL228) +@SP +AM=M-1 +D=M +@R5 +M=D +@123 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL229 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL229) +@SP +AM=M-1 +D=M +@R5 +M=D +@124 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL230 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL230) +@SP +AM=M-1 +D=M +@R5 +M=D +@125 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL231 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL231) +@SP +AM=M-1 +D=M +@R5 +M=D +@126 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@38 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL232 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL232) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.create) +@SP +AM=M+1 +A=A-1 +M=0 +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL233 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL233) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@11 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.createshiftedmap) +@4 +D=A +(LOOP_output.createshiftedmap) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_output.createshiftedmap +D;JGT +@127 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL234 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL234) +@SP +AM=M-1 +D=M +@output.6 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(output.createshiftedmap$while_exp0) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@127 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT27 +D=A +@38 +0;JMP +(RET_ADDRESS_LT27) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.createshiftedmap$while_end0 +D;JNE +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL235 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL235) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.6 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(output.createshiftedmap$while_exp1) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT28 +D=A +@38 +0;JMP +(RET_ADDRESS_LT28) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.createshiftedmap$while_end1 +D;JNE +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@256 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL236 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL236) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@output.createshiftedmap$while_exp1 +0;JMP +(output.createshiftedmap$while_end1) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ21 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ21) +@SP +AM=M-1 +D=M +@output.createshiftedmap$if_true0 +D;JNE +@output.createshiftedmap$if_false0 +0;JMP +(output.createshiftedmap$if_true0) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@output.createshiftedmap$if_end0 +0;JMP +(output.createshiftedmap$if_false0) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(output.createshiftedmap$if_end0) +@output.createshiftedmap$while_exp0 +0;JMP +(output.createshiftedmap$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.getmap) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT29 +D=A +@38 +0;JMP +(RET_ADDRESS_LT29) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@126 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT22 +D=A +@22 +0;JMP +(RET_ADDRESS_GT22) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@output.getmap$if_true0 +D;JNE +@output.getmap$if_false0 +0;JMP +(output.getmap$if_true0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(output.getmap$if_false0) +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.getmap$if_true1 +D;JNE +@output.getmap$if_false1 +0;JMP +(output.getmap$if_true1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@output.getmap$if_end1 +0;JMP +(output.getmap$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.6 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(output.getmap$if_end1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(output.drawchar) +@4 +D=A +(LOOP_output.drawchar) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_output.drawchar +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.getmap +D=A +@R14 +M=D +@RET_ADDRESS_CALL237 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL237) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(output.drawchar$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT30 +D=A +@38 +0;JMP +(RET_ADDRESS_LT30) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.drawchar$while_end0 +D;JNE +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.drawchar$if_true0 +D;JNE +@output.drawchar$if_false0 +0;JMP +(output.drawchar$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.4 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@256 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@output.drawchar$if_end0 +0;JMP +(output.drawchar$if_false0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.4 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(output.drawchar$if_end0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.4 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@output.drawchar$while_exp0 +0;JMP +(output.drawchar$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.movecursor) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT31 +D=A +@38 +0;JMP +(RET_ADDRESS_LT31) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@22 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT23 +D=A +@22 +0;JMP +(RET_ADDRESS_GT23) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT32 +D=A +@38 +0;JMP +(RET_ADDRESS_LT32) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT24 +D=A +@22 +0;JMP +(RET_ADDRESS_GT24) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@output.movecursor$if_true0 +D;JNE +@output.movecursor$if_false0 +0;JMP +(output.movecursor$if_true0) +@20 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL238 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL238) +@SP +AM=M-1 +D=M +@R5 +M=D +(output.movecursor$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL239 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL239) +@SP +AM=M-1 +D=M +@output.0 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@352 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL240 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL240) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@output.1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL241 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL241) +@RET_ADDRESS_EQ22 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ22) +@SP +AM=M-1 +D=M +@output.2 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.drawchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL242 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL242) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.printchar) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@0 +D=A +@R13 +M=D +@string.newline +D=A +@R14 +M=D +@RET_ADDRESS_CALL243 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL243) +@RET_ADDRESS_EQ23 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ23) +@SP +AM=M-1 +D=M +@output.printchar$if_true0 +D;JNE +@output.printchar$if_false0 +0;JMP +(output.printchar$if_true0) +@0 +D=A +@R13 +M=D +@output.println +D=A +@R14 +M=D +@RET_ADDRESS_CALL244 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL244) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.printchar$if_end0 +0;JMP +(output.printchar$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@0 +D=A +@R13 +M=D +@string.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL245 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL245) +@RET_ADDRESS_EQ24 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ24) +@SP +AM=M-1 +D=M +@output.printchar$if_true1 +D;JNE +@output.printchar$if_false1 +0;JMP +(output.printchar$if_true1) +@0 +D=A +@R13 +M=D +@output.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL246 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL246) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.printchar$if_end1 +0;JMP +(output.printchar$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.drawchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL247 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL247) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.printchar$if_true2 +D;JNE +@output.printchar$if_false2 +0;JMP +(output.printchar$if_true2) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@output.0 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.printchar$if_false2) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ25 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ25) +@SP +AM=M-1 +D=M +@output.printchar$if_true3 +D;JNE +@output.printchar$if_false3 +0;JMP +(output.printchar$if_true3) +@0 +D=A +@R13 +M=D +@output.println +D=A +@R14 +M=D +@RET_ADDRESS_CALL248 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL248) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.printchar$if_end3 +0;JMP +(output.printchar$if_false3) +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +(output.printchar$if_end3) +(output.printchar$if_end1) +(output.printchar$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.printstring) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.length +D=A +@R14 +M=D +@RET_ADDRESS_CALL249 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL249) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(output.printstring$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT33 +D=A +@38 +0;JMP +(RET_ADDRESS_LT33) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.printstring$while_end0 +D;JNE +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.charat +D=A +@R14 +M=D +@RET_ADDRESS_CALL250 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL250) +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL251 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL251) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@output.printstring$while_exp0 +0;JMP +(output.printstring$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.printint) +@output.3 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.setint +D=A +@R14 +M=D +@RET_ADDRESS_CALL252 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL252) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.3 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL253 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL253) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.println) +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@352 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@output.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@8128 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ26 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ26) +@SP +AM=M-1 +D=M +@output.println$if_true0 +D;JNE +@output.println$if_false0 +0;JMP +(output.println$if_true0) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.println$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.backspace) +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.backspace$if_true0 +D;JNE +@output.backspace$if_false0 +0;JMP +(output.backspace$if_true0) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT25 +D=A +@22 +0;JMP +(RET_ADDRESS_GT25) +@SP +AM=M-1 +D=M +@output.backspace$if_true1 +D;JNE +@output.backspace$if_false1 +0;JMP +(output.backspace$if_true1) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.0 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.1 +M=D +@output.backspace$if_end1 +0;JMP +(output.backspace$if_false1) +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.0 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ27 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ27) +@SP +AM=M-1 +D=M +@output.backspace$if_true2 +D;JNE +@output.backspace$if_false2 +0;JMP +(output.backspace$if_true2) +@8128 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.backspace$if_false2) +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@321 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.backspace$if_end1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@output.2 +M=D +@output.backspace$if_end0 +0;JMP +(output.backspace$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +(output.backspace$if_end0) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.drawchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL254 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL254) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.init) +@SP +AM=M+1 +A=A-1 +M=0 +@16384 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.2 +M=D +@17 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL255 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL255) +@SP +AM=M-1 +D=M +@screen.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(screen.init$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT34 +D=A +@38 +0;JMP +(RET_ADDRESS_LT34) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.init$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@screen.init$while_exp0 +0;JMP +(screen.init$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.clearscreen) +@SP +AM=M+1 +A=A-1 +M=0 +(screen.clearscreen$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@8192 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT35 +D=A +@38 +0;JMP +(RET_ADDRESS_LT35) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.clearscreen$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.clearscreen$while_exp0 +0;JMP +(screen.clearscreen$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.updatelocation) +@screen.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.updatelocation$if_true0 +D;JNE +@screen.updatelocation$if_false0 +0;JMP +(screen.updatelocation$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@screen.updatelocation$if_end0 +0;JMP +(screen.updatelocation$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(screen.updatelocation$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.setcolor) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.2 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawpixel) +@3 +D=A +(LOOP_screen.drawpixel) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawpixel +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT36 +D=A +@38 +0;JMP +(RET_ADDRESS_LT36) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT26 +D=A +@22 +0;JMP +(RET_ADDRESS_GT26) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT37 +D=A +@38 +0;JMP +(RET_ADDRESS_LT37) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT27 +D=A +@22 +0;JMP +(RET_ADDRESS_GT27) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawpixel$if_true0 +D;JNE +@screen.drawpixel$if_false0 +0;JMP +(screen.drawpixel$if_true0) +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL256 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL256) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawpixel$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL257 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL257) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL258 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL258) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL259 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL259) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL260 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL260) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawconditional) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.drawconditional$if_true0 +D;JNE +@screen.drawconditional$if_false0 +0;JMP +(screen.drawconditional$if_true0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.drawpixel +D=A +@R14 +M=D +@RET_ADDRESS_CALL261 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL261) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawconditional$if_end0 +0;JMP +(screen.drawconditional$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.drawpixel +D=A +@R14 +M=D +@RET_ADDRESS_CALL262 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL262) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawconditional$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawline) +@11 +D=A +(LOOP_screen.drawline) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawline +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT38 +D=A +@38 +0;JMP +(RET_ADDRESS_LT38) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT28 +D=A +@22 +0;JMP +(RET_ADDRESS_GT28) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT39 +D=A +@38 +0;JMP +(RET_ADDRESS_LT39) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT29 +D=A +@22 +0;JMP +(RET_ADDRESS_GT29) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawline$if_true0 +D;JNE +@screen.drawline$if_false0 +0;JMP +(screen.drawline$if_true0) +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL263 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL263) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawline$if_false0) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL264 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL264) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL265 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL265) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT40 +D=A +@38 +0;JMP +(RET_ADDRESS_LT40) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT41 +D=A +@38 +0;JMP +(RET_ADDRESS_LT41) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT42 +D=A +@38 +0;JMP +(RET_ADDRESS_LT42) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawline$if_true1 +D;JNE +@screen.drawline$if_false1 +0;JMP +(screen.drawline$if_true1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +A=A+1 +A=A+1 +M=D +(screen.drawline$if_false1) +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.drawline$if_true2 +D;JNE +@screen.drawline$if_false2 +0;JMP +(screen.drawline$if_true2) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT30 +D=A +@22 +0;JMP +(RET_ADDRESS_GT30) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@screen.drawline$if_end2 +0;JMP +(screen.drawline$if_false2) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT31 +D=A +@22 +0;JMP +(RET_ADDRESS_GT31) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +(screen.drawline$if_end2) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL266 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL266) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL267 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL267) +@LCL +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL268 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL268) +@LCL +D=M +@10 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@R13 +M=D +@screen.drawconditional +D=A +@R14 +M=D +@RET_ADDRESS_CALL269 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL269) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawline$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT43 +D=A +@38 +0;JMP +(RET_ADDRESS_LT43) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawline$while_end0 +D;JNE +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT44 +D=A +@38 +0;JMP +(RET_ADDRESS_LT44) +@SP +AM=M-1 +D=M +@screen.drawline$if_true3 +D;JNE +@screen.drawline$if_false3 +0;JMP +(screen.drawline$if_true3) +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@screen.drawline$if_end3 +0;JMP +(screen.drawline$if_false3) +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.drawline$if_true4 +D;JNE +@screen.drawline$if_false4 +0;JMP +(screen.drawline$if_true4) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawline$if_end4 +0;JMP +(screen.drawline$if_false4) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(screen.drawline$if_end4) +(screen.drawline$if_end3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@R13 +M=D +@screen.drawconditional +D=A +@R14 +M=D +@RET_ADDRESS_CALL270 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL270) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawline$while_exp0 +0;JMP +(screen.drawline$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawrectangle) +@9 +D=A +(LOOP_screen.drawrectangle) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawrectangle +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT32 +D=A +@22 +0;JMP +(RET_ADDRESS_GT32) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT33 +D=A +@22 +0;JMP +(RET_ADDRESS_GT33) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT45 +D=A +@38 +0;JMP +(RET_ADDRESS_LT45) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT34 +D=A +@22 +0;JMP +(RET_ADDRESS_GT34) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT46 +D=A +@38 +0;JMP +(RET_ADDRESS_LT46) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT35 +D=A +@22 +0;JMP +(RET_ADDRESS_GT35) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawrectangle$if_true0 +D;JNE +@screen.drawrectangle$if_false0 +0;JMP +(screen.drawrectangle$if_true0) +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL271 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL271) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawrectangle$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL272 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL272) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL273 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL273) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL274 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL274) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL275 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL275) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL276 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL276) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(screen.drawrectangle$while_exp0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT36 +D=A +@22 +0;JMP +(RET_ADDRESS_GT36) +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawrectangle$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ28 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ28) +@SP +AM=M-1 +D=M +@screen.drawrectangle$if_true1 +D;JNE +@screen.drawrectangle$if_false1 +0;JMP +(screen.drawrectangle$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL277 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL277) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawrectangle$if_end1 +0;JMP +(screen.drawrectangle$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL278 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL278) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(screen.drawrectangle$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT47 +D=A +@38 +0;JMP +(RET_ADDRESS_LT47) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawrectangle$while_end1 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL279 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL279) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawrectangle$while_exp1 +0;JMP +(screen.drawrectangle$while_end1) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL280 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL280) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawrectangle$if_end1) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawrectangle$while_exp0 +0;JMP +(screen.drawrectangle$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawhorizontal) +@11 +D=A +(LOOP_screen.drawhorizontal) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawhorizontal +D;JGT +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.min +D=A +@R14 +M=D +@RET_ADDRESS_CALL281 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL281) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.max +D=A +@R14 +M=D +@RET_ADDRESS_CALL282 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL282) +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT37 +D=A +@22 +0;JMP +(RET_ADDRESS_GT37) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@256 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT48 +D=A +@38 +0;JMP +(RET_ADDRESS_LT48) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@512 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT49 +D=A +@38 +0;JMP +(RET_ADDRESS_LT49) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT38 +D=A +@22 +0;JMP +(RET_ADDRESS_GT38) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@screen.drawhorizontal$if_true0 +D;JNE +@screen.drawhorizontal$if_false0 +0;JMP +(screen.drawhorizontal$if_true0) +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@2 +D=A +@R13 +M=D +@math.max +D=A +@R14 +M=D +@RET_ADDRESS_CALL283 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL283) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.min +D=A +@R14 +M=D +@RET_ADDRESS_CALL284 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL284) +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL285 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL285) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL286 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL286) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL287 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL287) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL288 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL288) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@10 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL289 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL289) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ29 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ29) +@SP +AM=M-1 +D=M +@screen.drawhorizontal$if_true1 +D;JNE +@screen.drawhorizontal$if_false1 +0;JMP +(screen.drawhorizontal$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL290 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL290) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawhorizontal$if_end1 +0;JMP +(screen.drawhorizontal$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL291 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL291) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(screen.drawhorizontal$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT50 +D=A +@38 +0;JMP +(RET_ADDRESS_LT50) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawhorizontal$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL292 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL292) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawhorizontal$while_exp0 +0;JMP +(screen.drawhorizontal$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL293 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL293) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawhorizontal$if_end1) +(screen.drawhorizontal$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawsymetric) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL294 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL294) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL295 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL295) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL296 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL296) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL297 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL297) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawcircle) +@3 +D=A +(LOOP_screen.drawcircle) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawcircle +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT51 +D=A +@38 +0;JMP +(RET_ADDRESS_LT51) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT39 +D=A +@22 +0;JMP +(RET_ADDRESS_GT39) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT52 +D=A +@38 +0;JMP +(RET_ADDRESS_LT52) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT40 +D=A +@22 +0;JMP +(RET_ADDRESS_GT40) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawcircle$if_true0 +D;JNE +@screen.drawcircle$if_false0 +0;JMP +(screen.drawcircle$if_true0) +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL298 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL298) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawcircle$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT53 +D=A +@38 +0;JMP +(RET_ADDRESS_LT53) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT41 +D=A +@22 +0;JMP +(RET_ADDRESS_GT41) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT54 +D=A +@38 +0;JMP +(RET_ADDRESS_LT54) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT42 +D=A +@22 +0;JMP +(RET_ADDRESS_GT42) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawcircle$if_true1 +D;JNE +@screen.drawcircle$if_false1 +0;JMP +(screen.drawcircle$if_true1) +@13 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL299 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL299) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawcircle$if_false1) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@screen.drawsymetric +D=A +@R14 +M=D +@RET_ADDRESS_CALL300 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL300) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawcircle$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT43 +D=A +@22 +0;JMP +(RET_ADDRESS_GT43) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawcircle$while_end0 +D;JNE +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT55 +D=A +@38 +0;JMP +(RET_ADDRESS_LT55) +@SP +AM=M-1 +D=M +@screen.drawcircle$if_true2 +D;JNE +@screen.drawcircle$if_false2 +0;JMP +(screen.drawcircle$if_true2) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL301 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL301) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@screen.drawcircle$if_end2 +0;JMP +(screen.drawcircle$if_false2) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL302 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL302) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(screen.drawcircle$if_end2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@screen.drawsymetric +D=A +@R14 +M=D +@RET_ADDRESS_CALL303 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL303) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawcircle$while_exp0 +0;JMP +(screen.drawcircle$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.new) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL304 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL304) +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT56 +D=A +@38 +0;JMP +(RET_ADDRESS_LT56) +@SP +AM=M-1 +D=M +@string.new$if_true0 +D;JNE +@string.new$if_false0 +0;JMP +(string.new$if_true0) +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL305 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL305) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.new$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT44 +D=A +@22 +0;JMP +(RET_ADDRESS_GT44) +@SP +AM=M-1 +D=M +@string.new$if_true1 +D;JNE +@string.new$if_false1 +0;JMP +(string.new$if_true1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL306 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL306) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(string.new$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT45 +D=A +@22 +0;JMP +(RET_ADDRESS_GT45) +@SP +AM=M-1 +D=M +@string.dispose$if_true0 +D;JNE +@string.dispose$if_false0 +0;JMP +(string.dispose$if_true0) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL307 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL307) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.dispose$if_false0) +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL308 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL308) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.length) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.charat) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT57 +D=A +@38 +0;JMP +(RET_ADDRESS_LT57) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT46 +D=A +@22 +0;JMP +(RET_ADDRESS_GT46) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ30 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ30) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@string.charat$if_true0 +D;JNE +@string.charat$if_false0 +0;JMP +(string.charat$if_true0) +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL309 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL309) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.charat$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.setcharat) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT58 +D=A +@38 +0;JMP +(RET_ADDRESS_LT58) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT47 +D=A +@22 +0;JMP +(RET_ADDRESS_GT47) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ31 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ31) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@string.setcharat$if_true0 +D;JNE +@string.setcharat$if_false0 +0;JMP +(string.setcharat$if_true0) +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL310 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL310) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.setcharat$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.appendchar) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ32 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ32) +@SP +AM=M-1 +D=M +@string.appendchar$if_true0 +D;JNE +@string.appendchar$if_false0 +0;JMP +(string.appendchar$if_true0) +@17 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL311 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL311) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.appendchar$if_false0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.eraselastchar) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ33 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ33) +@SP +AM=M-1 +D=M +@string.eraselastchar$if_true0 +D;JNE +@string.eraselastchar$if_false0 +0;JMP +(string.eraselastchar$if_true0) +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL312 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL312) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.eraselastchar$if_false0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.intvalue) +@5 +D=A +(LOOP_string.intvalue) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_string.intvalue +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ34 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ34) +@SP +AM=M-1 +D=M +@string.intvalue$if_true0 +D;JNE +@string.intvalue$if_false0 +0;JMP +(string.intvalue$if_true0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.intvalue$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ35 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ35) +@SP +AM=M-1 +D=M +@string.intvalue$if_true1 +D;JNE +@string.intvalue$if_false1 +0;JMP +(string.intvalue$if_true1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(string.intvalue$if_false1) +(string.intvalue$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT59 +D=A +@38 +0;JMP +(RET_ADDRESS_LT59) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@string.intvalue$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT60 +D=A +@38 +0;JMP +(RET_ADDRESS_LT60) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT48 +D=A +@22 +0;JMP +(RET_ADDRESS_GT48) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@string.intvalue$if_true2 +D;JNE +@string.intvalue$if_false2 +0;JMP +(string.intvalue$if_true2) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL313 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL313) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(string.intvalue$if_false2) +@string.intvalue$while_exp0 +0;JMP +(string.intvalue$while_end0) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@string.intvalue$if_true3 +D;JNE +@string.intvalue$if_false3 +0;JMP +(string.intvalue$if_true3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(string.intvalue$if_false3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.setint) +@4 +D=A +(LOOP_string.setint) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_string.setint +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ36 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ36) +@SP +AM=M-1 +D=M +@string.setint$if_true0 +D;JNE +@string.setint$if_false0 +0;JMP +(string.setint$if_true0) +@19 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL314 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL314) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.setint$if_false0) +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL315 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL315) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT61 +D=A +@38 +0;JMP +(RET_ADDRESS_LT61) +@SP +AM=M-1 +D=M +@string.setint$if_true1 +D;JNE +@string.setint$if_false1 +0;JMP +(string.setint$if_true1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(string.setint$if_false1) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(string.setint$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT49 +D=A +@22 +0;JMP +(RET_ADDRESS_GT49) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@string.setint$while_end0 +D;JNE +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL316 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL316) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL317 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL317) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@string.setint$while_exp0 +0;JMP +(string.setint$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@string.setint$if_true2 +D;JNE +@string.setint$if_false2 +0;JMP +(string.setint$if_true2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(string.setint$if_false2) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT62 +D=A +@38 +0;JMP +(RET_ADDRESS_LT62) +@SP +AM=M-1 +D=M +@string.setint$if_true3 +D;JNE +@string.setint$if_false3 +0;JMP +(string.setint$if_true3) +@19 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL318 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL318) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.setint$if_false3) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ37 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ37) +@SP +AM=M-1 +D=M +@string.setint$if_true4 +D;JNE +@string.setint$if_false4 +0;JMP +(string.setint$if_true4) +@SP +M=M+1 +A=M-1 +M=0 +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@string.setint$if_end4 +0;JMP +(string.setint$if_false4) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +(string.setint$while_exp1) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT63 +D=A +@38 +0;JMP +(RET_ADDRESS_LT63) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@string.setint$while_end1 +D;JNE +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@string.setint$while_exp1 +0;JMP +(string.setint$while_end1) +(string.setint$if_end4) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL319 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL319) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.newline) +@128 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.backspace) +@129 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.doublequote) +@34 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(sys.init) +@0 +D=A +@R13 +M=D +@memory.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL320 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL320) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@math.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL321 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL321) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@screen.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL322 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL322) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@output.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL323 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL323) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@keyboard.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL324 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL324) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@main.main +D=A +@R14 +M=D +@RET_ADDRESS_CALL325 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL325) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@sys.halt +D=A +@R14 +M=D +@RET_ADDRESS_CALL326 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL326) +@SP +AM=M-1 +D=M +@R5 +M=D +(sys.halt) +(sys.halt$while_exp0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@sys.halt$while_end0 +D;JNE +@sys.halt$while_exp0 +0;JMP +(sys.halt$while_end0) +(sys.wait) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT64 +D=A +@38 +0;JMP +(RET_ADDRESS_LT64) +@SP +AM=M-1 +D=M +@sys.wait$if_true0 +D;JNE +@sys.wait$if_false0 +0;JMP +(sys.wait$if_true0) +@SP +M=M+1 +A=M-1 +M=1 +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL327 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL327) +@SP +AM=M-1 +D=M +@R5 +M=D +(sys.wait$if_false0) +(sys.wait$while_exp0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT50 +D=A +@22 +0;JMP +(RET_ADDRESS_GT50) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@sys.wait$while_end0 +D;JNE +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(sys.wait$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT51 +D=A +@22 +0;JMP +(RET_ADDRESS_GT51) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@sys.wait$while_end1 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@sys.wait$while_exp1 +0;JMP +(sys.wait$while_end1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@sys.wait$while_exp0 +0;JMP +(sys.wait$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(sys.error) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL328 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL328) +@69 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL329 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL329) +@82 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL330 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL330) +@82 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL331 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL331) +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL332 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL332) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printint +D=A +@R14 +M=D +@RET_ADDRESS_CALL333 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL333) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@sys.halt +D=A +@R14 +M=D +@RET_ADDRESS_CALL334 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL334) +@SP +AM=M-1 +D=M +@R5 +M=D \ No newline at end of file diff --git a/web-ide-main/projects/src/samples/hack/zero b/web-ide-main/projects/src/samples/hack/zero new file mode 100644 index 0000000..e69de29 diff --git a/web-ide-main/projects/src/samples/index.ts b/web-ide-main/projects/src/samples/index.ts new file mode 100644 index 0000000..35aba3b --- /dev/null +++ b/web-ide-main/projects/src/samples/index.ts @@ -0,0 +1,18 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; +import * as project_06 from "./project_06/index.js"; +import * as Tst from "./tst.js"; + +const TST = { + "TickTock.tst": Tst.TickTock, +}; + +export async function loadSamples(fs: FileSystem) { + await fs.pushd("/samples"); + await reset(fs, TST); + await reset(fs, project_06.FILES); + await fs.popd(); +} + +export const AsmProjects = { + "06": project_06, +}; diff --git a/web-ide-main/projects/src/samples/project_06/01_add.ts b/web-ide-main/projects/src/samples/project_06/01_add.ts new file mode 100644 index 0000000..44fbedd --- /dev/null +++ b/web-ide-main/projects/src/samples/project_06/01_add.ts @@ -0,0 +1,15 @@ +export const AddTst = `repeat 6 { tick, tock; }`; +export const AddAsm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. + +// Computes R0 = 2 + 3 (R0 refers to RAM[0]) + +@2 +D=A +@3 +D=D+A +@0 +M=D`; + +export const AddHack = [2, 60432, 3, 57488, 0, 58120]; diff --git a/web-ide-main/projects/src/samples/project_06/02_max.ts b/web-ide-main/projects/src/samples/project_06/02_max.ts new file mode 100644 index 0000000..c255b72 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_06/02_max.ts @@ -0,0 +1,69 @@ +export const MaxTst = ` +load Max.asm; +set %0 16548, set %1 12944; + +repeat 14 { + tick, tock; +} +`; +export const MaxAsm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/6/max/Max.asm + +// Computes R2 = max(R0, R1) (R0,R1,R2 refer to RAM[0],RAM[1],RAM[2]) +// Usage: Before executing, put two values in R0 and R1. + + // D = R0 - R1 + @R0 + D=M + @R1 + D=D-M + // If (D > 0) goto ITSR0 + @ITSR0 + D;JGT + // Its R1 + @R1 + D=M + @OUTPUT_D + 0;JMP +(ITSR0) + @R0 + D=M +(OUTPUT_D) + @R2 + M=D +(END) + @END + 0;JMP +`; + +export const MaxLAsm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/6/max/MaxL.asm + +// Symbol-less version of the Max.asm program. +// Designed for testing the basic version of the assembler. + +@0 +D=M +@1 +D=D-M +@10 +D;JGT +@1 +D=M +@12 +0;JMP +@0 +D=M +@2 +M=D +@14 +0;JMP`; + +export const MaxHack = [ + 0, 64528, 1, 62672, 10, 58113, 1, 64528, 12, 60039, 0, 64528, 2, 58120, 14, + 60039, +]; diff --git a/web-ide-main/projects/src/samples/project_06/03_rect.ts b/web-ide-main/projects/src/samples/project_06/03_rect.ts new file mode 100644 index 0000000..3a10316 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_06/03_rect.ts @@ -0,0 +1,88 @@ +export const RectTst = ` +load Rect.asm; +set %0 16; + +repeat { + tick, tock; +} +`; +export const RectAsm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/6/rect/Rect.asm + +// Draws a rectangle at the top-left corner of the screen. +// The rectangle is 16 pixels wide and R0 pixels high. +// Usage: Before executing, put a value in R0. + + // If (R0 <= 0) goto END else n = R0 + @R0 + D=M + @END + D;JLE + @n + M=D + // addr = base address of first screen row + @SCREEN + D=A + @addr + M=D +(LOOP) + // RAM[addr] = -1 + @addr + A=M + M=-1 + // addr = base address of next screen row + @addr + D=M + @32 + D=D+A + @addr + M=D + // decrements n and loops + @n + MD=M-1 + @LOOP + D;JGT +(END) + @END + 0;JMP`; + +export const RectLAsm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/6/rect/RectL.asm + +// Symbol-less version of the Rect.asm program. +// Designed for testing the basic version of the assembler. + +@0 +D=M +@23 +D;JLE +@16 +M=D +@16384 +D=A +@17 +M=D +@17 +A=M +M=-1 +@17 +D=M +@32 +D=D+A +@17 +M=D +@16 +MD=M-1 +@10 +D;JGT +@23 +0;JMP`; + +export const RectHack = [ + 0, 64528, 23, 58118, 16, 58120, 16384, 60432, 17, 58120, 17, 64544, 61064, 17, + 64528, 32, 57488, 17, 58120, 16, 64664, 10, 58113, 23, 60039, +]; diff --git a/web-ide-main/projects/src/samples/project_06/04_pong.ts b/web-ide-main/projects/src/samples/project_06/04_pong.ts new file mode 100644 index 0000000..92a00a2 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_06/04_pong.ts @@ -0,0 +1,3 @@ +export const PongAsm = async () => (await import("./04_pong_asm.js")).PongAsm; +export const PongLAsm = async () => (await import("./04_pong_asm.js")).PongLAsm; +export const PongHack = async () => (await import("./04_pong_asm.js")).PongHack; diff --git a/web-ide-main/projects/src/samples/project_06/04_pong_asm.ts b/web-ide-main/projects/src/samples/project_06/04_pong_asm.ts new file mode 100644 index 0000000..54aee0f --- /dev/null +++ b/web-ide-main/projects/src/samples/project_06/04_pong_asm.ts @@ -0,0 +1,57975 @@ +// prettier-ignore +export const PongAsm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/06/pong/Pong.asm + +// The Pong game program was originally written in the high-level Jack language. +// The Jack code was then translated by the Jack compiler into VM code. +// The VM code was then translated by the VM translator into the Hack +// assembly code shown here. + +@256 +D=A +@SP +M=D +@133 +0;JMP +@R15 +M=D +@SP +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@END_EQ +D;JNE +@SP +A=M-1 +M=-1 +(END_EQ) +@R15 +A=M +0;JMP +@R15 +M=D +@SP +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@END_GT +D;JLE +@SP +A=M-1 +M=-1 +(END_GT) +@R15 +A=M +0;JMP +@R15 +M=D +@SP +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@END_LT +D;JGE +@SP +A=M-1 +M=-1 +(END_LT) +@R15 +A=M +0;JMP +@5 +D=A +@LCL +A=M-D +D=M +@R13 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +D=A +@SP +M=D+1 +@LCL +D=M +@R14 +AM=D-1 +D=M +@THAT +M=D +@R14 +AM=M-1 +D=M +@THIS +M=D +@R14 +AM=M-1 +D=M +@ARG +M=D +@R14 +AM=M-1 +D=M +@LCL +M=D +@R13 +A=M +0;JMP +@SP +A=M +M=D +@LCL +D=M +@SP +AM=M+1 +M=D +@ARG +D=M +@SP +AM=M+1 +M=D +@THIS +D=M +@SP +AM=M+1 +M=D +@THAT +D=M +@SP +AM=M+1 +M=D +@4 +D=A +@R13 +D=D+M +@SP +D=M-D +@ARG +M=D +@SP +MD=M+1 +@LCL +M=D +@R14 +A=M +0;JMP +@0 +D=A +@R13 +M=D +@sys.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL0 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL0) +(ball.new) +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL1 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL1) +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@10 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +D=M +@11 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@12 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +D=M +@13 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL2 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL2) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ball.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL3 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL3) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.show) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL4 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL4) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL5 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL5) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.hide) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL6 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL6) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL7 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL7) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.draw) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL8 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL8) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.getleft) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ball.getright) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +(ball.setdestination) +@3 +D=A +(LOOP_ball.setdestination) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_ball.setdestination +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL9 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL9) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL10 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL10) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT0 +D=A +@38 +0;JMP +(RET_ADDRESS_LT0) +@THIS +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.setdestination$if_true0 +D;JNE +@ball.setdestination$if_false0 +0;JMP +(ball.setdestination$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT1 +D=A +@38 +0;JMP +(RET_ADDRESS_LT1) +@THIS +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT2 +D=A +@38 +0;JMP +(RET_ADDRESS_LT2) +@THIS +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ball.setdestination$if_end0 +0;JMP +(ball.setdestination$if_false0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT3 +D=A +@38 +0;JMP +(RET_ADDRESS_LT3) +@THIS +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT4 +D=A +@38 +0;JMP +(RET_ADDRESS_LT4) +@THIS +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +(ball.setdestination$if_end0) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL11 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL11) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL12 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL12) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL13 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL13) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.move) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.hide +D=A +@R14 +M=D +@RET_ADDRESS_CALL14 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL14) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT5 +D=A +@38 +0;JMP +(RET_ADDRESS_LT5) +@SP +AM=M-1 +D=M +@ball.move$if_true0 +D;JNE +@ball.move$if_false0 +0;JMP +(ball.move$if_true0) +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ball.move$if_end0 +0;JMP +(ball.move$if_false0) +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true1 +D;JNE +@ball.move$if_false1 +0;JMP +(ball.move$if_true1) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true2 +D;JNE +@ball.move$if_false2 +0;JMP +(ball.move$if_true2) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ball.move$if_end2 +0;JMP +(ball.move$if_false2) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_end2) +@ball.move$if_end1 +0;JMP +(ball.move$if_false1) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true3 +D;JNE +@ball.move$if_false3 +0;JMP +(ball.move$if_true3) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ball.move$if_end3 +0;JMP +(ball.move$if_false3) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_end3) +(ball.move$if_end1) +(ball.move$if_end0) +@THIS +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true4 +D;JNE +@ball.move$if_false4 +0;JMP +(ball.move$if_true4) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true5 +D;JNE +@ball.move$if_false5 +0;JMP +(ball.move$if_true5) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ball.move$if_end5 +0;JMP +(ball.move$if_false5) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_end5) +@ball.move$if_end4 +0;JMP +(ball.move$if_false4) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true6 +D;JNE +@ball.move$if_false6 +0;JMP +(ball.move$if_true6) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ball.move$if_end6 +0;JMP +(ball.move$if_false6) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_end6) +(ball.move$if_end4) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT0 +D=A +@22 +0;JMP +(RET_ADDRESS_GT0) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true7 +D;JNE +@ball.move$if_false7 +0;JMP +(ball.move$if_true7) +@SP +M=M+1 +A=M-1 +M=1 +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_false7) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@11 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT6 +D=A +@38 +0;JMP +(RET_ADDRESS_LT6) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true8 +D;JNE +@ball.move$if_false8 +0;JMP +(ball.move$if_true8) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@11 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_false8) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@12 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT1 +D=A +@22 +0;JMP +(RET_ADDRESS_GT1) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true9 +D;JNE +@ball.move$if_false9 +0;JMP +(ball.move$if_true9) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@12 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_false9) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@13 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT7 +D=A +@38 +0;JMP +(RET_ADDRESS_LT7) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true10 +D;JNE +@ball.move$if_false10 +0;JMP +(ball.move$if_true10) +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@13 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_false10) +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL15 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL15) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ball.bounce) +@5 +D=A +(LOOP_ball.bounce) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_ball.bounce +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL16 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL16) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL17 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL17) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ0 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ0) +@SP +AM=M-1 +D=M +@ball.bounce$if_true0 +D;JNE +@ball.bounce$if_false0 +0;JMP +(ball.bounce$if_true0) +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ball.bounce$if_end0 +0;JMP +(ball.bounce$if_false0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT8 +D=A +@38 +0;JMP +(RET_ADDRESS_LT8) +@SP +A=M-1 +M=!M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_EQ1 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ1) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT9 +D=A +@38 +0;JMP +(RET_ADDRESS_LT9) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_EQ2 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ2) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@ball.bounce$if_true1 +D;JNE +@ball.bounce$if_false1 +0;JMP +(ball.bounce$if_true1) +@20 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ball.bounce$if_end1 +0;JMP +(ball.bounce$if_false1) +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +(ball.bounce$if_end1) +(ball.bounce$if_end0) +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_EQ3 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ3) +@SP +AM=M-1 +D=M +@ball.bounce$if_true2 +D;JNE +@ball.bounce$if_false2 +0;JMP +(ball.bounce$if_true2) +@506 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL18 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL18) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL19 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL19) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL20 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL20) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ball.bounce$if_end2 +0;JMP +(ball.bounce$if_false2) +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ4 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ4) +@SP +AM=M-1 +D=M +@ball.bounce$if_true3 +D;JNE +@ball.bounce$if_false3 +0;JMP +(ball.bounce$if_true3) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL21 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL21) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL22 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL22) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL23 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL23) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ball.bounce$if_end3 +0;JMP +(ball.bounce$if_false3) +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ5 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ5) +@SP +AM=M-1 +D=M +@ball.bounce$if_true4 +D;JNE +@ball.bounce$if_false4 +0;JMP +(ball.bounce$if_true4) +@250 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL24 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL24) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL25 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL25) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL26 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL26) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ball.bounce$if_end4 +0;JMP +(ball.bounce$if_false4) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL27 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL27) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL28 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL28) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL29 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL29) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(ball.bounce$if_end4) +(ball.bounce$if_end3) +(ball.bounce$if_end2) +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@R13 +M=D +@ball.setdestination +D=A +@R14 +M=D +@RET_ADDRESS_CALL30 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL30) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.new) +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL31 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL31) +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL32 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL32) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(bat.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL33 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL33) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.show) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL34 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL34) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL35 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL35) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.hide) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL36 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL36) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL37 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL37) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.draw) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL38 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL38) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.setdirection) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.getleft) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(bat.getright) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +(bat.setwidth) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.hide +D=A +@R14 +M=D +@RET_ADDRESS_CALL39 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL39) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL40 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL40) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.move) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_EQ6 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ6) +@SP +AM=M-1 +D=M +@bat.move$if_true0 +D;JNE +@bat.move$if_false0 +0;JMP +(bat.move$if_true0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT10 +D=A +@38 +0;JMP +(RET_ADDRESS_LT10) +@SP +AM=M-1 +D=M +@bat.move$if_true1 +D;JNE +@bat.move$if_false1 +0;JMP +(bat.move$if_true1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(bat.move$if_false1) +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL41 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL41) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL42 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL42) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL43 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL43) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL44 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL44) +@SP +AM=M-1 +D=M +@R5 +M=D +@bat.move$if_end0 +0;JMP +(bat.move$if_false0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT2 +D=A +@22 +0;JMP +(RET_ADDRESS_GT2) +@SP +AM=M-1 +D=M +@bat.move$if_true2 +D;JNE +@bat.move$if_false2 +0;JMP +(bat.move$if_true2) +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(bat.move$if_false2) +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL45 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL45) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL46 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL46) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL47 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL47) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL48 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL48) +@SP +AM=M-1 +D=M +@R5 +M=D +(bat.move$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(main.main) +@SP +AM=M+1 +A=A-1 +M=0 +@0 +D=A +@R13 +M=D +@ponggame.newinstance +D=A +@R14 +M=D +@RET_ADDRESS_CALL49 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL49) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@ponggame.getinstance +D=A +@R14 +M=D +@RET_ADDRESS_CALL50 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL50) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.run +D=A +@R14 +M=D +@RET_ADDRESS_CALL51 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL51) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL52 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL52) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.new) +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL53 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL53) +@SP +AM=M-1 +D=M +@THIS +M=D +@0 +D=A +@R13 +M=D +@screen.clearscreen +D=A +@R14 +M=D +@RET_ADDRESS_CALL54 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL54) +@SP +AM=M-1 +D=M +@R5 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@230 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@229 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@bat.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL55 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL55) +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@253 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@222 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@229 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@R13 +M=D +@ball.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL56 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL56) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@400 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@3 +D=A +@R13 +M=D +@ball.setdestination +D=A +@R14 +M=D +@RET_ADDRESS_CALL57 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL57) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@238 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@240 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL58 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL58) +@SP +AM=M-1 +D=M +@R5 +M=D +@22 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@2 +D=A +@R13 +M=D +@output.movecursor +D=A +@R14 +M=D +@RET_ADDRESS_CALL59 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL59) +@SP +AM=M-1 +D=M +@R5 +M=D +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL60 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL60) +@83 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL61 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL61) +@99 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL62 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL62) +@111 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL63 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL63) +@114 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL64 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL64) +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL65 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL65) +@58 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL66 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL66) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL67 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL67) +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL68 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL68) +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL69 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL69) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ponggame.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL70 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL70) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL71 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL71) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL72 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL72) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.newinstance) +@0 +D=A +@R13 +M=D +@ponggame.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL73 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL73) +@SP +AM=M-1 +D=M +@ponggame.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.getinstance) +@ponggame.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ponggame.run) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +(ponggame.run$while_exp0) +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.run$while_end0 +D;JNE +(ponggame.run$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ7 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ7) +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.run$while_end1 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.keypressed +D=A +@R14 +M=D +@RET_ADDRESS_CALL74 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL74) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.move +D=A +@R14 +M=D +@RET_ADDRESS_CALL75 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL75) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.moveball +D=A +@R14 +M=D +@RET_ADDRESS_CALL76 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL76) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$while_exp1 +0;JMP +(ponggame.run$while_end1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@130 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ8 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ8) +@SP +AM=M-1 +D=M +@ponggame.run$if_true0 +D;JNE +@ponggame.run$if_false0 +0;JMP +(ponggame.run$if_true0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@2 +D=A +@R13 +M=D +@bat.setdirection +D=A +@R14 +M=D +@RET_ADDRESS_CALL77 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL77) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$if_end0 +0;JMP +(ponggame.run$if_false0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@132 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ9 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ9) +@SP +AM=M-1 +D=M +@ponggame.run$if_true1 +D;JNE +@ponggame.run$if_false1 +0;JMP +(ponggame.run$if_true1) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@bat.setdirection +D=A +@R14 +M=D +@RET_ADDRESS_CALL78 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL78) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$if_end1 +0;JMP +(ponggame.run$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@140 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ10 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ10) +@SP +AM=M-1 +D=M +@ponggame.run$if_true2 +D;JNE +@ponggame.run$if_false2 +0;JMP +(ponggame.run$if_true2) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +(ponggame.run$if_false2) +(ponggame.run$if_end1) +(ponggame.run$if_end0) +(ponggame.run$while_exp2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ11 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ11) +@SP +A=M-1 +M=!M +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.run$while_end2 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.keypressed +D=A +@R14 +M=D +@RET_ADDRESS_CALL79 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL79) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.move +D=A +@R14 +M=D +@RET_ADDRESS_CALL80 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL80) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.moveball +D=A +@R14 +M=D +@RET_ADDRESS_CALL81 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL81) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$while_exp2 +0;JMP +(ponggame.run$while_end2) +@ponggame.run$while_exp0 +0;JMP +(ponggame.run$while_end0) +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ponggame.run$if_true3 +D;JNE +@ponggame.run$if_false3 +0;JMP +(ponggame.run$if_true3) +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@output.movecursor +D=A +@R14 +M=D +@RET_ADDRESS_CALL82 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL82) +@SP +AM=M-1 +D=M +@R5 +M=D +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL83 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL83) +@71 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL84 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL84) +@97 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL85 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL85) +@109 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL86 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL86) +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL87 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL87) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL88 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL88) +@79 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL89 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL89) +@118 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL90 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL90) +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL91 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL91) +@114 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL92 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL92) +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL93 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL93) +@SP +AM=M-1 +D=M +@R5 +M=D +(ponggame.run$if_false3) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.moveball) +@5 +D=A +(LOOP_ponggame.moveball) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_ponggame.moveball +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.move +D=A +@R14 +M=D +@RET_ADDRESS_CALL94 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL94) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT3 +D=A +@22 +0;JMP +(RET_ADDRESS_GT3) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ12 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ12) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true0 +D;JNE +@ponggame.moveball$if_false0 +0;JMP +(ponggame.moveball$if_true0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.getleft +D=A +@R14 +M=D +@RET_ADDRESS_CALL95 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL95) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.getright +D=A +@R14 +M=D +@RET_ADDRESS_CALL96 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL96) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.getleft +D=A +@R14 +M=D +@RET_ADDRESS_CALL97 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL97) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.getright +D=A +@R14 +M=D +@RET_ADDRESS_CALL98 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL98) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ13 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ13) +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true1 +D;JNE +@ponggame.moveball$if_false1 +0;JMP +(ponggame.moveball$if_true1) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT4 +D=A +@22 +0;JMP +(RET_ADDRESS_GT4) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT11 +D=A +@38 +0;JMP +(RET_ADDRESS_LT11) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true2 +D;JNE +@ponggame.moveball$if_false2 +0;JMP +(ponggame.moveball$if_true2) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_LT12 +D=A +@38 +0;JMP +(RET_ADDRESS_LT12) +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true3 +D;JNE +@ponggame.moveball$if_false3 +0;JMP +(ponggame.moveball$if_true3) +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ponggame.moveball$if_end3 +0;JMP +(ponggame.moveball$if_false3) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@RET_ADDRESS_GT5 +D=A +@22 +0;JMP +(RET_ADDRESS_GT5) +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true4 +D;JNE +@ponggame.moveball$if_false4 +0;JMP +(ponggame.moveball$if_true4) +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(ponggame.moveball$if_false4) +(ponggame.moveball$if_end3) +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@bat.setwidth +D=A +@R14 +M=D +@RET_ADDRESS_CALL99 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL99) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@22 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@output.movecursor +D=A +@R14 +M=D +@RET_ADDRESS_CALL100 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL100) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printint +D=A +@R14 +M=D +@RET_ADDRESS_CALL101 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL101) +@SP +AM=M-1 +D=M +@R5 +M=D +(ponggame.moveball$if_false2) +(ponggame.moveball$if_false1) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@ball.bounce +D=A +@R14 +M=D +@RET_ADDRESS_CALL102 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL102) +@SP +AM=M-1 +D=M +@R5 +M=D +(ponggame.moveball$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(array.new) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT6 +D=A +@22 +0;JMP +(RET_ADDRESS_GT6) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@array.new$if_true0 +D;JNE +@array.new$if_false0 +0;JMP +(array.new$if_true0) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL103 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL103) +@SP +AM=M-1 +D=M +@R5 +M=D +(array.new$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL104 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL104) +@54 +0;JMP +(array.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL105 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL105) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(keyboard.init) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(keyboard.keypressed) +@24576 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.peek +D=A +@R14 +M=D +@RET_ADDRESS_CALL106 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL106) +@54 +0;JMP +(keyboard.readchar) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL107 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL107) +@SP +AM=M-1 +D=M +@R5 +M=D +(keyboard.readchar$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ14 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ14) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT7 +D=A +@22 +0;JMP +(RET_ADDRESS_GT7) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@keyboard.readchar$while_end0 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.keypressed +D=A +@R14 +M=D +@RET_ADDRESS_CALL108 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL108) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT8 +D=A +@22 +0;JMP +(RET_ADDRESS_GT8) +@SP +AM=M-1 +D=M +@keyboard.readchar$if_true0 +D;JNE +@keyboard.readchar$if_false0 +0;JMP +(keyboard.readchar$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(keyboard.readchar$if_false0) +@keyboard.readchar$while_exp0 +0;JMP +(keyboard.readchar$while_end0) +@0 +D=A +@R13 +M=D +@string.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL109 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL109) +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL110 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL110) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL111 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL111) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(keyboard.readline) +@5 +D=A +(LOOP_keyboard.readline) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_keyboard.readline +D;JGT +@80 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL112 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL112) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL113 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL113) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@string.newline +D=A +@R14 +M=D +@RET_ADDRESS_CALL114 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL114) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@0 +D=A +@R13 +M=D +@string.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL115 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL115) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(keyboard.readline$while_exp0) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@keyboard.readline$while_end0 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.readchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL116 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL116) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ15 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ15) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@keyboard.readline$if_true0 +D;JNE +@keyboard.readline$if_false0 +0;JMP +(keyboard.readline$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ16 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ16) +@SP +AM=M-1 +D=M +@keyboard.readline$if_true1 +D;JNE +@keyboard.readline$if_false1 +0;JMP +(keyboard.readline$if_true1) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.eraselastchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL117 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL117) +@SP +AM=M-1 +D=M +@R5 +M=D +@keyboard.readline$if_end1 +0;JMP +(keyboard.readline$if_false1) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL118 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL118) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(keyboard.readline$if_end1) +(keyboard.readline$if_false0) +@keyboard.readline$while_exp0 +0;JMP +(keyboard.readline$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(keyboard.readint) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@keyboard.readline +D=A +@R14 +M=D +@RET_ADDRESS_CALL119 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL119) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.intvalue +D=A +@R14 +M=D +@RET_ADDRESS_CALL120 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL120) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL121 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL121) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.init) +@SP +AM=M+1 +A=A-1 +M=0 +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL122 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL122) +@SP +AM=M-1 +D=M +@math.1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL123 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL123) +@SP +AM=M-1 +D=M +@math.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(math.init$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT13 +D=A +@38 +0;JMP +(RET_ADDRESS_LT13) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.init$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@math.init$while_exp0 +0;JMP +(math.init$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(math.abs) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT14 +D=A +@38 +0;JMP +(RET_ADDRESS_LT14) +@SP +AM=M-1 +D=M +@math.abs$if_true0 +D;JNE +@math.abs$if_false0 +0;JMP +(math.abs$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(math.abs$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.multiply) +@5 +D=A +(LOOP_math.multiply) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_math.multiply +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT15 +D=A +@38 +0;JMP +(RET_ADDRESS_LT15) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT9 +D=A +@22 +0;JMP +(RET_ADDRESS_GT9) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT10 +D=A +@22 +0;JMP +(RET_ADDRESS_GT10) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT16 +D=A +@38 +0;JMP +(RET_ADDRESS_LT16) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL124 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL124) +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL125 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL125) +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT17 +D=A +@38 +0;JMP +(RET_ADDRESS_LT17) +@SP +AM=M-1 +D=M +@math.multiply$if_true0 +D;JNE +@math.multiply$if_false0 +0;JMP +(math.multiply$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(math.multiply$if_false0) +(math.multiply$while_exp0) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT18 +D=A +@38 +0;JMP +(RET_ADDRESS_LT18) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.multiply$while_end0 +D;JNE +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT11 +D=A +@22 +0;JMP +(RET_ADDRESS_GT11) +@SP +AM=M-1 +D=M +@math.multiply$if_true1 +D;JNE +@math.multiply$if_false1 +0;JMP +(math.multiply$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(math.multiply$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@math.multiply$while_exp0 +0;JMP +(math.multiply$while_end0) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@math.multiply$if_true2 +D;JNE +@math.multiply$if_false2 +0;JMP +(math.multiply$if_true2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(math.multiply$if_false2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.divide) +@4 +D=A +(LOOP_math.divide) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_math.divide +D;JGT +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ17 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ17) +@SP +AM=M-1 +D=M +@math.divide$if_true0 +D;JNE +@math.divide$if_false0 +0;JMP +(math.divide$if_true0) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL126 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL126) +@SP +AM=M-1 +D=M +@R5 +M=D +(math.divide$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT19 +D=A +@38 +0;JMP +(RET_ADDRESS_LT19) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT12 +D=A +@22 +0;JMP +(RET_ADDRESS_GT12) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT13 +D=A +@22 +0;JMP +(RET_ADDRESS_GT13) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT20 +D=A +@38 +0;JMP +(RET_ADDRESS_LT20) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL127 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL127) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL128 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL128) +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(math.divide$while_exp0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$while_end0 +D;JNE +@32767 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT21 +D=A +@38 +0;JMP +(RET_ADDRESS_LT21) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$if_true1 +D;JNE +@math.divide$if_false1 +0;JMP +(math.divide$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT14 +D=A +@22 +0;JMP +(RET_ADDRESS_GT14) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$if_true2 +D;JNE +@math.divide$if_false2 +0;JMP +(math.divide$if_true2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(math.divide$if_false2) +(math.divide$if_false1) +@math.divide$while_exp0 +0;JMP +(math.divide$while_end0) +(math.divide$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT15 +D=A +@22 +0;JMP +(RET_ADDRESS_GT15) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$while_end1 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT16 +D=A +@22 +0;JMP +(RET_ADDRESS_GT16) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$if_true3 +D;JNE +@math.divide$if_false3 +0;JMP +(math.divide$if_true3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(math.divide$if_false3) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@math.divide$while_exp1 +0;JMP +(math.divide$while_end1) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@math.divide$if_true4 +D;JNE +@math.divide$if_false4 +0;JMP +(math.divide$if_true4) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(math.divide$if_false4) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.sqrt) +@4 +D=A +(LOOP_math.sqrt) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_math.sqrt +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT22 +D=A +@38 +0;JMP +(RET_ADDRESS_LT22) +@SP +AM=M-1 +D=M +@math.sqrt$if_true0 +D;JNE +@math.sqrt$if_false0 +0;JMP +(math.sqrt$if_true0) +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL129 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL129) +@SP +AM=M-1 +D=M +@R5 +M=D +(math.sqrt$if_false0) +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(math.sqrt$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT17 +D=A +@22 +0;JMP +(RET_ADDRESS_GT17) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.sqrt$while_end0 +D;JNE +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL130 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL130) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT18 +D=A +@22 +0;JMP +(RET_ADDRESS_GT18) +@SP +A=M-1 +M=!M +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT23 +D=A +@38 +0;JMP +(RET_ADDRESS_LT23) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@math.sqrt$if_true1 +D;JNE +@math.sqrt$if_false1 +0;JMP +(math.sqrt$if_true1) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(math.sqrt$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@math.sqrt$while_exp0 +0;JMP +(math.sqrt$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.max) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT19 +D=A +@22 +0;JMP +(RET_ADDRESS_GT19) +@SP +AM=M-1 +D=M +@math.max$if_true0 +D;JNE +@math.max$if_false0 +0;JMP +(math.max$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(math.max$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.min) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT24 +D=A +@38 +0;JMP +(RET_ADDRESS_LT24) +@SP +AM=M-1 +D=M +@math.min$if_true0 +D;JNE +@math.min$if_false0 +0;JMP +(math.min$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(math.min$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(memory.init) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@memory.0 +M=D +@2048 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@14334 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@2049 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@2050 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(memory.peek) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(memory.poke) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(memory.alloc) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_LT25 +D=A +@38 +0;JMP +(RET_ADDRESS_LT25) +@SP +AM=M-1 +D=M +@memory.alloc$if_true0 +D;JNE +@memory.alloc$if_false0 +0;JMP +(memory.alloc$if_true0) +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL131 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL131) +@SP +AM=M-1 +D=M +@R5 +M=D +(memory.alloc$if_false0) +@2048 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(memory.alloc$while_exp0) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT26 +D=A +@38 +0;JMP +(RET_ADDRESS_LT26) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@memory.alloc$while_end0 +D;JNE +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@memory.alloc$while_exp0 +0;JMP +(memory.alloc$while_end0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@16379 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT20 +D=A +@22 +0;JMP +(RET_ADDRESS_GT20) +@SP +AM=M-1 +D=M +@memory.alloc$if_true1 +D;JNE +@memory.alloc$if_false1 +0;JMP +(memory.alloc$if_true1) +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL132 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL132) +@SP +AM=M-1 +D=M +@R5 +M=D +(memory.alloc$if_false1) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_GT21 +D=A +@22 +0;JMP +(RET_ADDRESS_GT21) +@SP +AM=M-1 +D=M +@memory.alloc$if_true2 +D;JNE +@memory.alloc$if_false2 +0;JMP +(memory.alloc$if_true2) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_EQ18 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ18) +@SP +AM=M-1 +D=M +@memory.alloc$if_true3 +D;JNE +@memory.alloc$if_false3 +0;JMP +(memory.alloc$if_true3) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@memory.alloc$if_end3 +0;JMP +(memory.alloc$if_false3) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(memory.alloc$if_end3) +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(memory.alloc$if_false2) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +(memory.dealloc) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ19 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ19) +@SP +AM=M-1 +D=M +@memory.dealloc$if_true0 +D;JNE +@memory.dealloc$if_false0 +0;JMP +(memory.dealloc$if_true0) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@memory.dealloc$if_end0 +0;JMP +(memory.dealloc$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_EQ20 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ20) +@SP +AM=M-1 +D=M +@memory.dealloc$if_true1 +D;JNE +@memory.dealloc$if_false1 +0;JMP +(memory.dealloc$if_true1) +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@memory.dealloc$if_end1 +0;JMP +(memory.dealloc$if_false1) +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(memory.dealloc$if_end1) +(memory.dealloc$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.init) +@16384 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.4 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@output.0 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL133 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL133) +@SP +AM=M-1 +D=M +@output.3 +M=D +@0 +D=A +@R13 +M=D +@output.initmap +D=A +@R14 +M=D +@RET_ADDRESS_CALL134 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL134) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@output.createshiftedmap +D=A +@R14 +M=D +@RET_ADDRESS_CALL135 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL135) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.initmap) +@127 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL136 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL136) +@SP +AM=M-1 +D=M +@output.5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL137 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL137) +@SP +AM=M-1 +D=M +@R5 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL138 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL138) +@SP +AM=M-1 +D=M +@R5 +M=D +@33 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL139 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL139) +@SP +AM=M-1 +D=M +@R5 +M=D +@34 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@20 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL140 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL140) +@SP +AM=M-1 +D=M +@R5 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL141 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL141) +@SP +AM=M-1 +D=M +@R5 +M=D +@36 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL142 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL142) +@SP +AM=M-1 +D=M +@R5 +M=D +@37 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL143 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL143) +@SP +AM=M-1 +D=M +@R5 +M=D +@38 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL144 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL144) +@SP +AM=M-1 +D=M +@R5 +M=D +@39 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL145 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL145) +@SP +AM=M-1 +D=M +@R5 +M=D +@40 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL146 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL146) +@SP +AM=M-1 +D=M +@R5 +M=D +@41 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL147 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL147) +@SP +AM=M-1 +D=M +@R5 +M=D +@42 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL148 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL148) +@SP +AM=M-1 +D=M +@R5 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL149 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL149) +@SP +AM=M-1 +D=M +@R5 +M=D +@44 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL150 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL150) +@SP +AM=M-1 +D=M +@R5 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL151 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL151) +@SP +AM=M-1 +D=M +@R5 +M=D +@46 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL152 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL152) +@SP +AM=M-1 +D=M +@R5 +M=D +@47 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL153 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL153) +@SP +AM=M-1 +D=M +@R5 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL154 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL154) +@SP +AM=M-1 +D=M +@R5 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL155 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL155) +@SP +AM=M-1 +D=M +@R5 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL156 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL156) +@SP +AM=M-1 +D=M +@R5 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL157 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL157) +@SP +AM=M-1 +D=M +@R5 +M=D +@52 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@26 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL158 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL158) +@SP +AM=M-1 +D=M +@R5 +M=D +@53 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL159 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL159) +@SP +AM=M-1 +D=M +@R5 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL160 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL160) +@SP +AM=M-1 +D=M +@R5 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL161 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL161) +@SP +AM=M-1 +D=M +@R5 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL162 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL162) +@SP +AM=M-1 +D=M +@R5 +M=D +@57 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL163 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL163) +@SP +AM=M-1 +D=M +@R5 +M=D +@58 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL164 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL164) +@SP +AM=M-1 +D=M +@R5 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL165 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL165) +@SP +AM=M-1 +D=M +@R5 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL166 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL166) +@SP +AM=M-1 +D=M +@R5 +M=D +@61 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL167 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL167) +@SP +AM=M-1 +D=M +@R5 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL168 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL168) +@SP +AM=M-1 +D=M +@R5 +M=D +@64 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL169 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL169) +@SP +AM=M-1 +D=M +@R5 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL170 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL170) +@SP +AM=M-1 +D=M +@R5 +M=D +@65 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL171 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL171) +@SP +AM=M-1 +D=M +@R5 +M=D +@66 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL172 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL172) +@SP +AM=M-1 +D=M +@R5 +M=D +@67 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL173 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL173) +@SP +AM=M-1 +D=M +@R5 +M=D +@68 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL174 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL174) +@SP +AM=M-1 +D=M +@R5 +M=D +@69 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL175 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL175) +@SP +AM=M-1 +D=M +@R5 +M=D +@70 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL176 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL176) +@SP +AM=M-1 +D=M +@R5 +M=D +@71 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@44 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL177 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL177) +@SP +AM=M-1 +D=M +@R5 +M=D +@72 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL178 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL178) +@SP +AM=M-1 +D=M +@R5 +M=D +@73 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL179 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL179) +@SP +AM=M-1 +D=M +@R5 +M=D +@74 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL180 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL180) +@SP +AM=M-1 +D=M +@R5 +M=D +@75 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL181 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL181) +@SP +AM=M-1 +D=M +@R5 +M=D +@76 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL182 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL182) +@SP +AM=M-1 +D=M +@R5 +M=D +@77 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@33 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL183 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL183) +@SP +AM=M-1 +D=M +@R5 +M=D +@78 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL184 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL184) +@SP +AM=M-1 +D=M +@R5 +M=D +@79 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL185 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL185) +@SP +AM=M-1 +D=M +@R5 +M=D +@80 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL186 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL186) +@SP +AM=M-1 +D=M +@R5 +M=D +@81 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL187 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL187) +@SP +AM=M-1 +D=M +@R5 +M=D +@82 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL188 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL188) +@SP +AM=M-1 +D=M +@R5 +M=D +@83 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL189 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL189) +@SP +AM=M-1 +D=M +@R5 +M=D +@84 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL190 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL190) +@SP +AM=M-1 +D=M +@R5 +M=D +@85 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL191 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL191) +@SP +AM=M-1 +D=M +@R5 +M=D +@86 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL192 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL192) +@SP +AM=M-1 +D=M +@R5 +M=D +@87 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL193 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL193) +@SP +AM=M-1 +D=M +@R5 +M=D +@88 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL194 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL194) +@SP +AM=M-1 +D=M +@R5 +M=D +@89 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL195 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL195) +@SP +AM=M-1 +D=M +@R5 +M=D +@90 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL196 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL196) +@SP +AM=M-1 +D=M +@R5 +M=D +@91 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL197 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL197) +@SP +AM=M-1 +D=M +@R5 +M=D +@92 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=1 +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL198 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL198) +@SP +AM=M-1 +D=M +@R5 +M=D +@93 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL199 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL199) +@SP +AM=M-1 +D=M +@R5 +M=D +@94 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL200 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL200) +@SP +AM=M-1 +D=M +@R5 +M=D +@95 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL201 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL201) +@SP +AM=M-1 +D=M +@R5 +M=D +@96 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL202 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL202) +@SP +AM=M-1 +D=M +@R5 +M=D +@97 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL203 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL203) +@SP +AM=M-1 +D=M +@R5 +M=D +@98 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL204 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL204) +@SP +AM=M-1 +D=M +@R5 +M=D +@99 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL205 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL205) +@SP +AM=M-1 +D=M +@R5 +M=D +@100 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL206 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL206) +@SP +AM=M-1 +D=M +@R5 +M=D +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL207 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL207) +@SP +AM=M-1 +D=M +@R5 +M=D +@102 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@38 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL208 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL208) +@SP +AM=M-1 +D=M +@R5 +M=D +@103 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL209 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL209) +@SP +AM=M-1 +D=M +@R5 +M=D +@104 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL210 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL210) +@SP +AM=M-1 +D=M +@R5 +M=D +@105 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL211 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL211) +@SP +AM=M-1 +D=M +@R5 +M=D +@106 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL212 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL212) +@SP +AM=M-1 +D=M +@R5 +M=D +@107 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL213 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL213) +@SP +AM=M-1 +D=M +@R5 +M=D +@108 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL214 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL214) +@SP +AM=M-1 +D=M +@R5 +M=D +@109 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@29 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL215 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL215) +@SP +AM=M-1 +D=M +@R5 +M=D +@110 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@29 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL216 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL216) +@SP +AM=M-1 +D=M +@R5 +M=D +@111 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL217 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL217) +@SP +AM=M-1 +D=M +@R5 +M=D +@112 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL218 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL218) +@SP +AM=M-1 +D=M +@R5 +M=D +@113 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL219 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL219) +@SP +AM=M-1 +D=M +@R5 +M=D +@114 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@29 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL220 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL220) +@SP +AM=M-1 +D=M +@R5 +M=D +@115 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL221 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL221) +@SP +AM=M-1 +D=M +@R5 +M=D +@116 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL222 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL222) +@SP +AM=M-1 +D=M +@R5 +M=D +@117 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL223 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL223) +@SP +AM=M-1 +D=M +@R5 +M=D +@118 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL224 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL224) +@SP +AM=M-1 +D=M +@R5 +M=D +@119 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL225 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL225) +@SP +AM=M-1 +D=M +@R5 +M=D +@120 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL226 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL226) +@SP +AM=M-1 +D=M +@R5 +M=D +@121 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL227 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL227) +@SP +AM=M-1 +D=M +@R5 +M=D +@122 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL228 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL228) +@SP +AM=M-1 +D=M +@R5 +M=D +@123 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL229 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL229) +@SP +AM=M-1 +D=M +@R5 +M=D +@124 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL230 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL230) +@SP +AM=M-1 +D=M +@R5 +M=D +@125 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL231 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL231) +@SP +AM=M-1 +D=M +@R5 +M=D +@126 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@38 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL232 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL232) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.create) +@SP +AM=M+1 +A=A-1 +M=0 +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL233 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL233) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@11 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.createshiftedmap) +@4 +D=A +(LOOP_output.createshiftedmap) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_output.createshiftedmap +D;JGT +@127 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL234 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL234) +@SP +AM=M-1 +D=M +@output.6 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(output.createshiftedmap$while_exp0) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@127 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT27 +D=A +@38 +0;JMP +(RET_ADDRESS_LT27) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.createshiftedmap$while_end0 +D;JNE +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL235 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL235) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.6 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(output.createshiftedmap$while_exp1) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT28 +D=A +@38 +0;JMP +(RET_ADDRESS_LT28) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.createshiftedmap$while_end1 +D;JNE +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@256 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL236 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL236) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@output.createshiftedmap$while_exp1 +0;JMP +(output.createshiftedmap$while_end1) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ21 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ21) +@SP +AM=M-1 +D=M +@output.createshiftedmap$if_true0 +D;JNE +@output.createshiftedmap$if_false0 +0;JMP +(output.createshiftedmap$if_true0) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@output.createshiftedmap$if_end0 +0;JMP +(output.createshiftedmap$if_false0) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(output.createshiftedmap$if_end0) +@output.createshiftedmap$while_exp0 +0;JMP +(output.createshiftedmap$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.getmap) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT29 +D=A +@38 +0;JMP +(RET_ADDRESS_LT29) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@126 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT22 +D=A +@22 +0;JMP +(RET_ADDRESS_GT22) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@output.getmap$if_true0 +D;JNE +@output.getmap$if_false0 +0;JMP +(output.getmap$if_true0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(output.getmap$if_false0) +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.getmap$if_true1 +D;JNE +@output.getmap$if_false1 +0;JMP +(output.getmap$if_true1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@output.getmap$if_end1 +0;JMP +(output.getmap$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.6 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(output.getmap$if_end1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(output.drawchar) +@4 +D=A +(LOOP_output.drawchar) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_output.drawchar +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.getmap +D=A +@R14 +M=D +@RET_ADDRESS_CALL237 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL237) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(output.drawchar$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT30 +D=A +@38 +0;JMP +(RET_ADDRESS_LT30) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.drawchar$while_end0 +D;JNE +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.drawchar$if_true0 +D;JNE +@output.drawchar$if_false0 +0;JMP +(output.drawchar$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.4 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@256 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@output.drawchar$if_end0 +0;JMP +(output.drawchar$if_false0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.4 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(output.drawchar$if_end0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.4 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@output.drawchar$while_exp0 +0;JMP +(output.drawchar$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.movecursor) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT31 +D=A +@38 +0;JMP +(RET_ADDRESS_LT31) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@22 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT23 +D=A +@22 +0;JMP +(RET_ADDRESS_GT23) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT32 +D=A +@38 +0;JMP +(RET_ADDRESS_LT32) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT24 +D=A +@22 +0;JMP +(RET_ADDRESS_GT24) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@output.movecursor$if_true0 +D;JNE +@output.movecursor$if_false0 +0;JMP +(output.movecursor$if_true0) +@20 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL238 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL238) +@SP +AM=M-1 +D=M +@R5 +M=D +(output.movecursor$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL239 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL239) +@SP +AM=M-1 +D=M +@output.0 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@352 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL240 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL240) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@output.1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL241 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL241) +@RET_ADDRESS_EQ22 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ22) +@SP +AM=M-1 +D=M +@output.2 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.drawchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL242 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL242) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.printchar) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@0 +D=A +@R13 +M=D +@string.newline +D=A +@R14 +M=D +@RET_ADDRESS_CALL243 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL243) +@RET_ADDRESS_EQ23 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ23) +@SP +AM=M-1 +D=M +@output.printchar$if_true0 +D;JNE +@output.printchar$if_false0 +0;JMP +(output.printchar$if_true0) +@0 +D=A +@R13 +M=D +@output.println +D=A +@R14 +M=D +@RET_ADDRESS_CALL244 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL244) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.printchar$if_end0 +0;JMP +(output.printchar$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@0 +D=A +@R13 +M=D +@string.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL245 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL245) +@RET_ADDRESS_EQ24 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ24) +@SP +AM=M-1 +D=M +@output.printchar$if_true1 +D;JNE +@output.printchar$if_false1 +0;JMP +(output.printchar$if_true1) +@0 +D=A +@R13 +M=D +@output.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL246 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL246) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.printchar$if_end1 +0;JMP +(output.printchar$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.drawchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL247 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL247) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.printchar$if_true2 +D;JNE +@output.printchar$if_false2 +0;JMP +(output.printchar$if_true2) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@output.0 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.printchar$if_false2) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ25 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ25) +@SP +AM=M-1 +D=M +@output.printchar$if_true3 +D;JNE +@output.printchar$if_false3 +0;JMP +(output.printchar$if_true3) +@0 +D=A +@R13 +M=D +@output.println +D=A +@R14 +M=D +@RET_ADDRESS_CALL248 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL248) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.printchar$if_end3 +0;JMP +(output.printchar$if_false3) +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +(output.printchar$if_end3) +(output.printchar$if_end1) +(output.printchar$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.printstring) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.length +D=A +@R14 +M=D +@RET_ADDRESS_CALL249 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL249) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(output.printstring$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT33 +D=A +@38 +0;JMP +(RET_ADDRESS_LT33) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.printstring$while_end0 +D;JNE +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.charat +D=A +@R14 +M=D +@RET_ADDRESS_CALL250 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL250) +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL251 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL251) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@output.printstring$while_exp0 +0;JMP +(output.printstring$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.printint) +@output.3 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.setint +D=A +@R14 +M=D +@RET_ADDRESS_CALL252 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL252) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.3 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL253 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL253) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.println) +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@352 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@output.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@8128 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ26 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ26) +@SP +AM=M-1 +D=M +@output.println$if_true0 +D;JNE +@output.println$if_false0 +0;JMP +(output.println$if_true0) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.println$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.backspace) +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.backspace$if_true0 +D;JNE +@output.backspace$if_false0 +0;JMP +(output.backspace$if_true0) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT25 +D=A +@22 +0;JMP +(RET_ADDRESS_GT25) +@SP +AM=M-1 +D=M +@output.backspace$if_true1 +D;JNE +@output.backspace$if_false1 +0;JMP +(output.backspace$if_true1) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.0 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.1 +M=D +@output.backspace$if_end1 +0;JMP +(output.backspace$if_false1) +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.0 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ27 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ27) +@SP +AM=M-1 +D=M +@output.backspace$if_true2 +D;JNE +@output.backspace$if_false2 +0;JMP +(output.backspace$if_true2) +@8128 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.backspace$if_false2) +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@321 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.backspace$if_end1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@output.2 +M=D +@output.backspace$if_end0 +0;JMP +(output.backspace$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +(output.backspace$if_end0) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.drawchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL254 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL254) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.init) +@SP +AM=M+1 +A=A-1 +M=0 +@16384 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.2 +M=D +@17 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL255 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL255) +@SP +AM=M-1 +D=M +@screen.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(screen.init$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT34 +D=A +@38 +0;JMP +(RET_ADDRESS_LT34) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.init$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@screen.init$while_exp0 +0;JMP +(screen.init$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.clearscreen) +@SP +AM=M+1 +A=A-1 +M=0 +(screen.clearscreen$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@8192 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT35 +D=A +@38 +0;JMP +(RET_ADDRESS_LT35) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.clearscreen$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.clearscreen$while_exp0 +0;JMP +(screen.clearscreen$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.updatelocation) +@screen.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.updatelocation$if_true0 +D;JNE +@screen.updatelocation$if_false0 +0;JMP +(screen.updatelocation$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@screen.updatelocation$if_end0 +0;JMP +(screen.updatelocation$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(screen.updatelocation$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.setcolor) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.2 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawpixel) +@3 +D=A +(LOOP_screen.drawpixel) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawpixel +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT36 +D=A +@38 +0;JMP +(RET_ADDRESS_LT36) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT26 +D=A +@22 +0;JMP +(RET_ADDRESS_GT26) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT37 +D=A +@38 +0;JMP +(RET_ADDRESS_LT37) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT27 +D=A +@22 +0;JMP +(RET_ADDRESS_GT27) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawpixel$if_true0 +D;JNE +@screen.drawpixel$if_false0 +0;JMP +(screen.drawpixel$if_true0) +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL256 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL256) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawpixel$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL257 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL257) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL258 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL258) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL259 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL259) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL260 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL260) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawconditional) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.drawconditional$if_true0 +D;JNE +@screen.drawconditional$if_false0 +0;JMP +(screen.drawconditional$if_true0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.drawpixel +D=A +@R14 +M=D +@RET_ADDRESS_CALL261 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL261) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawconditional$if_end0 +0;JMP +(screen.drawconditional$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.drawpixel +D=A +@R14 +M=D +@RET_ADDRESS_CALL262 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL262) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawconditional$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawline) +@11 +D=A +(LOOP_screen.drawline) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawline +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT38 +D=A +@38 +0;JMP +(RET_ADDRESS_LT38) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT28 +D=A +@22 +0;JMP +(RET_ADDRESS_GT28) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT39 +D=A +@38 +0;JMP +(RET_ADDRESS_LT39) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT29 +D=A +@22 +0;JMP +(RET_ADDRESS_GT29) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawline$if_true0 +D;JNE +@screen.drawline$if_false0 +0;JMP +(screen.drawline$if_true0) +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL263 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL263) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawline$if_false0) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL264 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL264) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL265 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL265) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT40 +D=A +@38 +0;JMP +(RET_ADDRESS_LT40) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT41 +D=A +@38 +0;JMP +(RET_ADDRESS_LT41) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT42 +D=A +@38 +0;JMP +(RET_ADDRESS_LT42) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawline$if_true1 +D;JNE +@screen.drawline$if_false1 +0;JMP +(screen.drawline$if_true1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +A=A+1 +A=A+1 +M=D +(screen.drawline$if_false1) +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.drawline$if_true2 +D;JNE +@screen.drawline$if_false2 +0;JMP +(screen.drawline$if_true2) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT30 +D=A +@22 +0;JMP +(RET_ADDRESS_GT30) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@screen.drawline$if_end2 +0;JMP +(screen.drawline$if_false2) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT31 +D=A +@22 +0;JMP +(RET_ADDRESS_GT31) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +(screen.drawline$if_end2) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL266 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL266) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL267 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL267) +@LCL +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL268 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL268) +@LCL +D=M +@10 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@R13 +M=D +@screen.drawconditional +D=A +@R14 +M=D +@RET_ADDRESS_CALL269 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL269) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawline$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT43 +D=A +@38 +0;JMP +(RET_ADDRESS_LT43) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawline$while_end0 +D;JNE +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT44 +D=A +@38 +0;JMP +(RET_ADDRESS_LT44) +@SP +AM=M-1 +D=M +@screen.drawline$if_true3 +D;JNE +@screen.drawline$if_false3 +0;JMP +(screen.drawline$if_true3) +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@screen.drawline$if_end3 +0;JMP +(screen.drawline$if_false3) +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.drawline$if_true4 +D;JNE +@screen.drawline$if_false4 +0;JMP +(screen.drawline$if_true4) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawline$if_end4 +0;JMP +(screen.drawline$if_false4) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(screen.drawline$if_end4) +(screen.drawline$if_end3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@R13 +M=D +@screen.drawconditional +D=A +@R14 +M=D +@RET_ADDRESS_CALL270 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL270) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawline$while_exp0 +0;JMP +(screen.drawline$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawrectangle) +@9 +D=A +(LOOP_screen.drawrectangle) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawrectangle +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT32 +D=A +@22 +0;JMP +(RET_ADDRESS_GT32) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT33 +D=A +@22 +0;JMP +(RET_ADDRESS_GT33) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT45 +D=A +@38 +0;JMP +(RET_ADDRESS_LT45) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT34 +D=A +@22 +0;JMP +(RET_ADDRESS_GT34) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT46 +D=A +@38 +0;JMP +(RET_ADDRESS_LT46) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT35 +D=A +@22 +0;JMP +(RET_ADDRESS_GT35) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawrectangle$if_true0 +D;JNE +@screen.drawrectangle$if_false0 +0;JMP +(screen.drawrectangle$if_true0) +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL271 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL271) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawrectangle$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL272 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL272) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL273 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL273) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL274 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL274) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL275 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL275) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL276 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL276) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(screen.drawrectangle$while_exp0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT36 +D=A +@22 +0;JMP +(RET_ADDRESS_GT36) +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawrectangle$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ28 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ28) +@SP +AM=M-1 +D=M +@screen.drawrectangle$if_true1 +D;JNE +@screen.drawrectangle$if_false1 +0;JMP +(screen.drawrectangle$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL277 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL277) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawrectangle$if_end1 +0;JMP +(screen.drawrectangle$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL278 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL278) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(screen.drawrectangle$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT47 +D=A +@38 +0;JMP +(RET_ADDRESS_LT47) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawrectangle$while_end1 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL279 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL279) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawrectangle$while_exp1 +0;JMP +(screen.drawrectangle$while_end1) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL280 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL280) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawrectangle$if_end1) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawrectangle$while_exp0 +0;JMP +(screen.drawrectangle$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawhorizontal) +@11 +D=A +(LOOP_screen.drawhorizontal) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawhorizontal +D;JGT +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.min +D=A +@R14 +M=D +@RET_ADDRESS_CALL281 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL281) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.max +D=A +@R14 +M=D +@RET_ADDRESS_CALL282 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL282) +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT37 +D=A +@22 +0;JMP +(RET_ADDRESS_GT37) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@256 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT48 +D=A +@38 +0;JMP +(RET_ADDRESS_LT48) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@512 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT49 +D=A +@38 +0;JMP +(RET_ADDRESS_LT49) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT38 +D=A +@22 +0;JMP +(RET_ADDRESS_GT38) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@screen.drawhorizontal$if_true0 +D;JNE +@screen.drawhorizontal$if_false0 +0;JMP +(screen.drawhorizontal$if_true0) +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@2 +D=A +@R13 +M=D +@math.max +D=A +@R14 +M=D +@RET_ADDRESS_CALL283 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL283) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.min +D=A +@R14 +M=D +@RET_ADDRESS_CALL284 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL284) +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL285 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL285) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL286 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL286) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL287 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL287) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL288 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL288) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@10 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL289 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL289) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ29 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ29) +@SP +AM=M-1 +D=M +@screen.drawhorizontal$if_true1 +D;JNE +@screen.drawhorizontal$if_false1 +0;JMP +(screen.drawhorizontal$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL290 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL290) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawhorizontal$if_end1 +0;JMP +(screen.drawhorizontal$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL291 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL291) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(screen.drawhorizontal$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT50 +D=A +@38 +0;JMP +(RET_ADDRESS_LT50) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawhorizontal$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL292 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL292) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawhorizontal$while_exp0 +0;JMP +(screen.drawhorizontal$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL293 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL293) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawhorizontal$if_end1) +(screen.drawhorizontal$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawsymetric) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL294 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL294) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL295 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL295) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL296 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL296) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL297 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL297) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawcircle) +@3 +D=A +(LOOP_screen.drawcircle) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawcircle +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT51 +D=A +@38 +0;JMP +(RET_ADDRESS_LT51) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT39 +D=A +@22 +0;JMP +(RET_ADDRESS_GT39) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT52 +D=A +@38 +0;JMP +(RET_ADDRESS_LT52) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT40 +D=A +@22 +0;JMP +(RET_ADDRESS_GT40) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawcircle$if_true0 +D;JNE +@screen.drawcircle$if_false0 +0;JMP +(screen.drawcircle$if_true0) +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL298 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL298) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawcircle$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT53 +D=A +@38 +0;JMP +(RET_ADDRESS_LT53) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT41 +D=A +@22 +0;JMP +(RET_ADDRESS_GT41) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT54 +D=A +@38 +0;JMP +(RET_ADDRESS_LT54) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT42 +D=A +@22 +0;JMP +(RET_ADDRESS_GT42) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawcircle$if_true1 +D;JNE +@screen.drawcircle$if_false1 +0;JMP +(screen.drawcircle$if_true1) +@13 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL299 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL299) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawcircle$if_false1) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@screen.drawsymetric +D=A +@R14 +M=D +@RET_ADDRESS_CALL300 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL300) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawcircle$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT43 +D=A +@22 +0;JMP +(RET_ADDRESS_GT43) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawcircle$while_end0 +D;JNE +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT55 +D=A +@38 +0;JMP +(RET_ADDRESS_LT55) +@SP +AM=M-1 +D=M +@screen.drawcircle$if_true2 +D;JNE +@screen.drawcircle$if_false2 +0;JMP +(screen.drawcircle$if_true2) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL301 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL301) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@screen.drawcircle$if_end2 +0;JMP +(screen.drawcircle$if_false2) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL302 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL302) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(screen.drawcircle$if_end2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@screen.drawsymetric +D=A +@R14 +M=D +@RET_ADDRESS_CALL303 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL303) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawcircle$while_exp0 +0;JMP +(screen.drawcircle$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.new) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL304 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL304) +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT56 +D=A +@38 +0;JMP +(RET_ADDRESS_LT56) +@SP +AM=M-1 +D=M +@string.new$if_true0 +D;JNE +@string.new$if_false0 +0;JMP +(string.new$if_true0) +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL305 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL305) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.new$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT44 +D=A +@22 +0;JMP +(RET_ADDRESS_GT44) +@SP +AM=M-1 +D=M +@string.new$if_true1 +D;JNE +@string.new$if_false1 +0;JMP +(string.new$if_true1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL306 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL306) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(string.new$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT45 +D=A +@22 +0;JMP +(RET_ADDRESS_GT45) +@SP +AM=M-1 +D=M +@string.dispose$if_true0 +D;JNE +@string.dispose$if_false0 +0;JMP +(string.dispose$if_true0) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL307 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL307) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.dispose$if_false0) +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL308 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL308) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.length) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.charat) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT57 +D=A +@38 +0;JMP +(RET_ADDRESS_LT57) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT46 +D=A +@22 +0;JMP +(RET_ADDRESS_GT46) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ30 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ30) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@string.charat$if_true0 +D;JNE +@string.charat$if_false0 +0;JMP +(string.charat$if_true0) +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL309 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL309) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.charat$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.setcharat) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT58 +D=A +@38 +0;JMP +(RET_ADDRESS_LT58) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT47 +D=A +@22 +0;JMP +(RET_ADDRESS_GT47) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ31 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ31) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@string.setcharat$if_true0 +D;JNE +@string.setcharat$if_false0 +0;JMP +(string.setcharat$if_true0) +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL310 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL310) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.setcharat$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.appendchar) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ32 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ32) +@SP +AM=M-1 +D=M +@string.appendchar$if_true0 +D;JNE +@string.appendchar$if_false0 +0;JMP +(string.appendchar$if_true0) +@17 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL311 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL311) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.appendchar$if_false0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.eraselastchar) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ33 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ33) +@SP +AM=M-1 +D=M +@string.eraselastchar$if_true0 +D;JNE +@string.eraselastchar$if_false0 +0;JMP +(string.eraselastchar$if_true0) +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL312 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL312) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.eraselastchar$if_false0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.intvalue) +@5 +D=A +(LOOP_string.intvalue) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_string.intvalue +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ34 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ34) +@SP +AM=M-1 +D=M +@string.intvalue$if_true0 +D;JNE +@string.intvalue$if_false0 +0;JMP +(string.intvalue$if_true0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.intvalue$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ35 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ35) +@SP +AM=M-1 +D=M +@string.intvalue$if_true1 +D;JNE +@string.intvalue$if_false1 +0;JMP +(string.intvalue$if_true1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(string.intvalue$if_false1) +(string.intvalue$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT59 +D=A +@38 +0;JMP +(RET_ADDRESS_LT59) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@string.intvalue$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT60 +D=A +@38 +0;JMP +(RET_ADDRESS_LT60) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT48 +D=A +@22 +0;JMP +(RET_ADDRESS_GT48) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@string.intvalue$if_true2 +D;JNE +@string.intvalue$if_false2 +0;JMP +(string.intvalue$if_true2) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL313 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL313) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(string.intvalue$if_false2) +@string.intvalue$while_exp0 +0;JMP +(string.intvalue$while_end0) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@string.intvalue$if_true3 +D;JNE +@string.intvalue$if_false3 +0;JMP +(string.intvalue$if_true3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(string.intvalue$if_false3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.setint) +@4 +D=A +(LOOP_string.setint) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_string.setint +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ36 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ36) +@SP +AM=M-1 +D=M +@string.setint$if_true0 +D;JNE +@string.setint$if_false0 +0;JMP +(string.setint$if_true0) +@19 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL314 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL314) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.setint$if_false0) +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL315 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL315) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT61 +D=A +@38 +0;JMP +(RET_ADDRESS_LT61) +@SP +AM=M-1 +D=M +@string.setint$if_true1 +D;JNE +@string.setint$if_false1 +0;JMP +(string.setint$if_true1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(string.setint$if_false1) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(string.setint$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT49 +D=A +@22 +0;JMP +(RET_ADDRESS_GT49) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@string.setint$while_end0 +D;JNE +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL316 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL316) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL317 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL317) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@string.setint$while_exp0 +0;JMP +(string.setint$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@string.setint$if_true2 +D;JNE +@string.setint$if_false2 +0;JMP +(string.setint$if_true2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(string.setint$if_false2) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT62 +D=A +@38 +0;JMP +(RET_ADDRESS_LT62) +@SP +AM=M-1 +D=M +@string.setint$if_true3 +D;JNE +@string.setint$if_false3 +0;JMP +(string.setint$if_true3) +@19 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL318 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL318) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.setint$if_false3) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ37 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ37) +@SP +AM=M-1 +D=M +@string.setint$if_true4 +D;JNE +@string.setint$if_false4 +0;JMP +(string.setint$if_true4) +@SP +M=M+1 +A=M-1 +M=0 +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@string.setint$if_end4 +0;JMP +(string.setint$if_false4) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +(string.setint$while_exp1) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT63 +D=A +@38 +0;JMP +(RET_ADDRESS_LT63) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@string.setint$while_end1 +D;JNE +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@string.setint$while_exp1 +0;JMP +(string.setint$while_end1) +(string.setint$if_end4) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL319 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL319) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.newline) +@128 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.backspace) +@129 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.doublequote) +@34 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(sys.init) +@0 +D=A +@R13 +M=D +@memory.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL320 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL320) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@math.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL321 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL321) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@screen.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL322 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL322) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@output.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL323 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL323) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@keyboard.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL324 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL324) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@main.main +D=A +@R14 +M=D +@RET_ADDRESS_CALL325 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL325) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@sys.halt +D=A +@R14 +M=D +@RET_ADDRESS_CALL326 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL326) +@SP +AM=M-1 +D=M +@R5 +M=D +(sys.halt) +(sys.halt$while_exp0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@sys.halt$while_end0 +D;JNE +@sys.halt$while_exp0 +0;JMP +(sys.halt$while_end0) +(sys.wait) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT64 +D=A +@38 +0;JMP +(RET_ADDRESS_LT64) +@SP +AM=M-1 +D=M +@sys.wait$if_true0 +D;JNE +@sys.wait$if_false0 +0;JMP +(sys.wait$if_true0) +@SP +M=M+1 +A=M-1 +M=1 +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL327 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL327) +@SP +AM=M-1 +D=M +@R5 +M=D +(sys.wait$if_false0) +(sys.wait$while_exp0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT50 +D=A +@22 +0;JMP +(RET_ADDRESS_GT50) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@sys.wait$while_end0 +D;JNE +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(sys.wait$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT51 +D=A +@22 +0;JMP +(RET_ADDRESS_GT51) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@sys.wait$while_end1 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@sys.wait$while_exp1 +0;JMP +(sys.wait$while_end1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@sys.wait$while_exp0 +0;JMP +(sys.wait$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(sys.error) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL328 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL328) +@69 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL329 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL329) +@82 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL330 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL330) +@82 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL331 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL331) +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL332 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL332) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printint +D=A +@R14 +M=D +@RET_ADDRESS_CALL333 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL333) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@sys.halt +D=A +@R14 +M=D +@RET_ADDRESS_CALL334 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL334) +@SP +AM=M-1 +D=M +@R5 +M=D`; + +export const PongLAsm = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/6/pong/PongL.asm + +// Symbol-less version of the Pong.asm program. +// Designed for testing the basic version of the assembler. + +@256 +D=A +@0 +M=D +@133 +0;JMP +@15 +M=D +@0 +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@19 +D;JNE +@0 +A=M-1 +M=-1 +@15 +A=M +0;JMP +@15 +M=D +@0 +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@35 +D;JLE +@0 +A=M-1 +M=-1 +@15 +A=M +0;JMP +@15 +M=D +@0 +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@51 +D;JGE +@0 +A=M-1 +M=-1 +@15 +A=M +0;JMP +@5 +D=A +@1 +A=M-D +D=M +@13 +M=D +@0 +AM=M-1 +D=M +@2 +A=M +M=D +D=A +@0 +M=D+1 +@1 +D=M +@14 +AM=D-1 +D=M +@4 +M=D +@14 +AM=M-1 +D=M +@3 +M=D +@14 +AM=M-1 +D=M +@2 +M=D +@14 +AM=M-1 +D=M +@1 +M=D +@13 +A=M +0;JMP +@0 +A=M +M=D +@1 +D=M +@0 +AM=M+1 +M=D +@2 +D=M +@0 +AM=M+1 +M=D +@3 +D=M +@0 +AM=M+1 +M=D +@4 +D=M +@0 +AM=M+1 +M=D +@4 +D=A +@13 +D=D+M +@0 +D=M-D +@2 +M=D +@0 +MD=M+1 +@1 +M=D +@14 +A=M +0;JMP +@0 +D=A +@13 +M=D +@27058 +D=A +@14 +M=D +@145 +D=A +@95 +0;JMP +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8643 +D=A +@14 +M=D +@163 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@10 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=M +@11 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@12 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=M +@13 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@3 +D=M +@14 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@387 +D=A +@14 +M=D +@333 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@9357 +D=A +@14 +M=D +@376 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@418 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@514 +D=A +@14 +M=D +@441 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@480 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@514 +D=A +@14 +M=D +@503 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@588 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +@3 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@654 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@747 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@774 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@798 +D=A +@38 +0;JMP +@3 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@826 +D;JNE +@930 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@886 +D=A +@38 +0;JMP +@3 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@916 +D=A +@38 +0;JMP +@3 +D=M +@9 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@991 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@948 +D=A +@38 +0;JMP +@3 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@979 +D=A +@38 +0;JMP +@3 +D=M +@9 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@1016 +D=A +@95 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@1062 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@1109 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@452 +D=A +@14 +M=D +@1156 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1178 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@1185 +D;JNE +@1219 +0;JMP +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1401 +0;JMP +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +D=M +@9 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1267 +D;JNE +@1335 +0;JMP +@3 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1283 +D;JNE +@1309 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@1333 +0;JMP +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@1401 +0;JMP +@3 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1351 +D;JNE +@1377 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@1401 +0;JMP +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@3 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1417 +D;JNE +@1485 +0;JMP +@3 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1433 +D;JNE +@1459 +0;JMP +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@1483 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@1551 +0;JMP +@3 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1501 +D;JNE +@1527 +0;JMP +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@1551 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@10 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1571 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1581 +D;JNE +@1612 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@3 +D=M +@14 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@10 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@11 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1632 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1642 +D;JNE +@1675 +0;JMP +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@14 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@11 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@12 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1695 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1705 +D;JNE +@1738 +0;JMP +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@14 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@12 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@13 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1758 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1768 +D;JNE +@1801 +0;JMP +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@14 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@13 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@387 +D=A +@14 +M=D +@1819 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@14 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@5 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@1837 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@1882 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@1916 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1939 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@1946 +D;JNE +@1963 +0;JMP +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2086 +0;JMP +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1979 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1997 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@2018 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@2042 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@2054 +D;JNE +@2071 +0;JMP +@20 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2086 +0;JMP +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +D=M +@14 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@2103 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@2110 +D;JNE +@2227 +0;JMP +@506 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@50 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2153 +D=A +@95 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@2173 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2214 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2616 +0;JMP +@3 +D=M +@14 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2246 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@2253 +D;JNE +@2364 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@50 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2290 +D=A +@95 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@2310 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2351 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2616 +0;JMP +@3 +D=M +@14 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2383 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@2390 +D;JNE +@2507 +0;JMP +@250 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2432 +D=A +@95 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@2453 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2494 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2616 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2543 +D=A +@95 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@2564 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2605 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@13 +M=D +@652 +D=A +@14 +M=D +@2648 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8643 +D=A +@14 +M=D +@2677 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2827 +D=A +@14 +M=D +@2773 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@9357 +D=A +@14 +M=D +@2816 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@2858 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2954 +D=A +@14 +M=D +@2881 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@2920 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2954 +D=A +@14 +M=D +@2943 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@3033 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2892 +D=A +@14 +M=D +@3163 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2827 +D=A +@14 +M=D +@3200 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@3240 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@3247 +D;JNE +@3525 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@3286 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@3293 +D;JNE +@3303 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@3319 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@3424 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@3448 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@3518 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3831 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3579 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@3586 +D;JNE +@3611 +0;JMP +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@3627 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@3706 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@3730 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@3826 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@0 +D=A +@13 +M=D +@4508 +D=A +@14 +M=D +@3853 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@4531 +D=A +@14 +M=D +@3870 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@4539 +D=A +@14 +M=D +@3895 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@4419 +D=A +@14 +M=D +@3919 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8643 +D=A +@14 +M=D +@3948 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +M=D +@0 +D=A +@13 +M=D +@20598 +D=A +@14 +M=D +@3965 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@50 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@230 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@229 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@13 +M=D +@2659 +D=A +@14 +M=D +@4026 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@253 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@222 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@229 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@13 +M=D +@145 +D=A +@14 +M=D +@4076 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@400 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@3 +D=A +@13 +M=D +@652 +D=A +@14 +M=D +@4111 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@238 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@240 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@4150 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@22 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@2 +D=A +@13 +M=D +@19350 +D=A +@14 +M=D +@4177 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@8 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25105 +D=A +@14 +M=D +@4200 +D=A +@95 +0;JMP +@83 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4218 +D=A +@95 +0;JMP +@99 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4236 +D=A +@95 +0;JMP +@111 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4254 +D=A +@95 +0;JMP +@114 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4272 +D=A +@95 +0;JMP +@101 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4290 +D=A +@95 +0;JMP +@58 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4308 +D=A +@95 +0;JMP +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4326 +D=A +@95 +0;JMP +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4344 +D=A +@95 +0;JMP +@1 +D=A +@13 +M=D +@19850 +D=A +@14 +M=D +@4356 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2786 +D=A +@14 +M=D +@4450 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@346 +D=A +@14 +M=D +@4474 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@9357 +D=A +@14 +M=D +@4497 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +D=A +@13 +M=D +@3930 +D=A +@14 +M=D +@4520 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@16 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@16 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@4943 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@4590 +D=A +@6 +0;JMP +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@4682 +D;JNE +@0 +D=A +@13 +M=D +@5924 +D=A +@14 +M=D +@4627 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@3211 +D=A +@14 +M=D +@4652 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5191 +D=A +@14 +M=D +@4675 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@4575 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@130 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4699 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@4706 +D;JNE +@4736 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@2 +D=A +@13 +M=D +@3044 +D=A +@14 +M=D +@4729 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@4831 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@132 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4753 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@4760 +D;JNE +@4792 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@3044 +D=A +@14 +M=D +@4785 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@4831 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@140 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4809 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@4816 +D;JNE +@4831 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@4846 +D=A +@6 +0;JMP +@0 +A=M-1 +M=!M +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@4941 +D;JNE +@0 +D=A +@13 +M=D +@5924 +D=A +@14 +M=D +@4886 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@3211 +D=A +@14 +M=D +@4911 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5191 +D=A +@14 +M=D +@4934 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@4831 +0;JMP +@4555 +0;JMP +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4959 +D;JNE +@5185 +0;JMP +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@19350 +D=A +@14 +M=D +@4983 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@9 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25105 +D=A +@14 +M=D +@5006 +D=A +@95 +0;JMP +@71 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5024 +D=A +@95 +0;JMP +@97 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5042 +D=A +@95 +0;JMP +@109 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5060 +D=A +@95 +0;JMP +@101 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5078 +D=A +@95 +0;JMP +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5096 +D=A +@95 +0;JMP +@79 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5114 +D=A +@95 +0;JMP +@118 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5132 +D=A +@95 +0;JMP +@101 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5150 +D=A +@95 +0;JMP +@114 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5168 +D=A +@95 +0;JMP +@1 +D=A +@13 +M=D +@19850 +D=A +@14 +M=D +@5180 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@5 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@5193 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@1126 +D=A +@14 +M=D +@5231 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@5254 +D=A +@22 +0;JMP +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5275 +D=A +@6 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@5290 +D;JNE +@5802 +0;JMP +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@3078 +D=A +@14 +M=D +@5337 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@3099 +D=A +@14 +M=D +@5362 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@599 +D=A +@14 +M=D +@5388 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@620 +D=A +@14 +M=D +@5415 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@5442 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@5449 +D;JNE +@5771 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5469 +D=A +@22 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5490 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@5522 +D;JNE +@5771 +0;JMP +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@5553 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@5560 +D;JNE +@5576 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@5625 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@5608 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@5615 +D;JNE +@5625 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@3133 +D=A +@14 +M=D +@5684 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@22 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@19350 +D=A +@14 +M=D +@5740 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19981 +D=A +@14 +M=D +@5766 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@1835 +D=A +@14 +M=D +@5797 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@5823 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@5833 +D;JNE +@5856 +0;JMP +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@5851 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8643 +D=A +@14 +M=D +@5875 +D=A +@95 +0;JMP +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@9357 +D=A +@14 +M=D +@5907 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@24576 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8558 +D=A +@14 +M=D +@5942 +D=A +@95 +0;JMP +@54 +0;JMP +@0 +A=M +M=0 +AD=A+1 +M=0 +@0 +M=D+1 +@0 +M=M+1 +A=M-1 +M=0 +@1 +D=A +@13 +M=D +@19610 +D=A +@14 +M=D +@5967 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@5987 +D=A +@6 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6002 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@6070 +D;JNE +@0 +D=A +@13 +M=D +@5924 +D=A +@14 +M=D +@6027 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6048 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@6055 +D;JNE +@6068 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@5972 +0;JMP +@0 +D=A +@13 +M=D +@27042 +D=A +@14 +M=D +@6082 +D=A +@95 +0;JMP +@1 +D=A +@13 +M=D +@19610 +D=A +@14 +M=D +@6094 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19610 +D=A +@14 +M=D +@6118 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@5 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@6134 +D;JGT +@80 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25105 +D=A +@14 +M=D +@6159 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19850 +D=A +@14 +M=D +@6186 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@27034 +D=A +@14 +M=D +@6203 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@0 +D=A +@13 +M=D +@27042 +D=A +@14 +M=D +@6221 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@6404 +D;JNE +@0 +D=A +@13 +M=D +@5944 +D=A +@14 +M=D +@6260 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@6284 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@6312 +D;JNE +@6402 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@6331 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@6338 +D;JNE +@6366 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25801 +D=A +@14 +M=D +@6359 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@6402 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@6394 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@6228 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@0 +A=M +M=0 +AD=A+1 +M=0 +@0 +M=D+1 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6132 +D=A +@14 +M=D +@6441 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25889 +D=A +@14 +M=D +@6466 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25252 +D=A +@14 +M=D +@6491 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@6527 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@17 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@6550 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@18 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6613 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@6768 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@6596 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6789 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@6796 +D;JNE +@6813 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@5 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@6824 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6846 +D=A +@38 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6861 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6881 +D=A +@22 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6896 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@6934 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@6959 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@6983 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@6990 +D;JNE +@7029 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@7048 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@7245 +D;JNE +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +M=M+1 +A=M-1 +M=0 +@7108 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@7115 +D;JNE +@7192 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@7029 +0;JMP +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@7261 +D;JNE +@7278 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@4 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@7289 +D;JGT +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@7311 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@7318 +D;JNE +@7341 +0;JMP +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@7336 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@7356 +D=A +@38 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@7371 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@7391 +D=A +@22 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@7406 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@7457 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@7498 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@7841 +D;JNE +@32767 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@7599 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@7626 +D;JNE +@7839 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@7790 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@7817 +D;JNE +@7839 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@7504 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@7860 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@8039 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@7909 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@7919 +D;JNE +@8015 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@7841 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@8054 +D;JNE +@8071 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@4 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@8082 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@8104 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@8111 +D;JNE +@8134 +0;JMP +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@8129 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@8165 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@8348 +D;JNE +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@8249 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8275 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@8294 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@8309 +D;JNE +@8324 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@8146 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8377 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@8384 +D;JNE +@8397 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8424 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@8431 +D;JNE +@8444 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@19 +M=D +@2048 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@14334 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@2049 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2050 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@19 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@19 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@8662 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@8669 +D;JNE +@8692 +0;JMP +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@8687 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2048 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8743 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@8787 +D;JNE +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@8704 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@16379 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@8816 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@8823 +D;JNE +@8846 +0;JMP +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@8841 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@8896 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@8903 +D;JNE +@9295 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@9056 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@9063 +D;JNE +@9147 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@9227 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +@0 +A=M +M=0 +AD=A+1 +M=0 +@0 +M=D+1 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@9458 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@9465 +D;JNE +@9556 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@9848 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@9717 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@9724 +D;JNE +@9782 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@9848 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@16384 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@20 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@21 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@22 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@23 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25105 +D=A +@14 +M=D +@9915 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@24 +M=D +@0 +D=A +@13 +M=D +@9960 +D=A +@14 +M=D +@9932 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@18456 +D=A +@14 +M=D +@9949 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@127 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@9978 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@25 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10061 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10128 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@33 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10211 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@34 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10284 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10367 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@36 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10454 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@37 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@49 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10535 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@38 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10620 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@39 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10693 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@40 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10778 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@41 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10863 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@42 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10940 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@43 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11017 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@44 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11090 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@45 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11159 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@46 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11230 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@47 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11309 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11394 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@49 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11479 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@50 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11564 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11649 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@52 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@26 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@60 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11734 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@53 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11819 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11904 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@55 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@49 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11989 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@56 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12074 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@57 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@62 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12159 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@58 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12234 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12311 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@60 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12392 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@61 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12463 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@62 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12544 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@64 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12629 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12712 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@65 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12797 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@66 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12882 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@67 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12967 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@68 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13052 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@69 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13137 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@70 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13222 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@71 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@44 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13307 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@72 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13392 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@73 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13477 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@74 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@60 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13562 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@75 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13647 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@76 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13732 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@77 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@33 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13817 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@78 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@55 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@55 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13902 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@79 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13987 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@80 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14072 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@81 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14159 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@82 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14244 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@83 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14329 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@84 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@45 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14414 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@85 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14499 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@86 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14584 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@87 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14669 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@88 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14754 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@89 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14839 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@90 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@49 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14924 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@91 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15009 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@92 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=1 +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15088 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@93 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15173 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@94 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@8 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15246 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@95 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15315 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@96 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15388 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@97 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15467 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@98 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15552 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@99 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15631 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@100 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@60 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15716 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@101 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15795 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@102 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@38 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15880 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@103 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@62 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15963 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@104 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@55 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16048 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@105 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16131 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@106 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@56 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16216 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@107 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16301 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@108 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16386 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@109 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@29 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@43 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@43 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@43 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@43 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16465 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@110 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@29 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16544 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@111 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16623 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@112 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16704 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@113 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@62 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16785 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@114 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@29 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@55 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16864 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@115 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16943 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@116 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17028 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@117 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17107 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@118 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17186 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@119 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17265 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@120 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17344 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@121 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@62 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17425 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@122 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17504 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@123 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@56 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@56 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17589 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@124 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17674 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@125 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@56 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17759 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@126 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@38 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@45 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17832 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@17865 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@8 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@9 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@9 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@10 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@11 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@4 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@18458 +D;JGT +@127 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@18483 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@26 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@127 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18517 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@18859 +D;JNE +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@18580 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@26 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18665 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@18795 +D;JNE +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@256 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@18745 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@18646 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@18811 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@18818 +D;JNE +@18833 +0;JMP +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@18857 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@18499 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18886 +D=A +@38 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@126 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18903 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@18915 +D;JNE +@18925 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@21 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@18938 +D;JNE +@18976 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@19012 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@26 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@4 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@19023 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@18865 +D=A +@14 +M=D +@19049 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19085 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@19344 +D;JNE +@21 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@19106 +D;JNE +@19161 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@20 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@256 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@19210 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@20 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@20 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@19068 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@19365 +D=A +@38 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@22 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19382 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@19402 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19424 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@19436 +D;JNE +@19459 +0;JMP +@20 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@19454 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@19484 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@23 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@352 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@19520 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@22 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@19572 +D=A +@95 +0;JMP +@19576 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@21 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19021 +D=A +@14 +M=D +@19599 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +D=A +@13 +M=D +@27034 +D=A +@14 +M=D +@19629 +D=A +@95 +0;JMP +@19633 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@19640 +D;JNE +@19659 +0;JMP +@0 +D=A +@13 +M=D +@20040 +D=A +@14 +M=D +@19652 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@19844 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +D=A +@13 +M=D +@27042 +D=A +@14 +M=D +@19678 +D=A +@95 +0;JMP +@19682 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@19689 +D;JNE +@19708 +0;JMP +@0 +D=A +@13 +M=D +@20134 +D=A +@14 +M=D +@19701 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@19844 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19021 +D=A +@14 +M=D +@19727 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@21 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@19748 +D;JNE +@19788 +0;JMP +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@23 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@22 +M=D +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19804 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@19811 +D;JNE +@19830 +0;JMP +@0 +D=A +@13 +M=D +@20040 +D=A +@14 +M=D +@19823 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@19844 +0;JMP +@21 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@21 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +A=M +M=0 +AD=A+1 +M=0 +@0 +M=D+1 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25339 +D=A +@14 +M=D +@19876 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@19900 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@19975 +D;JNE +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25361 +D=A +@14 +M=D +@19934 +D=A +@95 +0;JMP +@1 +D=A +@13 +M=D +@19610 +D=A +@14 +M=D +@19946 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@19882 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@24 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@26291 +D=A +@14 +M=D +@20006 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@24 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19850 +D=A +@14 +M=D +@20029 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@352 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@22 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@23 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@21 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8128 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20110 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@20117 +D;JNE +@20128 +0;JMP +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@22 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@21 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@20147 +D;JNE +@20288 +0;JMP +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@20161 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@20168 +D;JNE +@20210 +0;JMP +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@23 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@22 +M=D +@20277 +0;JMP +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@23 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20237 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@20244 +D;JNE +@20255 +0;JMP +@8128 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@22 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@321 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@22 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@21 +M=D +@20300 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@21 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19021 +D=A +@14 +M=D +@20318 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@16384 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@27 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@28 +M=D +@17 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@20374 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@29 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20437 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@20592 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@20420 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8192 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20619 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@20695 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@20602 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@28 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@20714 +D;JNE +@20798 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@20883 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@28 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@3 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@20909 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@20931 +D=A +@38 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20948 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@20968 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20990 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@21002 +D;JNE +@21025 +0;JMP +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@21020 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@21050 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@21088 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@21124 +D=A +@95 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@21193 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@21219 +D;JNE +@21252 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20907 +D=A +@14 +M=D +@21245 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@21283 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20907 +D=A +@14 +M=D +@21278 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@11 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@21291 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@21313 +D=A +@38 +0;JMP +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@21331 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@21351 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@21375 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@21387 +D;JNE +@21410 +0;JMP +@8 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@21405 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@21442 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@21483 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@21511 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@21551 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@21587 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@21604 +D;JNE +@21698 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@21714 +D;JNE +@21844 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@21830 +D=A +@22 +0;JMP +@1 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@21922 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@21910 +D=A +@22 +0;JMP +@1 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@21948 +D=A +@95 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@21998 +D=A +@95 +0;JMP +@1 +D=M +@9 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@22050 +D=A +@95 +0;JMP +@1 +D=M +@10 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@13 +M=D +@21204 +D=A +@14 +M=D +@22097 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@22122 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@22348 +D;JNE +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@22147 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@22154 +D;JNE +@22189 +0;JMP +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@9 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@22284 +0;JMP +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@10 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@22238 +D;JNE +@22262 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@22284 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@13 +M=D +@21204 +D=A +@14 +M=D +@22341 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@22102 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@9 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@22356 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@22382 +D=A +@22 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@22402 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@22422 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@22445 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@22465 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@22489 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@22501 +D;JNE +@22524 +0;JMP +@9 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@22519 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@22549 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@22591 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@22634 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@22678 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@22835 +D=A +@95 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@22905 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@23245 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@22958 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@22965 +D;JNE +@23014 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23007 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@23184 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23042 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@23087 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@23151 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23122 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@23069 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23179 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@22885 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@11 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@23253 +D;JGT +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@8406 +D=A +@14 +M=D +@23287 +D=A +@95 +0;JMP +@1 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@8359 +D=A +@14 +M=D +@23326 +D=A +@95 +0;JMP +@1 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@23357 +D=A +@22 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@256 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@23374 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@512 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@23398 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@23424 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@23436 +D;JNE +@24145 +0;JMP +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@2 +D=A +@13 +M=D +@8359 +D=A +@14 +M=D +@23461 +D=A +@95 +0;JMP +@1 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@8406 +D=A +@14 +M=D +@23500 +D=A +@95 +0;JMP +@1 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@23539 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@23579 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=M +@9 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@23623 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@23665 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=M +@10 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +D=M +@9 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@10 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@23820 +D=A +@95 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@23915 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@23922 +D;JNE +@23971 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23964 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@24145 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23999 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@24046 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@24110 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@24081 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@24026 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@24140 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=A +@13 +M=D +@23251 +D=A +@14 +M=D +@24224 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=A +@13 +M=D +@23251 +D=A +@14 +M=D +@24302 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@13 +M=D +@23251 +D=A +@14 +M=D +@24381 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@13 +M=D +@23251 +D=A +@14 +M=D +@24460 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@3 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@24473 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@24495 +D=A +@38 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24512 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@24532 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24554 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@24566 +D;JNE +@24589 +0;JMP +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@24584 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +M=M+1 +A=M-1 +M=0 +@24617 +D=A +@38 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24647 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +M=M+1 +A=M-1 +M=0 +@24680 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24715 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@24727 +D;JNE +@24750 +0;JMP +@13 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@24745 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@13 +M=D +@24151 +D=A +@14 +M=D +@24828 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@24851 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@25099 +D;JNE +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@24875 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@24882 +D;JNE +@24940 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@24915 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@25030 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@24985 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@13 +M=D +@24151 +D=A +@14 +M=D +@25092 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@24833 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8643 +D=A +@14 +M=D +@25123 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25143 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@25150 +D;JNE +@25173 +0;JMP +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@25168 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25188 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@25195 +D;JNE +@25220 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@25214 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25279 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@25286 +D;JNE +@25310 +0;JMP +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5877 +D=A +@14 +M=D +@25305 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@9357 +D=A +@14 +M=D +@25328 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25388 +D=A +@38 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25407 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25431 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@25443 +D;JNE +@25466 +0;JMP +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@25461 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25526 +D=A +@38 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25545 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25569 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@25581 +D;JNE +@25604 +0;JMP +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@25599 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25690 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@25697 +D;JNE +@25720 +0;JMP +@17 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@25715 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25829 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@25836 +D;JNE +@25859 +0;JMP +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@25854 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@5 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@25891 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25926 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@25933 +D;JNE +@25939 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@45 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@25992 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@25999 +D;JNE +@26025 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@26044 +D=A +@38 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@26249 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@26131 +D=A +@38 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@9 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@26149 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@26181 +D;JNE +@26247 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@26206 +D=A +@95 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@26025 +0;JMP +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@26265 +D;JNE +@26282 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@4 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@26293 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@26327 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@26334 +D;JNE +@26357 +0;JMP +@19 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@26352 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@26375 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@26397 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@26404 +D;JNE +@26436 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@26464 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@26630 +D;JNE +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@26497 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@26561 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@26449 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@26646 +D;JNE +@26716 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@45 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@26734 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@26741 +D;JNE +@26764 +0;JMP +@19 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@26759 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@26779 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@26786 +D;JNE +@26843 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@27003 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@26873 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@27003 +D;JNE +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@26854 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5877 +D=A +@14 +M=D +@27023 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@128 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@129 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@34 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@0 +D=A +@13 +M=D +@8453 +D=A +@14 +M=D +@27070 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@6505 +D=A +@14 +M=D +@27087 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@20329 +D=A +@14 +M=D +@27104 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@9854 +D=A +@14 +M=D +@27121 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@5918 +D=A +@14 +M=D +@27138 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@3837 +D=A +@14 +M=D +@27155 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@27177 +D=A +@14 +M=D +@27172 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@27194 +D;JNE +@27177 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@27213 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@27220 +D;JNE +@27241 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@27236 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@27256 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@27347 +D;JNE +@50 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@27291 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@27323 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@27276 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@27241 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25105 +D=A +@14 +M=D +@27371 +D=A +@95 +0;JMP +@69 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@27389 +D=A +@95 +0;JMP +@82 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@27407 +D=A +@95 +0;JMP +@82 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@27425 +D=A +@95 +0;JMP +@1 +D=A +@13 +M=D +@19850 +D=A +@14 +M=D +@27437 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19981 +D=A +@14 +M=D +@27461 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@27177 +D=A +@14 +M=D +@27478 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D`; + +export const PongHack = [ + 256, 60432, 0, 58120, 133, 60039, 15, 58120, 0, 64680, 64528, 60576, 61904, + 60040, 19, 58117, 0, 64672, 61064, 15, 64544, 60039, 15, 58120, 0, 64680, + 64528, 60576, 61904, 60040, 35, 58118, 0, 64672, 61064, 15, 64544, 60039, 15, + 58120, 0, 64680, 64528, 60576, 61904, 60040, 51, 58115, 0, 64672, 61064, 15, + 64544, 60039, 5, 60432, 1, 61920, 64528, 13, 58120, 0, 64680, 64528, 2, 64544, + 58120, 60432, 0, 59336, 1, 64528, 14, 58280, 64528, 4, 58120, 14, 64680, + 64528, 3, 58120, 14, 64680, 64528, 2, 58120, 14, 64680, 64528, 1, 58120, 13, + 64544, 60039, 0, 64544, 58120, 1, 64528, 0, 65000, 58120, 2, 64528, 0, 65000, + 58120, 3, 64528, 0, 65000, 58120, 4, 64528, 0, 65000, 58120, 4, 60432, 13, + 61584, 0, 61904, 2, 58120, 0, 64984, 1, 58120, 14, 64544, 60039, 0, 60432, 13, + 58120, 27058, 60432, 14, 58120, 145, 60432, 95, 60039, 15, 60432, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 8643, 60432, 14, 58120, 163, 60432, 95, + 60039, 0, 64680, 64528, 3, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 3, 64544, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 3, 64992, 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, + 3, 64528, 10, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 2, 64528, + 3, 57504, 64528, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61896, 3, 64528, 11, 57488, 13, 58120, 0, 64680, 64528, + 13, 64544, 58120, 2, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 3, 64528, + 12, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 2, 64528, 5, 57504, + 64528, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61896, 3, 64528, 13, 57488, 13, 58120, 0, 64680, 64528, 13, + 64544, 58120, 0, 64968, 64672, 60040, 3, 64528, 14, 57488, 13, 58120, 0, + 64680, 64528, 13, 64544, 58120, 3, 64528, 0, 65000, 60576, 58120, 1, 60432, + 13, 58120, 387, 60432, 14, 58120, 333, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 3, 64528, 0, 65000, 60576, 58120, 54, 60039, 2, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 3, 58120, 3, 64528, 0, 65000, 60576, 58120, 1, + 60432, 13, 58120, 9357, 60432, 14, 58120, 376, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 2, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 3, 58120, 0, 64968, 64672, 60040, 0, 64672, + 64584, 1, 60432, 13, 58120, 20889, 60432, 14, 58120, 418, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 3, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 514, 60432, 14, 58120, 441, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, + 64968, 64672, 60040, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 3, 58120, 0, 64968, 64672, 60040, 1, 60432, 13, 58120, 20889, + 60432, 14, 58120, 480, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, 64528, + 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 514, 60432, 14, 58120, 503, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, + 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 3, + 64544, 64528, 0, 65000, 60576, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, + 3, 64544, 64528, 0, 65000, 60576, 58120, 5, 60432, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 3, 64992, 64528, 0, 65000, 60576, 58120, 5, 60432, + 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 4, 60432, 13, 58120, + 22354, 60432, 14, 58120, 588, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, + 64968, 64672, 60040, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 3, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 54, 60039, 2, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 3, 64544, + 64528, 0, 65000, 60576, 58120, 5, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 54, 60039, 3, 60432, 58256, 0, 65000, 60576, 60040, 654, + 58113, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 2, + 64992, 64528, 0, 65000, 60576, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 3, 64992, 60896, 58120, 2, + 64992, 60896, 64528, 0, 65000, 60576, 58120, 3, 64992, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 3, 64992, 60896, 60896, + 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 6774, 60432, 14, 58120, 747, 60432, 95, 60039, 0, 64680, 64528, 1, 64544, + 58120, 3, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 6774, 60432, 14, 58120, 774, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, + 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, + 60576, 58120, 798, 60432, 38, 60039, 3, 64528, 7, 57488, 13, 58120, 0, 64680, + 64528, 13, 64544, 58120, 3, 64528, 7, 57504, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 826, 58117, 930, 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 1, 64992, 60896, 58120, 1, 64992, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 1, 64544, 58120, 1, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 1, 64992, 58120, 3, 64992, 64528, 0, 65000, + 60576, 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 886, 60432, 38, + 60039, 3, 64528, 8, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 3, + 64544, 64528, 0, 65000, 60576, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, + 916, 60432, 38, 60039, 3, 64528, 9, 57488, 13, 58120, 0, 64680, 64528, 13, + 64544, 58120, 991, 60039, 3, 64544, 64528, 0, 65000, 60576, 58120, 2, 64992, + 64528, 0, 65000, 60576, 58120, 948, 60432, 38, 60039, 3, 64528, 8, 57488, 13, + 58120, 0, 64680, 64528, 13, 64544, 58120, 3, 64992, 64528, 0, 65000, 60576, + 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 979, 60432, 38, 60039, + 3, 64528, 9, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 2, 60432, 0, + 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 2, 60432, 13, + 58120, 6822, 60432, 14, 58120, 1016, 60432, 95, 60039, 1, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 3, 64992, + 60896, 60896, 60896, 58120, 2, 60432, 0, 65000, 60576, 58120, 1, 64992, 64528, + 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 1062, + 60432, 95, 60039, 0, 64680, 64528, 3, 64992, 60896, 60896, 60896, 60896, + 58120, 2, 60432, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, 60576, + 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, + 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 1109, 60432, 95, 60039, 0, 64680, + 64528, 3, 64992, 60896, 60896, 60896, 60896, 60896, 58120, 0, 64968, 64672, + 60040, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, + 58120, 3, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 452, 60432, 14, + 58120, 1156, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, 64528, 4, 57504, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 1178, 60432, 38, 60039, + 0, 64680, 64528, 1185, 58117, 1219, 60039, 3, 64528, 4, 57504, 64528, 0, + 65000, 60576, 58120, 3, 64528, 5, 57504, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 3, 64992, 60896, 60896, 60896, + 58120, 1401, 60039, 3, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 3, + 64528, 6, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 0, 64680, 64528, 3, 64992, 60896, 60896, 60896, 58120, 3, 64528, 9, 57504, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1267, 58117, 1335, 60039, 3, + 64528, 7, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1283, 58117, + 1309, 60039, 3, 64544, 64528, 0, 65000, 60576, 58120, 4, 60432, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 3, 64544, 58120, + 1333, 60039, 3, 64992, 64528, 0, 65000, 60576, 58120, 4, 60432, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 3, 64992, 58120, + 1401, 60039, 3, 64528, 7, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 1351, 58117, 1377, 60039, 3, 64544, 64528, 0, 65000, 60576, 58120, 4, + 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, + 3, 64544, 58120, 1401, 60039, 3, 64992, 64528, 0, 65000, 60576, 58120, 4, + 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, + 3, 64992, 58120, 3, 64528, 8, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 1417, 58117, 1485, 60039, 3, 64528, 7, 57504, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 1433, 58117, 1459, 60039, 3, 64992, 64528, 0, 65000, + 60576, 58120, 4, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 0, 64680, 64528, 3, 64992, 58120, 1483, 60039, 3, 64544, 64528, 0, 65000, + 60576, 58120, 4, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 0, 64680, 64528, 3, 64544, 58120, 1551, 60039, 3, 64528, 7, 57504, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 1501, 58117, 1527, 60039, 3, 64992, + 64528, 0, 65000, 60576, 58120, 4, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61896, 0, 64680, 64528, 3, 64992, 58120, 1551, 60039, 3, 64544, + 64528, 0, 65000, 60576, 58120, 4, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61896, 0, 64680, 64528, 3, 64544, 58120, 3, 64544, 64528, 0, + 65000, 60576, 58120, 3, 64528, 10, 57504, 64528, 0, 65000, 60576, 58120, 1571, + 60432, 22, 60039, 0, 64672, 64584, 0, 64680, 64528, 1581, 58117, 1612, 60039, + 0, 64968, 64672, 61384, 3, 64528, 14, 57488, 13, 58120, 0, 64680, 64528, 13, + 64544, 58120, 3, 64528, 10, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 3, 64544, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 3, 64528, 11, + 57504, 64528, 0, 65000, 60576, 58120, 1632, 60432, 38, 60039, 0, 64672, 64584, + 0, 64680, 64528, 1642, 58117, 1675, 60039, 2, 60432, 0, 65000, 60576, 58120, + 3, 64528, 14, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 3, 64528, + 11, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 64544, 58120, 3, + 64992, 64528, 0, 65000, 60576, 58120, 3, 64528, 12, 57504, 64528, 0, 65000, + 60576, 58120, 1695, 60432, 22, 60039, 0, 64672, 64584, 0, 64680, 64528, 1705, + 58117, 1738, 60039, 3, 60432, 0, 65000, 60576, 58120, 3, 64528, 14, 57488, 13, + 58120, 0, 64680, 64528, 13, 64544, 58120, 3, 64528, 12, 57504, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 3, 64992, 58120, 3, 64992, 64528, 0, + 65000, 60576, 58120, 3, 64528, 13, 57504, 64528, 0, 65000, 60576, 58120, 1758, + 60432, 38, 60039, 0, 64672, 64584, 0, 64680, 64528, 1768, 58117, 1801, 60039, + 4, 60432, 0, 65000, 60576, 58120, 3, 64528, 14, 57488, 13, 58120, 0, 64680, + 64528, 13, 64544, 58120, 3, 64528, 13, 57504, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 3, 64992, 58120, 3, 64528, 0, 65000, 60576, 58120, 1, 60432, + 13, 58120, 387, 60432, 14, 58120, 1819, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 3, 64528, 14, 57504, 64528, 0, 65000, 60576, 58120, 54, 60039, 5, + 60432, 58256, 0, 65000, 60576, 60040, 1837, 58113, 2, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 3, 58120, 3, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 10, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 7287, + 60432, 14, 58120, 1882, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 60896, + 58120, 3, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 10, 60432, 0, 65000, + 60576, 58120, 2, 60432, 13, 58120, 7287, 60432, 14, 58120, 1916, 60432, 95, + 60039, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, 2, 64992, 64528, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 1939, 60432, 6, 60039, 0, 64680, + 64528, 1946, 58117, 1963, 60039, 10, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 1, 64992, 60896, 60896, 60896, 58120, 2086, 60039, 3, 64992, 60896, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 1979, 60432, 38, 60039, + 0, 64672, 64584, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 61384, 1997, 60432, 6, 60039, 0, 64680, 64528, 60576, 61448, 3, 64992, 60896, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 2018, 60432, 38, 60039, + 0, 64680, 64528, 60576, 62792, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 61384, 0, 64672, 64592, 59336, 2042, 60432, 6, 60039, 0, 64680, + 64528, 60576, 61448, 0, 64680, 64528, 2054, 58117, 2071, 60039, 20, 60432, 0, + 65000, 60576, 58120, 0, 64680, 64528, 1, 64992, 60896, 60896, 60896, 58120, + 2086, 60039, 5, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, 64992, + 60896, 60896, 60896, 58120, 3, 64528, 14, 57504, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 61384, 2103, 60432, 6, 60039, 0, 64680, 64528, 2110, + 58117, 2227, 60039, 506, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, + 64544, 58120, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 50, 60432, 0, + 65000, 60576, 58120, 0, 64672, 64592, 59336, 2, 60432, 13, 58120, 6822, 60432, + 14, 58120, 2153, 60432, 95, 60039, 1, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 2, 60432, 13, 58120, 7287, 60432, 14, 58120, 2173, 60432, 95, 60039, 0, + 64680, 64528, 1, 64992, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, 1, + 64992, 64528, 0, 65000, 60576, 58120, 1, 64528, 4, 57504, 64528, 0, 65000, + 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 2214, 60432, 95, + 60039, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64992, 58120, 2616, + 60039, 3, 64528, 14, 57504, 64528, 0, 65000, 60576, 58120, 2, 60432, 0, 65000, + 60576, 58120, 2246, 60432, 6, 60039, 0, 64680, 64528, 2253, 58117, 2364, + 60039, 0, 64968, 64672, 60040, 0, 64680, 64528, 1, 64544, 58120, 1, 64528, 3, + 57504, 64528, 0, 65000, 60576, 58120, 50, 60432, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 6822, 60432, 14, 58120, 2290, 60432, 95, 60039, 1, 64992, + 60896, 64528, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 7287, 60432, 14, + 58120, 2310, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 58120, 3, 64992, + 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 1, + 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 6822, + 60432, 14, 58120, 2351, 60432, 95, 60039, 0, 64680, 64528, 60576, 61576, 0, + 64680, 64528, 1, 64992, 58120, 2616, 60039, 3, 64528, 14, 57504, 64528, 0, + 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 2383, 60432, 6, 60039, + 0, 64680, 64528, 2390, 58117, 2507, 60039, 250, 60432, 0, 65000, 60576, 58120, + 0, 64680, 64528, 1, 64992, 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 25, 60432, 0, 65000, 60576, 58120, 0, 64672, 64592, 59336, 2, 60432, + 13, 58120, 6822, 60432, 14, 58120, 2432, 60432, 95, 60039, 1, 64528, 3, 57504, + 64528, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 7287, 60432, 14, 58120, + 2453, 60432, 95, 60039, 0, 64680, 64528, 1, 64544, 58120, 3, 64544, 64528, 0, + 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, 64528, 4, + 57504, 64528, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, + 58120, 2494, 60432, 95, 60039, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, + 1, 64544, 58120, 2616, 60039, 0, 64968, 64672, 60040, 0, 64680, 64528, 1, + 64992, 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 25, 60432, 0, + 65000, 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 2543, 60432, + 95, 60039, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 2, 60432, 13, + 58120, 7287, 60432, 14, 58120, 2564, 60432, 95, 60039, 0, 64680, 64528, 1, + 64544, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, + 65000, 60576, 58120, 1, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 6822, 60432, 14, 58120, 2605, 60432, 95, 60039, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 1, 64544, 58120, 3, 64528, 0, 65000, + 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, + 65000, 60576, 58120, 3, 60432, 13, 58120, 652, 60432, 14, 58120, 2648, 60432, + 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 5, + 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 8643, 60432, 14, 58120, + 2677, 60432, 95, 60039, 0, 64680, 64528, 3, 58120, 2, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 3, 64544, 58120, 2, 64992, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 3, 64992, 58120, 2, 64992, 60896, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 3, 64992, 60896, 58120, 2, 64528, 3, + 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 64992, 60896, 60896, + 58120, 2, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 64992, 60896, + 60896, 60896, 58120, 3, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 2827, 60432, 14, 58120, 2773, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, + 64528, 0, 65000, 60576, 58120, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 3, 58120, 3, 64528, 0, 65000, 60576, 58120, 1, 60432, + 13, 58120, 9357, 60432, 14, 58120, 2816, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 0, 64968, 64672, 60040, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 3, 58120, 0, 64968, 64672, 60040, 0, 64672, 64584, 1, + 60432, 13, 58120, 20889, 60432, 14, 58120, 2858, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 3, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 2954, + 60432, 14, 58120, 2881, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, + 64672, 60040, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 3, 58120, 0, 64968, 64672, 60040, 1, 60432, 13, 58120, 20889, 60432, + 14, 58120, 2920, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, 64528, 0, + 65000, 60576, 58120, 1, 60432, 13, 58120, 2954, 60432, 14, 58120, 2943, 60432, + 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 2, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 3, 64544, + 64528, 0, 65000, 60576, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, 3, + 64544, 64528, 0, 65000, 60576, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 3, 64992, 64528, 0, 65000, 60576, 58120, + 3, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 4, 60432, 13, 58120, 22354, 60432, 14, 58120, 3033, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 2, 64544, 64528, + 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 2, 64992, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 3, 64992, 60896, 60896, 60896, 58120, 0, 64968, + 64672, 60040, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 3, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 54, 60039, 2, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 3, 64544, 64528, 0, + 65000, 60576, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 3, 58120, 3, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 2892, 60432, 14, 58120, 3163, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 2, + 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 64992, 60896, 58120, + 3, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 2827, 60432, 14, 58120, + 3200, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, + 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 3, + 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 3240, + 60432, 6, 60039, 0, 64680, 64528, 3247, 58117, 3525, 60039, 3, 64544, 64528, + 0, 65000, 60576, 58120, 4, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61896, 0, 64680, 64528, 3, 64544, 58120, 3, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 3286, 60432, 38, 60039, 0, 64680, 64528, + 3293, 58117, 3303, 60039, 0, 64968, 64672, 60040, 0, 64680, 64528, 3, 64544, + 58120, 0, 64968, 64672, 60040, 1, 60432, 13, 58120, 20889, 60432, 14, 58120, + 3319, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, 64544, 64528, 0, 65000, + 60576, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61576, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 3, 64992, + 64528, 0, 65000, 60576, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 3, + 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 4, + 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 3, 64992, 64528, + 0, 65000, 60576, 58120, 3, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 4, 60432, 13, 58120, 22354, 60432, 14, 58120, + 3424, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 0, + 64672, 64584, 1, 60432, 13, 58120, 20889, 60432, 14, 58120, 3448, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 3, + 64992, 64528, 0, 65000, 60576, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, + 3, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 3, 64992, + 64528, 0, 65000, 60576, 58120, 3, 64528, 3, 57504, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 4, 60432, 13, 58120, 22354, 60432, 14, + 58120, 3518, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3831, 60039, 3, + 64544, 64528, 0, 65000, 60576, 58120, 4, 60432, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 3, 64544, 58120, 3, 64544, 64528, + 0, 65000, 60576, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 511, 60432, 0, 65000, 60576, 58120, 3579, 60432, + 22, 60039, 0, 64680, 64528, 3586, 58117, 3611, 60039, 511, 60432, 0, 65000, + 60576, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61896, 0, 64680, 64528, 3, 64544, 58120, 0, 64968, 64672, 60040, 1, + 60432, 13, 58120, 20889, 60432, 14, 58120, 3627, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 4, 60432, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61896, 3, 64992, 64528, 0, 65000, 60576, + 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, + 64680, 64528, 60576, 61896, 3, 64992, 64528, 0, 65000, 60576, 58120, 3, 64528, + 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 4, + 60432, 13, 58120, 22354, 60432, 14, 58120, 3706, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 0, 64968, 64672, 60040, 0, 64672, 64584, 1, 60432, 13, 58120, + 20889, 60432, 14, 58120, 3730, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, + 64544, 64528, 0, 65000, 60576, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 3, 60432, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61896, 3, 64992, 64528, 0, 65000, 60576, 58120, 3, 64544, + 64528, 0, 65000, 60576, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 60576, 61576, 3, 64992, 64528, 0, 65000, 60576, 58120, 3, + 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 4, 60432, 13, 58120, 22354, 60432, 14, 58120, 3826, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 0, 65000, 60576, + 60040, 0, 60432, 13, 58120, 4508, 60432, 14, 58120, 3853, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 0, 60432, 13, 58120, 4531, 60432, 14, 58120, 3870, + 60432, 95, 60039, 0, 64680, 64528, 1, 64544, 58120, 1, 64544, 64528, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 4539, 60432, 14, 58120, 3895, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, + 60432, 13, 58120, 4419, 60432, 14, 58120, 3919, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 7, 60432, 0, 65000, 60576, + 58120, 1, 60432, 13, 58120, 8643, 60432, 14, 58120, 3948, 60432, 95, 60039, 0, + 64680, 64528, 3, 58120, 0, 60432, 13, 58120, 20598, 60432, 14, 58120, 3965, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 50, 60432, 0, 65000, 60576, + 58120, 0, 64680, 64528, 3, 64992, 60896, 60896, 60896, 60896, 60896, 58120, + 230, 60432, 0, 65000, 60576, 58120, 229, 60432, 0, 65000, 60576, 58120, 3, + 64528, 6, 57504, 64528, 0, 65000, 60576, 58120, 7, 60432, 0, 65000, 60576, + 58120, 4, 60432, 13, 58120, 2659, 60432, 14, 58120, 4026, 60432, 95, 60039, 0, + 64680, 64528, 3, 64544, 58120, 253, 60432, 0, 65000, 60576, 58120, 222, 60432, + 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 511, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 229, 60432, 0, 65000, 60576, 58120, 6, 60432, + 13, 58120, 145, 60432, 14, 58120, 4076, 60432, 95, 60039, 0, 64680, 64528, 3, + 64992, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, 400, 60432, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 3, 60432, 13, 58120, 652, 60432, 14, + 58120, 4111, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, + 60040, 238, 60432, 0, 65000, 60576, 58120, 511, 60432, 0, 65000, 60576, 58120, + 240, 60432, 0, 65000, 60576, 58120, 4, 60432, 13, 58120, 22354, 60432, 14, + 58120, 4150, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 22, 60432, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 2, 60432, 13, 58120, 19350, 60432, 14, + 58120, 4177, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 8, 60432, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 25105, 60432, 14, 58120, 4200, 60432, 95, + 60039, 83, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 25659, 60432, + 14, 58120, 4218, 60432, 95, 60039, 99, 60432, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 25659, 60432, 14, 58120, 4236, 60432, 95, 60039, 111, 60432, + 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 25659, 60432, 14, 58120, 4254, + 60432, 95, 60039, 114, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, + 25659, 60432, 14, 58120, 4272, 60432, 95, 60039, 101, 60432, 0, 65000, 60576, + 58120, 2, 60432, 13, 58120, 25659, 60432, 14, 58120, 4290, 60432, 95, 60039, + 58, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 25659, 60432, 14, + 58120, 4308, 60432, 95, 60039, 32, 60432, 0, 65000, 60576, 58120, 2, 60432, + 13, 58120, 25659, 60432, 14, 58120, 4326, 60432, 95, 60039, 48, 60432, 0, + 65000, 60576, 58120, 2, 60432, 13, 58120, 25659, 60432, 14, 58120, 4344, + 60432, 95, 60039, 1, 60432, 13, 58120, 19850, 60432, 14, 58120, 4356, 60432, + 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 0, 64680, 64528, + 3, 64992, 60896, 60896, 58120, 0, 64968, 64672, 60040, 0, 64680, 64528, 3, + 64992, 60896, 60896, 60896, 58120, 0, 64968, 64672, 60040, 0, 64680, 64528, 3, + 64992, 60896, 58120, 0, 64968, 64672, 60040, 0, 64680, 64528, 3, 64992, 60896, + 60896, 60896, 60896, 58120, 3, 64528, 0, 65000, 60576, 58120, 54, 60039, 2, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 3, 64544, + 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 2786, 60432, 14, 58120, + 4450, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, 64992, 64528, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 346, 60432, 14, 58120, 4474, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 3, 64528, 0, 65000, 60576, 58120, 1, 60432, + 13, 58120, 9357, 60432, 14, 58120, 4497, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 0, 64968, 64672, 60040, 54, 60039, 0, 60432, 13, 58120, 3930, 60432, + 14, 58120, 4520, 60432, 95, 60039, 0, 64680, 64528, 16, 58120, 0, 64968, + 64672, 60040, 54, 60039, 16, 64528, 0, 65000, 60576, 58120, 54, 60039, 0, + 65000, 60576, 60040, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 3, 58120, 3, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64672, 64584, + 0, 64672, 64584, 0, 64680, 64528, 4943, 58117, 1, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 4590, 60432, 6, 60039, 3, 64528, 3, + 57504, 64528, 0, 65000, 60576, 58120, 0, 64672, 64584, 0, 64680, 64528, 60576, + 61448, 0, 64672, 64584, 0, 64680, 64528, 4682, 58117, 0, 60432, 13, 58120, + 5924, 60432, 14, 58120, 4627, 60432, 95, 60039, 0, 64680, 64528, 1, 64544, + 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 3211, + 60432, 14, 58120, 4652, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, 64528, + 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 5191, 60432, 14, 58120, 4675, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 4575, 60039, 1, 64544, 64528, 0, + 65000, 60576, 58120, 130, 60432, 0, 65000, 60576, 58120, 4699, 60432, 6, + 60039, 0, 64680, 64528, 4706, 58117, 4736, 60039, 3, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64968, 64672, 61384, 2, 60432, 13, 58120, 3044, 60432, 14, + 58120, 4729, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 4831, 60039, 1, + 64544, 64528, 0, 65000, 60576, 58120, 132, 60432, 0, 65000, 60576, 58120, + 4753, 60432, 6, 60039, 0, 64680, 64528, 4760, 58117, 4792, 60039, 3, 64544, + 64528, 0, 65000, 60576, 58120, 2, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, + 58120, 3044, 60432, 14, 58120, 4785, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 4831, 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 140, 60432, 0, + 65000, 60576, 58120, 4809, 60432, 6, 60039, 0, 64680, 64528, 4816, 58117, + 4831, 60039, 0, 64968, 64672, 60040, 0, 64672, 64584, 0, 64680, 64528, 3, + 64992, 60896, 60896, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 4846, 60432, 6, 60039, 0, 64672, 64584, 3, 64528, 3, 57504, + 64528, 0, 65000, 60576, 58120, 0, 64672, 64584, 0, 64680, 64528, 60576, 61448, + 0, 64672, 64584, 0, 64680, 64528, 4941, 58117, 0, 60432, 13, 58120, 5924, + 60432, 14, 58120, 4886, 60432, 95, 60039, 0, 64680, 64528, 1, 64544, 58120, 3, + 64544, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 3211, 60432, 14, + 58120, 4911, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, 64528, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 5191, 60432, 14, 58120, 4934, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 4831, 60039, 4555, 60039, 3, 64528, 3, + 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4959, 58117, 5185, + 60039, 10, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, 60576, 58120, + 2, 60432, 13, 58120, 19350, 60432, 14, 58120, 4983, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 9, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 25105, 60432, 14, 58120, 5006, 60432, 95, 60039, 71, 60432, 0, 65000, 60576, + 58120, 2, 60432, 13, 58120, 25659, 60432, 14, 58120, 5024, 60432, 95, 60039, + 97, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 25659, 60432, 14, + 58120, 5042, 60432, 95, 60039, 109, 60432, 0, 65000, 60576, 58120, 2, 60432, + 13, 58120, 25659, 60432, 14, 58120, 5060, 60432, 95, 60039, 101, 60432, 0, + 65000, 60576, 58120, 2, 60432, 13, 58120, 25659, 60432, 14, 58120, 5078, + 60432, 95, 60039, 32, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, + 25659, 60432, 14, 58120, 5096, 60432, 95, 60039, 79, 60432, 0, 65000, 60576, + 58120, 2, 60432, 13, 58120, 25659, 60432, 14, 58120, 5114, 60432, 95, 60039, + 118, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 25659, 60432, 14, + 58120, 5132, 60432, 95, 60039, 101, 60432, 0, 65000, 60576, 58120, 2, 60432, + 13, 58120, 25659, 60432, 14, 58120, 5150, 60432, 95, 60039, 114, 60432, 0, + 65000, 60576, 58120, 2, 60432, 13, 58120, 25659, 60432, 14, 58120, 5168, + 60432, 95, 60039, 1, 60432, 13, 58120, 19850, 60432, 14, 58120, 5180, 60432, + 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 5, + 60432, 58256, 0, 65000, 60576, 60040, 5193, 58113, 2, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 3, 58120, 3, 64992, 64528, 0, 65000, 60576, + 58120, 1, 60432, 13, 58120, 1126, 60432, 14, 58120, 5231, 60432, 95, 60039, 0, + 64680, 64528, 3, 64992, 60896, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 5254, 60432, 22, 60039, 3, 64992, 60896, 64528, + 0, 65000, 60576, 58120, 3, 64528, 5, 57504, 64528, 0, 65000, 60576, 58120, + 5275, 60432, 6, 60039, 0, 64672, 64584, 0, 64680, 64528, 60576, 61448, 0, + 64680, 64528, 5290, 58117, 5802, 60039, 3, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 3, 64992, 60896, 60896, 60896, 60896, 58120, 0, + 64968, 64672, 60040, 0, 64680, 64528, 1, 64544, 58120, 3, 64544, 64528, 0, + 65000, 60576, 58120, 1, 60432, 13, 58120, 3078, 60432, 14, 58120, 5337, 60432, + 95, 60039, 0, 64680, 64528, 1, 64992, 58120, 3, 64544, 64528, 0, 65000, 60576, + 58120, 1, 60432, 13, 58120, 3099, 60432, 14, 58120, 5362, 60432, 95, 60039, 0, + 64680, 64528, 1, 64992, 60896, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, + 1, 60432, 13, 58120, 599, 60432, 14, 58120, 5388, 60432, 95, 60039, 0, 64680, + 64528, 1, 64992, 60896, 60896, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, + 1, 60432, 13, 58120, 620, 60432, 14, 58120, 5415, 60432, 95, 60039, 0, 64680, + 64528, 1, 64992, 60896, 60896, 60896, 58120, 3, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 4, 60432, 0, 65000, 60576, 58120, 5442, 60432, 6, 60039, 0, + 64680, 64528, 5449, 58117, 5771, 60039, 1, 64992, 64528, 0, 65000, 60576, + 58120, 1, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 5469, 60432, 22, + 60039, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 1, 64528, 3, 57504, + 64528, 0, 65000, 60576, 58120, 5490, 60432, 38, 60039, 0, 64680, 64528, 60576, + 62792, 0, 64680, 64528, 3, 64992, 60896, 60896, 58120, 3, 64528, 3, 57504, + 64528, 0, 65000, 60576, 58120, 0, 64672, 64584, 0, 64680, 64528, 5522, 58117, + 5771, 60039, 1, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 1, 64992, + 64528, 0, 65000, 60576, 58120, 10, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 5553, 60432, 38, 60039, 0, 64680, 64528, 5560, 58117, + 5576, 60039, 0, 64968, 64672, 61384, 0, 64672, 64592, 59336, 0, 64680, 64528, + 1, 64544, 58120, 5625, 60039, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, + 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 10, 60432, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61896, 5608, 60432, 22, 60039, 0, 64680, + 64528, 5615, 58117, 5625, 60039, 0, 64968, 64672, 61384, 0, 64680, 64528, 1, + 64544, 58120, 3, 64528, 6, 57504, 64528, 0, 65000, 60576, 58120, 2, 60432, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 3, 64992, + 60896, 60896, 60896, 60896, 60896, 58120, 3, 64544, 64528, 0, 65000, 60576, + 58120, 3, 64528, 6, 57504, 64528, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, + 3133, 60432, 14, 58120, 5684, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, + 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 3, 64992, 60896, 60896, 60896, + 58120, 22, 60432, 0, 65000, 60576, 58120, 7, 60432, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 19350, 60432, 14, 58120, 5740, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 3, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 1, 60432, + 13, 58120, 19981, 60432, 14, 58120, 5766, 60432, 95, 60039, 0, 64680, 64528, + 5, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, + 60576, 58120, 2, 60432, 13, 58120, 1835, 60432, 14, 58120, 5797, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 2, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 5823, 60432, 22, 60039, + 0, 64672, 64584, 0, 64680, 64528, 5833, 58117, 5856, 60039, 2, 60432, 0, + 65000, 60576, 58120, 1, 60432, 13, 58120, 27353, 60432, 14, 58120, 5851, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 2, 64544, 64528, 0, 65000, 60576, + 58120, 1, 60432, 13, 58120, 8643, 60432, 14, 58120, 5875, 60432, 95, 60039, + 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, + 3, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 9357, 60432, 14, 58120, + 5907, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, + 60039, 0, 64968, 64672, 60040, 54, 60039, 24576, 60432, 0, 65000, 60576, + 58120, 1, 60432, 13, 58120, 8558, 60432, 14, 58120, 5942, 60432, 95, 60039, + 54, 60039, 0, 64544, 60040, 60912, 60040, 0, 59336, 0, 64968, 64672, 60040, 1, + 60432, 13, 58120, 19610, 60432, 14, 58120, 5967, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 5987, 60432, 6, 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 6002, 60432, 22, 60039, 0, 64680, 64528, 60576, 62792, 0, + 64672, 64584, 0, 64680, 64528, 6070, 58117, 0, 60432, 13, 58120, 5924, 60432, + 14, 58120, 6027, 60432, 95, 60039, 0, 64680, 64528, 1, 64544, 58120, 1, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 6048, 60432, 22, 60039, + 0, 64680, 64528, 6055, 58117, 6068, 60039, 1, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 1, 64992, 58120, 5972, 60039, 0, 60432, 13, 58120, + 27042, 60432, 14, 58120, 6082, 60432, 95, 60039, 1, 60432, 13, 58120, 19610, + 60432, 14, 58120, 6094, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 1, 64992, + 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 19610, 60432, 14, 58120, + 6118, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 1, 64992, 64528, 0, 65000, + 60576, 58120, 54, 60039, 5, 60432, 58256, 0, 65000, 60576, 60040, 6134, 58113, + 80, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 25105, 60432, 14, + 58120, 6159, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, + 2, 64544, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 19850, 60432, + 14, 58120, 6186, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 60432, 13, + 58120, 27034, 60432, 14, 58120, 6203, 60432, 95, 60039, 0, 64680, 64528, 1, + 64992, 58120, 0, 60432, 13, 58120, 27042, 60432, 14, 58120, 6221, 60432, 95, + 60039, 0, 64680, 64528, 1, 64992, 60896, 58120, 1, 64528, 4, 57504, 64528, 0, + 65000, 60576, 58120, 0, 64672, 64584, 0, 64672, 64584, 0, 64680, 64528, 6404, + 58117, 0, 60432, 13, 58120, 5944, 60432, 14, 58120, 6260, 60432, 95, 60039, 0, + 64680, 64528, 1, 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, + 64992, 64528, 0, 65000, 60576, 58120, 6284, 60432, 6, 60039, 0, 64680, 64528, + 1, 64992, 60896, 60896, 60896, 58120, 1, 64528, 4, 57504, 64528, 0, 65000, + 60576, 58120, 0, 64672, 64584, 0, 64680, 64528, 6312, 58117, 6402, 60039, 1, + 64544, 64528, 0, 65000, 60576, 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 6331, 60432, 6, 60039, 0, 64680, 64528, 6338, 58117, 6366, 60039, 1, + 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 25801, + 60432, 14, 58120, 6359, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 6402, + 60039, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, + 65000, 60576, 58120, 2, 60432, 13, 58120, 25659, 60432, 14, 58120, 6394, + 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, 6228, 60039, + 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 54, 60039, 0, 64544, 60040, + 60912, 60040, 0, 59336, 2, 64544, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, + 58120, 6132, 60432, 14, 58120, 6441, 60432, 95, 60039, 0, 64680, 64528, 1, + 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 25889, 60432, 14, 58120, 6466, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, + 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 25252, + 60432, 14, 58120, 6491, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 1, 64992, + 64528, 0, 65000, 60576, 58120, 54, 60039, 0, 65000, 60576, 60040, 16, 60432, + 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 5808, 60432, 14, 58120, 6527, + 60432, 95, 60039, 0, 64680, 64528, 17, 58120, 16, 60432, 0, 65000, 60576, + 58120, 1, 60432, 13, 58120, 5808, 60432, 14, 58120, 6550, 60432, 95, 60039, 0, + 64680, 64528, 18, 58120, 0, 64968, 64672, 60040, 18, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 0, 64968, 64672, 61384, 0, 64680, 64528, + 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 4, 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 15, + 60432, 0, 65000, 60576, 58120, 6613, 60432, 38, 60039, 0, 64672, 64584, 0, + 64680, 64528, 6768, 58117, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, + 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64544, 58120, + 1, 64544, 64528, 0, 65000, 60576, 58120, 18, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, + 64672, 61384, 0, 64680, 64528, 60576, 61896, 18, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, + 64528, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 61384, 0, 64680, 64528, 60576, 61896, 18, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, + 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 4, 64544, 58120, 6596, 60039, 0, 64968, 64672, 60040, 54, + 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 6789, + 60432, 38, 60039, 0, 64680, 64528, 6796, 58117, 6813, 60039, 2, 64544, 64528, + 0, 65000, 60576, 58120, 0, 64672, 64592, 59336, 0, 64680, 64528, 2, 64544, + 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 54, 60039, 5, 60432, 58256, 0, + 65000, 60576, 60040, 6824, 58113, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 6846, 60432, 38, 60039, 2, 64992, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 6861, 60432, 22, 60039, 0, 64680, 64528, 60576, + 61448, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 6881, + 60432, 22, 60039, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 6896, 60432, 38, 60039, 0, 64680, 64528, 60576, 61448, 0, 64680, 64528, + 60576, 62792, 0, 64680, 64528, 1, 64992, 60896, 60896, 60896, 58120, 2, 64544, + 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 6774, 60432, 14, 58120, + 6934, 60432, 95, 60039, 0, 64680, 64528, 2, 64544, 58120, 2, 64992, 64528, 0, + 65000, 60576, 58120, 1, 60432, 13, 58120, 6774, 60432, 14, 58120, 6959, 60432, + 95, 60039, 0, 64680, 64528, 2, 64992, 58120, 2, 64544, 64528, 0, 65000, 60576, + 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 6983, 60432, 38, 60039, 0, + 64680, 64528, 6990, 58117, 7029, 60039, 2, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 1, 64992, 58120, 2, 64992, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 2, 64544, 58120, 1, 64992, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 2, 64992, 58120, 1, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 7048, 60432, 38, 60039, + 0, 64672, 64584, 0, 64680, 64528, 7245, 58117, 1, 64528, 3, 57504, 64528, 0, + 65000, 60576, 58120, 18, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, + 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61448, + 0, 64968, 64672, 60040, 7108, 60432, 22, 60039, 0, 64680, 64528, 7115, 58117, + 7192, 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 2, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64544, + 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 1, 64528, 3, 57504, + 64528, 0, 65000, 60576, 58120, 18, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64992, 60896, + 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 2, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 2, 64544, 58120, + 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, + 7029, 60039, 1, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 7261, 58117, 7278, 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64672, 64592, 59336, 0, 64680, 64528, 1, 64544, 58120, 1, 64544, 64528, 0, + 65000, 60576, 58120, 54, 60039, 4, 60432, 58256, 0, 65000, 60576, 60040, 7289, + 58113, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 7311, + 60432, 6, 60039, 0, 64680, 64528, 7318, 58117, 7341, 60039, 3, 60432, 0, + 65000, 60576, 58120, 1, 60432, 13, 58120, 27353, 60432, 14, 58120, 7336, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 2, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 7356, 60432, 38, 60039, 2, 64992, 64528, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 7371, 60432, 22, 60039, 0, 64680, + 64528, 60576, 61448, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 7391, 60432, 22, 60039, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 7406, 60432, 38, 60039, 0, 64680, 64528, 60576, 61448, 0, + 64680, 64528, 60576, 62792, 0, 64680, 64528, 1, 64992, 60896, 58120, 0, 64968, + 64672, 60040, 17, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 2, 64992, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 6774, + 60432, 14, 58120, 7457, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64680, + 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, + 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 6774, + 60432, 14, 58120, 7498, 60432, 95, 60039, 0, 64680, 64528, 2, 64544, 58120, 1, + 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64672, 64584, 0, 64672, + 64584, 0, 64680, 64528, 7841, 58117, 32767, 60432, 0, 65000, 60576, 58120, 1, + 64544, 64528, 0, 65000, 60576, 58120, 17, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, 1, 64544, 64528, 0, 65000, + 60576, 58120, 17, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, + 7599, 60432, 38, 60039, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, 1, + 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64672, 64584, 0, 64680, + 64528, 7626, 58117, 7839, 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 17, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 1, 64544, 64528, 0, 65000, 60576, + 58120, 17, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, + 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 1, 64544, + 64528, 0, 65000, 60576, 58120, 17, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 5, 58120, 0, + 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, + 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, + 0, 64680, 64528, 60576, 61576, 17, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, + 60576, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 7790, 60432, 22, 60039, + 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, 1, 64528, 3, 57504, 64528, 0, + 65000, 60576, 58120, 0, 64672, 64584, 0, 64680, 64528, 7817, 58117, 7839, + 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64544, 58120, 7504, 60039, 1, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64672, 64592, + 59336, 7860, 60432, 22, 60039, 0, 64672, 64584, 0, 64680, 64528, 8039, 58117, + 1, 64544, 64528, 0, 65000, 60576, 58120, 17, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, + 65000, 60576, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 7909, 60432, 22, + 60039, 0, 64672, 64584, 0, 64680, 64528, 7919, 58117, 8015, 60039, 1, 64992, + 64528, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 18, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, + 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 0, 64680, 64528, 1, 64992, 58120, 2, 64544, 64528, 0, 65000, 60576, + 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 17, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, + 2, 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 61384, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 1, 64544, 58120, 7841, + 60039, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 8054, + 58117, 8071, 60039, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, 64672, 64592, + 59336, 0, 64680, 64528, 1, 64992, 58120, 1, 64992, 64528, 0, 65000, 60576, + 58120, 54, 60039, 4, 60432, 58256, 0, 65000, 60576, 60040, 8082, 58113, 2, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 8104, 60432, 38, + 60039, 0, 64680, 64528, 8111, 58117, 8134, 60039, 4, 60432, 0, 65000, 60576, + 58120, 1, 60432, 13, 58120, 27353, 60432, 14, 58120, 8129, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 7, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, + 1, 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 61384, 0, 64672, 64592, 59336, 8165, 60432, 22, 60039, 0, 64672, 64584, 0, + 64680, 64528, 8348, 58117, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, + 1, 64544, 64528, 0, 65000, 60576, 58120, 18, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64992, + 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, + 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 8249, 60432, 95, + 60039, 0, 64680, 64528, 1, 64992, 60896, 58120, 1, 64992, 60896, 64528, 0, + 65000, 60576, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 8275, 60432, 22, + 60039, 0, 64672, 64584, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 8294, 60432, 38, 60039, 0, 64672, 64584, 0, 64680, 64528, + 60576, 61448, 0, 64680, 64528, 8309, 58117, 8324, 60039, 1, 64992, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, 1, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, + 61896, 0, 64680, 64528, 1, 64544, 58120, 8146, 60039, 1, 64528, 3, 57504, + 64528, 0, 65000, 60576, 58120, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, + 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 8377, 60432, 22, 60039, 0, + 64680, 64528, 8384, 58117, 8397, 60039, 2, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 2, 64992, 58120, 2, 64992, 64528, 0, 65000, 60576, + 58120, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 2, 64992, 64528, 0, + 65000, 60576, 58120, 8424, 60432, 38, 60039, 0, 64680, 64528, 8431, 58117, + 8444, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 2, + 64992, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 54, 60039, 0, 64968, + 64672, 60040, 0, 64680, 64528, 19, 58120, 2048, 60432, 0, 65000, 60576, 58120, + 19, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 14334, + 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, + 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, + 2049, 60432, 0, 65000, 60576, 58120, 19, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 2050, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 4, 64544, 58120, 0, 64968, 64672, 60040, 54, 60039, 2, 64544, + 64528, 0, 65000, 60576, 58120, 19, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, + 60576, 58120, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 19, 64528, + 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 2, 64992, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 0, 64968, + 64672, 60040, 54, 60039, 0, 65000, 60576, 60040, 2, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64968, 64672, 61384, 8662, 60432, 38, 60039, 0, 64680, 64528, + 8669, 58117, 8692, 60039, 5, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, + 58120, 27353, 60432, 14, 58120, 8687, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 2048, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, 64544, 58120, + 0, 64968, 64672, 60040, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, + 60576, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 8743, 60432, 38, 60039, + 0, 64672, 64584, 0, 64680, 64528, 8787, 58117, 0, 64968, 64672, 61384, 1, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, + 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, + 64544, 58120, 8704, 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 2, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 16379, 60432, 0, + 65000, 60576, 58120, 8816, 60432, 22, 60039, 0, 64680, 64528, 8823, 58117, + 8846, 60039, 6, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 27353, + 60432, 14, 58120, 8841, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, + 64672, 60040, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 2, + 64544, 64528, 0, 65000, 60576, 58120, 2, 60432, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 8896, 60432, 22, 60039, 0, 64680, 64528, 8903, + 58117, 9295, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 2, 60432, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 1, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64968, 64672, 60040, 1, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, + 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 2, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61896, 2, 60432, 0, 65000, 60576, 58120, + 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, + 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 0, + 64968, 64672, 61384, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, + 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 2, 60432, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 9056, 60432, 6, 60039, 0, 64680, 64528, + 9063, 58117, 9147, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 3, 60432, + 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 1, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 1, 64544, 64528, 0, 65000, + 60576, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 4, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, + 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 4, 64544, 58120, 9227, 60039, 2, 64544, 64528, 0, + 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 0, 64968, 64672, 61384, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, + 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 0, 64968, 64672, + 61384, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 1, 64544, 64528, 0, 65000, 60576, 58120, 2, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 2, 60432, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, + 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 0, + 64968, 64672, 60040, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61576, 0, 64968, 64672, 60040, 0, 64680, 64528, 5, 58120, 0, 64680, + 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, + 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 2, 60432, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 54, 60039, 0, 64544, 60040, 60912, + 60040, 0, 59336, 2, 64544, 64528, 0, 65000, 60576, 58120, 2, 60432, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 1, 64544, 58120, + 0, 64968, 64672, 61384, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 1, 64992, 58120, 0, 64968, 64672, 60040, 1, + 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, + 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 9458, 60432, 6, 60039, 0, 64680, 64528, 9465, 58117, 9556, 60039, 0, + 64968, 64672, 60040, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61576, 0, 64968, 64672, 61384, 1, 64544, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, + 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61896, 2, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, + 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 9848, 60039, 0, 64968, 64672, + 60040, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 0, 64968, 64672, 61384, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, + 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61896, 0, 64968, 64672, 60040, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 5, 58120, + 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 4, 64544, 58120, 0, 64968, 64672, 61384, 1, 64992, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, + 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 2, + 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 9717, 60432, 6, + 60039, 0, 64680, 64528, 9724, 58117, 9782, 60039, 0, 64968, 64672, 61384, 1, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 1, 64544, + 64528, 0, 65000, 60576, 58120, 2, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 9848, 60039, + 0, 64968, 64672, 61384, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64968, 64672, 61384, 1, 64992, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, + 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 0, + 64968, 64672, 60040, 54, 60039, 16384, 60432, 0, 65000, 60576, 58120, 0, + 64680, 64528, 20, 58120, 0, 64968, 64672, 60040, 0, 64672, 64584, 0, 64680, + 64528, 21, 58120, 32, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 22, + 58120, 0, 64968, 64672, 60040, 0, 64680, 64528, 23, 58120, 6, 60432, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 25105, 60432, 14, 58120, 9915, 60432, 95, + 60039, 0, 64680, 64528, 24, 58120, 0, 60432, 13, 58120, 9960, 60432, 14, + 58120, 9932, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 60432, 13, 58120, + 18456, 60432, 14, 58120, 9949, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, + 64968, 64672, 60040, 54, 60039, 127, 60432, 0, 65000, 60576, 58120, 1, 60432, + 13, 58120, 5808, 60432, 14, 58120, 9978, 60432, 95, 60039, 0, 64680, 64528, + 25, 58120, 0, 64968, 64672, 60040, 63, 60432, 0, 65000, 60576, 58120, 63, + 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 63, 60432, + 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, + 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, + 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 10061, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 32, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 10128, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 33, 60432, 0, + 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, + 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 0, 64968, 64672, 60040, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 10211, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 34, 60432, 0, 65000, 60576, 58120, 54, 60432, 0, 65000, + 60576, 58120, 54, 60432, 0, 65000, 60576, 58120, 20, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 10284, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 35, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 18, 60432, 0, 65000, + 60576, 58120, 18, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, + 58120, 18, 60432, 0, 65000, 60576, 58120, 18, 60432, 0, 65000, 60576, 58120, + 63, 60432, 0, 65000, 60576, 58120, 18, 60432, 0, 65000, 60576, 58120, 18, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 10367, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 36, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, + 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, + 58120, 48, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 30, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, + 17843, 60432, 14, 58120, 10454, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 37, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 35, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 24, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 6, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 49, 60432, + 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 10535, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 38, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 54, 60432, 0, 65000, 60576, 58120, + 27, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, 60576, 58120, 27, + 60432, 0, 65000, 60576, 58120, 54, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 10620, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 39, 60432, 0, + 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 10693, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 40, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, + 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, + 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, + 58120, 6, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 12, + 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 10778, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 41, 60432, 0, + 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, + 58120, 24, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, + 24, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 6, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 10863, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 42, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 51, 60432, 0, 65000, + 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, + 58120, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 10940, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 43, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, + 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 11017, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 44, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 0, + 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 11090, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 45, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 63, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, + 58120, 17843, 60432, 14, 58120, 11159, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 46, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 0, 65000, + 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 11230, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 47, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 32, 60432, 0, 65000, + 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 3, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 11309, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 48, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 11394, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 49, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 14, 60432, 0, 65000, 60576, 58120, 15, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, + 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 11479, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 50, 60432, 0, + 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 3, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 63, 60432, + 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 11564, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 51, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, + 58120, 48, 60432, 0, 65000, 60576, 58120, 28, 60432, 0, 65000, 60576, 58120, + 48, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 11649, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 52, 60432, 0, + 65000, 60576, 58120, 16, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, + 60576, 58120, 28, 60432, 0, 65000, 60576, 58120, 26, 60432, 0, 65000, 60576, + 58120, 25, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, + 24, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 60, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 11734, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 53, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, + 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, + 60576, 58120, 31, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, + 58120, 48, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 11819, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 54, + 60432, 0, 65000, 60576, 58120, 28, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, + 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, + 60576, 58120, 31, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 30, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 11904, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 55, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, + 65000, 60576, 58120, 49, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, + 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 11989, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 56, + 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, + 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 30, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 12074, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 57, 60432, 0, 65000, 60576, 58120, 30, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 62, 60432, 0, + 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, + 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 14, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, + 17843, 60432, 14, 58120, 12159, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 58, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 12234, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 59, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 0, 65000, 60576, 58120, 12, + 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 12311, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 60, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 24, + 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, + 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, + 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, + 17843, 60432, 14, 58120, 12392, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 61, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 63, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 63, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 12463, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 62, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 3, 60432, 0, 65000, 60576, 58120, 6, + 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 24, 60432, + 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, + 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 12544, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 64, 60432, 0, 65000, 60576, + 58120, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 59, 60432, 0, 65000, 60576, 58120, 59, + 60432, 0, 65000, 60576, 58120, 59, 60432, 0, 65000, 60576, 58120, 27, 60432, + 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, + 58120, 17843, 60432, 14, 58120, 12629, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 63, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 24, + 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, + 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 12, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 12712, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 65, 60432, 0, 65000, 60576, 58120, 12, + 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, + 17843, 60432, 14, 58120, 12797, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 66, 60432, 0, 65000, 60576, 58120, 31, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 31, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 31, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 12882, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 67, 60432, 0, 65000, 60576, + 58120, 28, 60432, 0, 65000, 60576, 58120, 54, 60432, 0, 65000, 60576, 58120, + 35, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, + 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 35, 60432, 0, 65000, + 60576, 58120, 54, 60432, 0, 65000, 60576, 58120, 28, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, + 17843, 60432, 14, 58120, 12967, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 68, 60432, 0, 65000, 60576, 58120, 15, 60432, 0, 65000, 60576, 58120, 27, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, + 60576, 58120, 15, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 13052, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 69, 60432, 0, 65000, 60576, + 58120, 63, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 35, 60432, 0, 65000, 60576, 58120, 11, 60432, 0, 65000, 60576, 58120, 15, + 60432, 0, 65000, 60576, 58120, 11, 60432, 0, 65000, 60576, 58120, 35, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 13137, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 70, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 35, 60432, 0, 65000, 60576, + 58120, 11, 60432, 0, 65000, 60576, 58120, 15, 60432, 0, 65000, 60576, 58120, + 11, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, + 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, + 13222, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 71, 60432, 0, 65000, + 60576, 58120, 28, 60432, 0, 65000, 60576, 58120, 54, 60432, 0, 65000, 60576, + 58120, 35, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, + 59, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 54, 60432, 0, 65000, 60576, 58120, 44, 60432, + 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 13307, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 72, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 51, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 13392, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 73, 60432, 0, + 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 30, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 13477, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 74, 60432, 0, 65000, 60576, 58120, 60, 60432, 0, + 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, + 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, + 58120, 24, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, 60576, 58120, + 27, 60432, 0, 65000, 60576, 58120, 14, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 13562, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 75, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, + 65000, 60576, 58120, 15, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 51, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 13647, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 76, 60432, 0, 65000, 60576, 58120, 3, 60432, + 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, + 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, + 58120, 3, 60432, 0, 65000, 60576, 58120, 35, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 13732, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 77, + 60432, 0, 65000, 60576, 58120, 33, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 51, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 13817, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 78, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 55, 60432, + 0, 65000, 60576, 58120, 55, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, + 65000, 60576, 58120, 59, 60432, 0, 65000, 60576, 58120, 59, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, + 17843, 60432, 14, 58120, 13902, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 79, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 13987, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 80, 60432, 0, 65000, 60576, + 58120, 31, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 31, + 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, + 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, + 58120, 17843, 60432, 14, 58120, 14072, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 81, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 59, 60432, 0, + 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 14159, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 82, 60432, 0, + 65000, 60576, 58120, 31, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 31, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 14244, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 83, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 28, 60432, 0, 65000, 60576, + 58120, 48, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 14329, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 84, + 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 63, 60432, + 0, 65000, 60576, 58120, 45, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, + 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, + 58120, 30, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 14414, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 85, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, + 17843, 60432, 14, 58120, 14499, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 86, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, + 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 14584, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 87, 60432, 0, 65000, 60576, + 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 63, 60432, + 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 18, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 14669, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 88, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, + 58120, 30, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 30, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 14754, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 89, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 30, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 30, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 14839, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 90, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 49, 60432, 0, 65000, + 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, + 58120, 6, 60432, 0, 65000, 60576, 58120, 35, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 14924, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 91, + 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, + 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, + 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, + 58120, 6, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 30, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 15009, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 92, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 61384, 3, 60432, 0, 65000, + 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, + 58120, 24, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, + 32, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 15088, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 93, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, + 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, + 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, + 58120, 24, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, + 24, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 15173, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 94, + 60432, 0, 65000, 60576, 58120, 8, 60432, 0, 65000, 60576, 58120, 28, 60432, 0, + 65000, 60576, 58120, 54, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 15246, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 95, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 63, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, + 17843, 60432, 14, 58120, 15315, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 96, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 12, + 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 15388, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 97, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 14, 60432, 0, 65000, 60576, 58120, 24, 60432, 0, 65000, 60576, 58120, 30, + 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, 60576, 58120, 27, 60432, + 0, 65000, 60576, 58120, 54, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, + 15467, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 98, 60432, 0, 65000, + 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, + 58120, 3, 60432, 0, 65000, 60576, 58120, 15, 60432, 0, 65000, 60576, 58120, + 27, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 30, 60432, + 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 15552, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 99, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 30, 60432, 0, 65000, 60576, + 58120, 51, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 30, 60432, + 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 15631, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 100, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, + 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, + 58120, 60, 60432, 0, 65000, 60576, 58120, 54, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 15716, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 101, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 63, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 15795, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 102, + 60432, 0, 65000, 60576, 58120, 28, 60432, 0, 65000, 60576, 58120, 54, 60432, + 0, 65000, 60576, 58120, 38, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, + 60576, 58120, 15, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, + 58120, 6, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 15, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 15880, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 103, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, + 65000, 60576, 58120, 62, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, + 15963, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 104, 60432, 0, 65000, + 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, + 58120, 3, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, 60576, 58120, + 55, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 16048, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 105, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 14, + 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, + 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, + 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, + 16131, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 106, 60432, 0, 65000, + 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 56, 60432, 0, 65000, 60576, 58120, 48, 60432, + 0, 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, + 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 16216, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 107, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, + 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, + 58120, 51, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, 60576, 58120, + 15, 60432, 0, 65000, 60576, 58120, 15, 60432, 0, 65000, 60576, 58120, 27, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 16301, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 108, 60432, 0, + 65000, 60576, 58120, 14, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 30, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 16386, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 109, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 29, 60432, 0, 65000, + 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 43, 60432, 0, 65000, 60576, + 58120, 43, 60432, 0, 65000, 60576, 58120, 43, 60432, 0, 65000, 60576, 58120, + 43, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 16465, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 110, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 29, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, + 58120, 51, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 16544, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 111, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 30, + 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, + 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, + 16623, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 112, 60432, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 31, + 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 16704, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 113, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 62, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, + 58120, 48, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 12, 60432, + 13, 58120, 17843, 60432, 14, 58120, 16785, 60432, 95, 60039, 0, 64680, 64528, + 5, 58120, 114, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 29, 60432, 0, 65000, 60576, + 58120, 55, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 3, 60432, 0, 65000, 60576, 58120, 3, 60432, 0, 65000, 60576, 58120, 7, 60432, + 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 16864, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 115, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 30, 60432, 0, 65000, 60576, + 58120, 51, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, + 24, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 30, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 16943, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 116, 60432, 0, 65000, 60576, 58120, 4, 60432, 0, + 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, + 60576, 58120, 15, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, + 58120, 6, 60432, 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 54, + 60432, 0, 65000, 60576, 58120, 28, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 17028, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 117, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 27, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, 60576, + 58120, 27, 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, 60576, 58120, + 27, 60432, 0, 65000, 60576, 58120, 54, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 17107, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 118, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, + 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, + 17843, 60432, 14, 58120, 17186, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 119, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, + 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, 63, 60432, 0, + 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 18, 60432, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, + 58120, 17843, 60432, 14, 58120, 17265, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 120, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 51, 60432, 0, 65000, 60576, 58120, 30, + 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, + 0, 65000, 60576, 58120, 30, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 17344, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 121, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 51, 60432, 0, 65000, 60576, + 58120, 51, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, 60576, 58120, + 62, 60432, 0, 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 24, + 60432, 0, 65000, 60576, 58120, 15, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 17425, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 122, 60432, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 63, + 60432, 0, 65000, 60576, 58120, 27, 60432, 0, 65000, 60576, 58120, 12, 60432, + 0, 65000, 60576, 58120, 6, 60432, 0, 65000, 60576, 58120, 51, 60432, 0, 65000, + 60576, 58120, 63, 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, + 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 17504, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 123, 60432, 0, 65000, 60576, + 58120, 56, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 7, + 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, + 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 56, 60432, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, + 60432, 13, 58120, 17843, 60432, 14, 58120, 17589, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 124, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, + 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, + 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, 60432, 14, + 58120, 17674, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 125, 60432, 0, + 65000, 60576, 58120, 7, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, + 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, + 58120, 56, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, + 12, 60432, 0, 65000, 60576, 58120, 12, 60432, 0, 65000, 60576, 58120, 7, + 60432, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 12, 60432, 13, 58120, 17843, 60432, 14, 58120, 17759, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 126, 60432, 0, 65000, 60576, 58120, 38, 60432, 0, + 65000, 60576, 58120, 45, 60432, 0, 65000, 60576, 58120, 25, 60432, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, + 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, + 0, 64968, 64672, 60040, 0, 64968, 64672, 60040, 12, 60432, 13, 58120, 17843, + 60432, 14, 58120, 17832, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, + 64968, 64672, 60040, 54, 60039, 0, 65000, 60576, 60040, 11, 60432, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 5808, 60432, 14, 58120, 17865, 60432, 95, + 60039, 0, 64680, 64528, 1, 64544, 58120, 2, 64544, 64528, 0, 65000, 60576, + 58120, 25, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 1, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, + 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, + 58120, 0, 64968, 64672, 60040, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 4, 64544, 58120, 0, 64968, 64672, 61384, 1, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 2, 64992, 60896, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 2, 60432, 0, + 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61576, 2, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 4, 64544, 58120, 3, 60432, 0, 65000, 60576, 58120, 1, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 2, 64528, 4, + 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, + 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, + 58120, 4, 60432, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 2, 64528, 5, 57504, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, + 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 5, 60432, 0, 65000, + 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 2, 64528, 6, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 5, + 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 4, 64544, 58120, 6, 60432, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 2, 64528, 7, 57504, 64528, + 0, 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, + 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 7, 60432, + 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 2, 64528, 8, 57504, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 4, 64544, 58120, 8, 60432, 0, 65000, 60576, 58120, 1, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 2, 64528, + 9, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, + 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, + 58120, 9, 60432, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 2, 64528, 10, 57504, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, + 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 10, 60432, 0, 65000, + 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 2, 64528, 11, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 5, + 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 4, 64544, 58120, 0, 64968, 64672, 60040, 54, 60039, 4, 60432, 58256, 0, + 65000, 60576, 60040, 18458, 58113, 127, 60432, 0, 65000, 60576, 58120, 1, + 60432, 13, 58120, 5808, 60432, 14, 58120, 18483, 60432, 95, 60039, 0, 64680, + 64528, 26, 58120, 0, 64968, 64672, 60040, 0, 64680, 64528, 1, 64992, 60896, + 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 127, 60432, 0, 65000, + 60576, 58120, 18517, 60432, 38, 60039, 0, 64672, 64584, 0, 64680, 64528, + 18859, 58117, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 25, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, + 4, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, 64544, 58120, 11, + 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 5808, 60432, 14, 58120, + 18580, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 58120, 1, 64992, 60896, + 64528, 0, 65000, 60576, 58120, 26, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 4, 64544, 58120, 0, 64968, 64672, 60040, 0, 64680, 64528, 1, + 64992, 60896, 60896, 58120, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, + 11, 60432, 0, 65000, 60576, 58120, 18665, 60432, 38, 60039, 0, 64672, 64584, + 0, 64680, 64528, 18795, 58117, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, + 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, + 64544, 64528, 0, 65000, 60576, 58120, 256, 60432, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 6822, 60432, 14, 58120, 18745, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 4, 64544, 58120, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, + 1, 64992, 60896, 60896, 58120, 18646, 60039, 1, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 18811, 60432, 6, 60039, 0, 64680, 64528, + 18818, 58117, 18833, 60039, 32, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 1, 64992, 60896, 58120, 18857, 60039, 1, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, + 64528, 1, 64992, 60896, 58120, 18499, 60039, 0, 64968, 64672, 60040, 54, + 60039, 0, 65000, 60576, 60040, 2, 64544, 64528, 0, 65000, 60576, 58120, 32, + 60432, 0, 65000, 60576, 58120, 18886, 60432, 38, 60039, 2, 64544, 64528, 0, + 65000, 60576, 58120, 126, 60432, 0, 65000, 60576, 58120, 18903, 60432, 22, + 60039, 0, 64680, 64528, 60576, 62792, 0, 64680, 64528, 18915, 58117, 18925, + 60039, 0, 64968, 64672, 60040, 0, 64680, 64528, 2, 64544, 58120, 21, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 18938, 58117, 18976, 60039, 2, 64544, + 64528, 0, 65000, 60576, 58120, 25, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 1, 64544, 58120, 19012, 60039, 2, 64544, 64528, + 0, 65000, 60576, 58120, 26, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 1, 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, + 58120, 54, 60039, 4, 60432, 58256, 0, 65000, 60576, 60040, 19023, 58113, 2, + 64544, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 18865, 60432, 14, + 58120, 19049, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 60896, 58120, 22, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, 64544, 58120, 1, 64992, + 64528, 0, 65000, 60576, 58120, 11, 60432, 0, 65000, 60576, 58120, 19085, + 60432, 38, 60039, 0, 64672, 64584, 0, 64680, 64528, 19344, 58117, 21, 64528, + 0, 65000, 60576, 58120, 0, 64680, 64528, 19106, 58117, 19161, 60039, 1, 64544, + 64528, 0, 65000, 60576, 58120, 20, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, + 60576, 58120, 256, 60432, 0, 65000, 60576, 58120, 0, 64672, 64592, 59336, 0, + 64680, 64528, 60576, 61448, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, + 19210, 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 20, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, + 64544, 64528, 0, 65000, 60576, 58120, 255, 60432, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61448, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, 1, + 64544, 64528, 0, 65000, 60576, 58120, 20, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 1, 64992, 64528, 0, 65000, 60576, 58120, 1, 64992, + 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, + 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 1, 64528, 3, 57504, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 62792, 0, 64680, 64528, + 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 4, 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 32, + 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, + 1, 64544, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64992, 58120, 19068, + 60039, 0, 64968, 64672, 60040, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 19365, 60432, 38, 60039, 2, 64544, 64528, 0, + 65000, 60576, 58120, 22, 60432, 0, 65000, 60576, 58120, 19382, 60432, 22, + 60039, 0, 64680, 64528, 60576, 62792, 2, 64992, 64528, 0, 65000, 60576, 58120, + 0, 64968, 64672, 60040, 19402, 60432, 38, 60039, 0, 64680, 64528, 60576, + 62792, 2, 64992, 64528, 0, 65000, 60576, 58120, 63, 60432, 0, 65000, 60576, + 58120, 19424, 60432, 22, 60039, 0, 64680, 64528, 60576, 62792, 0, 64680, + 64528, 19436, 58117, 19459, 60039, 20, 60432, 0, 65000, 60576, 58120, 1, + 60432, 13, 58120, 27353, 60432, 14, 58120, 19454, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 2, 60432, 0, 65000, + 60576, 58120, 2, 60432, 13, 58120, 7287, 60432, 14, 58120, 19484, 60432, 95, + 60039, 0, 64680, 64528, 23, 58120, 32, 60432, 0, 65000, 60576, 58120, 2, + 64544, 64528, 0, 65000, 60576, 58120, 352, 60432, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 6822, 60432, 14, 58120, 19520, 60432, 95, 60039, 0, 64680, + 64528, 60576, 61576, 23, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61576, 0, 64680, 64528, 22, 58120, 2, 64992, 64528, 0, 65000, 60576, + 58120, 23, 64528, 0, 65000, 60576, 58120, 2, 60432, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 6822, 60432, 14, 58120, 19572, 60432, 95, 60039, 19576, + 60432, 6, 60039, 0, 64680, 64528, 21, 58120, 32, 60432, 0, 65000, 60576, + 58120, 1, 60432, 13, 58120, 19021, 60432, 14, 58120, 19599, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 2, 64544, 64528, + 0, 65000, 60576, 58120, 0, 60432, 13, 58120, 27034, 60432, 14, 58120, 19629, + 60432, 95, 60039, 19633, 60432, 6, 60039, 0, 64680, 64528, 19640, 58117, + 19659, 60039, 0, 60432, 13, 58120, 20040, 60432, 14, 58120, 19652, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 19844, 60039, 2, 64544, 64528, 0, 65000, + 60576, 58120, 0, 60432, 13, 58120, 27042, 60432, 14, 58120, 19678, 60432, 95, + 60039, 19682, 60432, 6, 60039, 0, 64680, 64528, 19689, 58117, 19708, 60039, 0, + 60432, 13, 58120, 20134, 60432, 14, 58120, 19701, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 19844, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 1, + 60432, 13, 58120, 19021, 60432, 14, 58120, 19727, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 21, 64528, 0, 65000, 60576, 58120, 0, 64672, 64584, 0, 64680, + 64528, 19748, 58117, 19788, 60039, 23, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 23, + 58120, 22, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 22, 58120, 23, 64528, 0, 65000, 60576, + 58120, 32, 60432, 0, 65000, 60576, 58120, 19804, 60432, 6, 60039, 0, 64680, + 64528, 19811, 58117, 19830, 60039, 0, 60432, 13, 58120, 20040, 60432, 14, + 58120, 19823, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 19844, 60039, 21, + 64528, 0, 65000, 60576, 58120, 0, 64672, 64584, 0, 64680, 64528, 21, 58120, 0, + 64968, 64672, 60040, 54, 60039, 0, 64544, 60040, 60912, 60040, 0, 59336, 2, + 64544, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 25339, 60432, 14, + 58120, 19876, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 58120, 1, 64544, + 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 19900, + 60432, 38, 60039, 0, 64672, 64584, 0, 64680, 64528, 19975, 58117, 2, 64544, + 64528, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 25361, 60432, 14, 58120, 19934, 60432, 95, 60039, 1, 60432, + 13, 58120, 19610, 60432, 14, 58120, 19946, 60432, 95, 60039, 0, 64680, 64528, + 5, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64544, 58120, 19882, 60039, 0, + 64968, 64672, 60040, 54, 60039, 24, 64528, 0, 65000, 60576, 58120, 2, 64544, + 64528, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 26291, 60432, 14, 58120, + 20006, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 24, 64528, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 19850, 60432, 14, 58120, 20029, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 22, + 64528, 0, 65000, 60576, 58120, 352, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 23, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61896, 0, 64680, 64528, 22, 58120, 0, 64968, 64672, 60040, 0, 64680, + 64528, 23, 58120, 0, 64968, 64672, 60040, 0, 64672, 64584, 0, 64680, 64528, + 21, 58120, 22, 64528, 0, 65000, 60576, 58120, 8128, 60432, 0, 65000, 60576, + 58120, 20110, 60432, 6, 60039, 0, 64680, 64528, 20117, 58117, 20128, 60039, + 32, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 22, 58120, 0, 64968, + 64672, 60040, 54, 60039, 21, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 20147, 58117, 20288, 60039, 23, 64528, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 20161, 60432, 22, 60039, 0, 64680, 64528, 20168, 58117, 20210, + 60039, 23, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, + 64528, 60576, 61896, 0, 64680, 64528, 23, 58120, 22, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, + 22, 58120, 20277, 60039, 31, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, + 23, 58120, 22, 64528, 0, 65000, 60576, 58120, 32, 60432, 0, 65000, 60576, + 58120, 20237, 60432, 6, 60039, 0, 64680, 64528, 20244, 58117, 20255, 60039, + 8128, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 22, 58120, 22, 64528, 0, + 65000, 60576, 58120, 321, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61896, 0, 64680, 64528, 22, 58120, 0, 64968, 64672, 60040, 0, 64680, + 64528, 21, 58120, 20300, 60039, 0, 64968, 64672, 60040, 0, 64672, 64584, 0, + 64680, 64528, 21, 58120, 32, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, + 58120, 19021, 60432, 14, 58120, 20318, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 0, 64968, 64672, 60040, 54, 60039, 0, 65000, 60576, 60040, 16384, + 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 27, 58120, 0, 64968, 64672, + 60040, 0, 64672, 64584, 0, 64680, 64528, 28, 58120, 17, 60432, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 5808, 60432, 14, 58120, 20374, 60432, 95, + 60039, 0, 64680, 64528, 29, 58120, 0, 64968, 64672, 60040, 29, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64968, 64672, 61384, 0, + 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 4, 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, + 58120, 16, 60432, 0, 65000, 60576, 58120, 20437, 60432, 38, 60039, 0, 64672, + 64584, 0, 64680, 64528, 20592, 58117, 1, 64544, 64528, 0, 65000, 60576, 58120, + 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, + 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 29, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 1, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61896, 29, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, + 4, 64544, 64528, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61896, 29, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, + 4, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, + 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 4, 64544, 58120, 20420, 60039, 0, 64968, 64672, 60040, + 54, 60039, 0, 65000, 60576, 60040, 1, 64544, 64528, 0, 65000, 60576, 58120, + 8192, 60432, 0, 65000, 60576, 58120, 20619, 60432, 38, 60039, 0, 64672, 64584, + 0, 64680, 64528, 20695, 58117, 1, 64544, 64528, 0, 65000, 60576, 58120, 27, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64968, 64672, + 60040, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 1, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, + 64680, 64528, 1, 64544, 58120, 20602, 60039, 0, 64968, 64672, 60040, 54, + 60039, 28, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 20714, 58117, + 20798, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 27, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 2, 64544, 64528, 0, 65000, 60576, + 58120, 27, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, + 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 2, 64992, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 62792, 0, 64680, 64528, + 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 4, 64544, 58120, 20883, 60039, 2, 64544, 64528, 0, 65000, 60576, + 58120, 27, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 2, + 64544, 64528, 0, 65000, 60576, 58120, 27, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, + 65000, 60576, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64672, 64584, + 0, 64680, 64528, 60576, 61448, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, + 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 0, + 64968, 64672, 60040, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 28, 58120, 0, 64968, 64672, 60040, 54, 60039, 3, 60432, 58256, + 0, 65000, 60576, 60040, 20909, 58113, 2, 64544, 64528, 0, 65000, 60576, 58120, + 0, 64968, 64672, 60040, 20931, 60432, 38, 60039, 2, 64544, 64528, 0, 65000, + 60576, 58120, 511, 60432, 0, 65000, 60576, 58120, 20948, 60432, 22, 60039, 0, + 64680, 64528, 60576, 62792, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 20968, 60432, 38, 60039, 0, 64680, 64528, 60576, 62792, 2, + 64992, 64528, 0, 65000, 60576, 58120, 255, 60432, 0, 65000, 60576, 58120, + 20990, 60432, 22, 60039, 0, 64680, 64528, 60576, 62792, 0, 64680, 64528, + 21002, 58117, 21025, 60039, 7, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, + 58120, 27353, 60432, 14, 58120, 21020, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 16, 60432, 0, 65000, 60576, + 58120, 2, 60432, 13, 58120, 7287, 60432, 14, 58120, 21050, 60432, 95, 60039, + 0, 64680, 64528, 1, 64544, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 1, + 64544, 64528, 0, 65000, 60576, 58120, 16, 60432, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 6822, 60432, 14, 58120, 21088, 60432, 95, 60039, 0, 64680, + 64528, 60576, 61896, 0, 64680, 64528, 1, 64992, 58120, 2, 64992, 64528, 0, + 65000, 60576, 58120, 32, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, + 6822, 60432, 14, 58120, 21124, 60432, 95, 60039, 1, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64992, 60896, + 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, + 65000, 60576, 58120, 29, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, + 58120, 2, 60432, 13, 58120, 20701, 60432, 14, 58120, 21193, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 2, 64992, 60896, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 21219, 58117, 21252, 60039, 2, + 64992, 64528, 0, 65000, 60576, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, + 2, 60432, 13, 58120, 20907, 60432, 14, 58120, 21245, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 21283, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, + 2, 64992, 64528, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 20907, 60432, + 14, 58120, 21278, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, + 64672, 60040, 54, 60039, 11, 60432, 58256, 0, 65000, 60576, 60040, 21291, + 58113, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 21313, + 60432, 38, 60039, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 511, 60432, + 0, 65000, 60576, 58120, 21331, 60432, 22, 60039, 0, 64680, 64528, 60576, + 62792, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 21351, + 60432, 38, 60039, 0, 64680, 64528, 60576, 62792, 2, 64528, 3, 57504, 64528, 0, + 65000, 60576, 58120, 255, 60432, 0, 65000, 60576, 58120, 21375, 60432, 22, + 60039, 0, 64680, 64528, 60576, 62792, 0, 64680, 64528, 21387, 58117, 21410, + 60039, 8, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 27353, 60432, + 14, 58120, 21405, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 2, 64992, + 60896, 64528, 0, 65000, 60576, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 60576, 61896, 1, 60432, 13, 58120, 6774, 60432, 14, 58120, + 21442, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, 2, + 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 2, 64992, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61896, 1, 60432, 13, 58120, 6774, 60432, + 14, 58120, 21483, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 60896, 58120, + 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 1, 64992, 60896, 64528, 0, + 65000, 60576, 58120, 21511, 60432, 38, 60039, 0, 64680, 64528, 1, 64992, + 60896, 60896, 60896, 60896, 60896, 58120, 1, 64528, 6, 57504, 64528, 0, 65000, + 60576, 58120, 2, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 2, 64992, + 64528, 0, 65000, 60576, 58120, 21551, 60432, 38, 60039, 0, 64680, 64528, + 60576, 61448, 1, 64528, 6, 57504, 64528, 0, 65000, 60576, 58120, 0, 64672, + 64584, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 2, 64544, 64528, 0, + 65000, 60576, 58120, 21587, 60432, 38, 60039, 0, 64680, 64528, 60576, 61448, + 0, 64680, 64528, 60576, 62792, 0, 64680, 64528, 21604, 58117, 21698, 60039, 2, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, 64992, 60896, 60896, + 60896, 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 2, 64544, 58120, 1, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 2, 64992, 60896, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 1, 64992, 60896, 60896, 60896, 58120, 2, 64528, 3, 57504, 64528, + 0, 65000, 60576, 58120, 0, 64680, 64528, 2, 64992, 58120, 1, 64528, 4, 57504, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 2, 64992, 60896, 60896, 58120, + 1, 64528, 6, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 21714, + 58117, 21844, 60039, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 1, 64992, 60896, 60896, 60896, 58120, 1, 64992, 60896, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, 1, 64528, + 4, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, 64992, 60896, + 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, 64992, + 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, 64544, + 58120, 2, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 1, 64528, 8, 57488, + 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 2, 64544, 64528, 0, 65000, + 60576, 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 21830, 60432, + 22, 60039, 1, 64528, 7, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, + 21922, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, + 64992, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, + 64544, 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 1, 64528, 8, + 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 2, 64992, 64528, 0, + 65000, 60576, 58120, 2, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 21910, + 60432, 22, 60039, 1, 64528, 7, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, + 58120, 2, 60432, 0, 65000, 60576, 58120, 1, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 21948, 60432, 95, + 60039, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61896, 0, 64680, 64528, 1, 64992, 60896, 60896, 60896, 60896, 58120, 2, + 60432, 0, 65000, 60576, 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, + 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 21998, 60432, 95, 60039, 1, + 64528, 9, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 2, 60432, 0, + 65000, 60576, 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 1, 64528, + 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, 2, + 60432, 13, 58120, 6822, 60432, 14, 58120, 22050, 60432, 95, 60039, 1, 64528, + 10, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 1, 64992, 64528, 0, + 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, 64528, 6, + 57504, 64528, 0, 65000, 60576, 58120, 3, 60432, 13, 58120, 21204, 60432, 14, + 58120, 22097, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 1, 64992, 64528, 0, + 65000, 60576, 58120, 1, 64528, 8, 57504, 64528, 0, 65000, 60576, 58120, 22122, + 60432, 38, 60039, 0, 64672, 64584, 0, 64680, 64528, 22348, 58117, 1, 64528, 5, + 57504, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 22147, 60432, + 38, 60039, 0, 64680, 64528, 22154, 58117, 22189, 60039, 1, 64528, 5, 57504, + 64528, 0, 65000, 60576, 58120, 1, 64528, 9, 57504, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64992, 60896, 60896, + 60896, 60896, 58120, 22284, 60039, 1, 64528, 5, 57504, 64528, 0, 65000, 60576, + 58120, 1, 64528, 10, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61576, 0, 64680, 64528, 1, 64992, 60896, 60896, 60896, 60896, 58120, 1, + 64528, 7, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 22238, 58117, + 22262, 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, + 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 1, 64544, 58120, 22284, 60039, + 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, + 64528, 60576, 61576, 0, 64680, 64528, 1, 64544, 58120, 1, 64992, 64528, 0, + 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, + 64680, 64528, 1, 64992, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 1, + 64544, 64528, 0, 65000, 60576, 58120, 1, 64528, 6, 57504, 64528, 0, 65000, + 60576, 58120, 3, 60432, 13, 58120, 21204, 60432, 14, 58120, 22341, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 22102, 60039, 0, 64968, 64672, 60040, 54, + 60039, 9, 60432, 58256, 0, 65000, 60576, 60040, 22356, 58113, 2, 64544, 64528, + 0, 65000, 60576, 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 22382, + 60432, 22, 60039, 2, 64992, 64528, 0, 65000, 60576, 58120, 2, 64528, 3, 57504, + 64528, 0, 65000, 60576, 58120, 22402, 60432, 22, 60039, 0, 64680, 64528, + 60576, 62792, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, + 22422, 60432, 38, 60039, 0, 64680, 64528, 60576, 62792, 2, 64992, 60896, + 64528, 0, 65000, 60576, 58120, 511, 60432, 0, 65000, 60576, 58120, 22445, + 60432, 22, 60039, 0, 64680, 64528, 60576, 62792, 2, 64992, 64528, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 22465, 60432, 38, 60039, 0, 64680, + 64528, 60576, 62792, 2, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 255, + 60432, 0, 65000, 60576, 58120, 22489, 60432, 22, 60039, 0, 64680, 64528, + 60576, 62792, 0, 64680, 64528, 22501, 58117, 22524, 60039, 9, 60432, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 27353, 60432, 14, 58120, 22519, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 16, + 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 7287, 60432, 14, 58120, + 22549, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 60896, 60896, 58120, 2, + 64544, 64528, 0, 65000, 60576, 58120, 1, 64528, 3, 57504, 64528, 0, 65000, + 60576, 58120, 16, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 6822, + 60432, 14, 58120, 22591, 60432, 95, 60039, 0, 64680, 64528, 60576, 61896, 1, + 64528, 7, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 2, 64992, + 60896, 64528, 0, 65000, 60576, 58120, 16, 60432, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 7287, 60432, 14, 58120, 22634, 60432, 95, 60039, 0, 64680, + 64528, 1, 64992, 60896, 60896, 60896, 58120, 2, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 1, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 16, 60432, 0, + 65000, 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 22678, + 60432, 95, 60039, 0, 64680, 64528, 60576, 61896, 1, 64528, 8, 57488, 13, + 58120, 0, 64680, 64528, 13, 64544, 58120, 1, 64528, 7, 57504, 64528, 0, 65000, + 60576, 58120, 29, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 61384, 0, 64680, 64528, 60576, 61896, 0, 64672, 64584, 0, 64680, + 64528, 1, 64992, 60896, 60896, 60896, 60896, 60896, 58120, 1, 64528, 8, 57504, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, + 61576, 29, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, + 64680, 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, + 64672, 61384, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 1, 64992, 60896, + 60896, 60896, 60896, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 32, + 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, + 22835, 60432, 95, 60039, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64544, 58120, 1, 64528, 4, + 57504, 64528, 0, 65000, 60576, 58120, 1, 64528, 3, 57504, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 1, 64992, 60896, + 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 2, 64528, 3, 57504, 64528, 0, + 65000, 60576, 58120, 22905, 60432, 22, 60039, 0, 64672, 64584, 0, 64672, + 64584, 0, 64680, 64528, 23245, 58117, 1, 64544, 64528, 0, 65000, 60576, 58120, + 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 0, 64680, 64528, 1, 64992, 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 22958, 60432, 6, 60039, 0, 64680, 64528, 22965, + 58117, 23014, 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, 64528, 5, + 57504, 64528, 0, 65000, 60576, 58120, 1, 64528, 6, 57504, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61448, 2, 60432, 13, 58120, 20701, + 60432, 14, 58120, 23007, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 23184, + 60039, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, 64528, 6, 57504, 64528, 0, + 65000, 60576, 58120, 2, 60432, 13, 58120, 20701, 60432, 14, 58120, 23042, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 1, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, + 1, 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, + 65000, 60576, 58120, 23087, 60432, 38, 60039, 0, 64672, 64584, 0, 64680, + 64528, 23151, 58117, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 61384, 0, 64672, 64592, 59336, 2, 60432, 13, 58120, 20701, 60432, 14, 58120, + 23122, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 1, 64544, 64528, 0, 65000, + 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, + 64528, 1, 64544, 58120, 23069, 60039, 1, 64992, 64528, 0, 65000, 60576, 58120, + 1, 64528, 5, 57504, 64528, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 20701, + 60432, 14, 58120, 23179, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 2, + 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, + 60576, 61576, 0, 64680, 64528, 2, 64992, 58120, 1, 64992, 64528, 0, 65000, + 60576, 58120, 32, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61896, 0, 64680, 64528, 1, 64544, 58120, 22885, 60039, 0, 64968, 64672, 60040, + 54, 60039, 11, 60432, 58256, 0, 65000, 60576, 60040, 23253, 58113, 2, 64992, + 64528, 0, 65000, 60576, 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, + 2, 60432, 13, 58120, 8406, 60432, 14, 58120, 23287, 60432, 95, 60039, 1, + 64528, 7, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 2, 64992, + 64528, 0, 65000, 60576, 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, + 2, 60432, 13, 58120, 8359, 60432, 14, 58120, 23326, 60432, 95, 60039, 1, + 64528, 8, 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 2, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64672, 64592, 59336, + 23357, 60432, 22, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 256, 60432, + 0, 65000, 60576, 58120, 23374, 60432, 38, 60039, 0, 64680, 64528, 60576, + 61448, 1, 64528, 7, 57504, 64528, 0, 65000, 60576, 58120, 512, 60432, 0, + 65000, 60576, 58120, 23398, 60432, 38, 60039, 0, 64680, 64528, 60576, 61448, + 1, 64528, 8, 57504, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, + 64672, 64592, 59336, 23424, 60432, 22, 60039, 0, 64680, 64528, 60576, 61448, + 0, 64680, 64528, 23436, 58117, 24145, 60039, 1, 64528, 7, 57504, 64528, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 2, 60432, 13, 58120, 8359, 60432, + 14, 58120, 23461, 60432, 95, 60039, 1, 64528, 7, 57488, 13, 58120, 0, 64680, + 64528, 13, 64544, 58120, 1, 64528, 8, 57504, 64528, 0, 65000, 60576, 58120, + 511, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 8406, 60432, 14, + 58120, 23500, 60432, 95, 60039, 1, 64528, 8, 57488, 13, 58120, 0, 64680, + 64528, 13, 64544, 58120, 1, 64528, 7, 57504, 64528, 0, 65000, 60576, 58120, + 16, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 7287, 60432, 14, + 58120, 23539, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 58120, 1, 64528, 7, + 57504, 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, + 16, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, + 58120, 23579, 60432, 95, 60039, 0, 64680, 64528, 60576, 61896, 1, 64528, 9, + 57488, 13, 58120, 0, 64680, 64528, 13, 64544, 58120, 1, 64528, 8, 57504, + 64528, 0, 65000, 60576, 58120, 16, 60432, 0, 65000, 60576, 58120, 2, 60432, + 13, 58120, 7287, 60432, 14, 58120, 23623, 60432, 95, 60039, 0, 64680, 64528, + 1, 64992, 60896, 58120, 1, 64528, 8, 57504, 64528, 0, 65000, 60576, 58120, 1, + 64992, 60896, 64528, 0, 65000, 60576, 58120, 16, 60432, 0, 65000, 60576, + 58120, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 23665, 60432, 95, 60039, + 0, 64680, 64528, 60576, 61896, 1, 64528, 10, 57488, 13, 58120, 0, 64680, + 64528, 13, 64544, 58120, 1, 64528, 9, 57504, 64528, 0, 65000, 60576, 58120, + 29, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, + 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 61384, 0, 64680, 64528, 60576, 61896, 0, 64672, 64584, 0, 64680, 64528, 1, + 64992, 60896, 60896, 60896, 60896, 58120, 1, 64528, 10, 57504, 64528, 0, + 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, + 29, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, + 64528, 4, 58120, 4, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 61384, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 1, 64992, 60896, 60896, + 60896, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 32, 60432, 0, 65000, + 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 23820, 60432, 95, + 60039, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 0, 64680, 64528, 1, 64544, 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, + 0, 64680, 64528, 1, 64992, 60896, 60896, 60896, 60896, 60896, 58120, 1, 64544, + 64528, 0, 65000, 60576, 58120, 1, 64528, 6, 57504, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64992, 60896, 60896, + 58120, 1, 64528, 6, 57504, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 60040, 23915, 60432, 6, 60039, 0, 64680, 64528, 23922, 58117, 23971, 60039, 1, + 64544, 64528, 0, 65000, 60576, 58120, 1, 64528, 4, 57504, 64528, 0, 65000, + 60576, 58120, 1, 64528, 5, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61448, 2, 60432, 13, 58120, 20701, 60432, 14, 58120, 23964, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 24145, 60039, 1, 64544, 64528, 0, + 65000, 60576, 58120, 1, 64528, 5, 57504, 64528, 0, 65000, 60576, 58120, 2, + 60432, 13, 58120, 20701, 60432, 14, 58120, 23999, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64544, 58120, 1, + 64544, 64528, 0, 65000, 60576, 58120, 1, 64528, 3, 57504, 64528, 0, 65000, + 60576, 58120, 24046, 60432, 38, 60039, 0, 64672, 64584, 0, 64680, 64528, + 24110, 58117, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, + 0, 64672, 64592, 59336, 2, 60432, 13, 58120, 20701, 60432, 14, 58120, 24081, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 1, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, + 1, 64544, 58120, 24026, 60039, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, + 58120, 1, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, + 20701, 60432, 14, 58120, 24140, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 0, 64968, 64672, 60040, 54, 60039, 2, 64992, 64528, 0, 65000, 60576, 58120, 2, + 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, + 2, 64544, 64528, 0, 65000, 60576, 58120, 2, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 2, 64544, 64528, 0, 65000, 60576, + 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61896, 3, 60432, 13, 58120, 23251, 60432, 14, 58120, 24224, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 2, 64528, + 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 2, + 64544, 64528, 0, 65000, 60576, 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61576, 2, 64544, 64528, 0, 65000, 60576, 58120, + 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, + 3, 60432, 13, 58120, 23251, 60432, 14, 58120, 24302, 60432, 95, 60039, 0, + 64680, 64528, 5, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 2, 64992, + 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, 2, 64544, + 64528, 0, 65000, 60576, 58120, 2, 64528, 3, 57504, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61896, 2, 64544, 64528, 0, 65000, 60576, 58120, + 2, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 3, 60432, 13, 58120, 23251, 60432, 14, 58120, 24381, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 2, 64992, + 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 2, 64544, + 64528, 0, 65000, 60576, 58120, 2, 64528, 3, 57504, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 60576, 61896, 2, 64544, 64528, 0, 65000, 60576, 58120, + 2, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 3, 60432, 13, 58120, 23251, 60432, 14, 58120, 24460, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, 54, 60039, 3, 60432, 58256, + 0, 65000, 60576, 60040, 24473, 58113, 2, 64544, 64528, 0, 65000, 60576, 58120, + 0, 64968, 64672, 60040, 24495, 60432, 38, 60039, 2, 64544, 64528, 0, 65000, + 60576, 58120, 511, 60432, 0, 65000, 60576, 58120, 24512, 60432, 22, 60039, 0, + 64680, 64528, 60576, 62792, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 24532, 60432, 38, 60039, 0, 64680, 64528, 60576, 62792, 2, + 64992, 64528, 0, 65000, 60576, 58120, 255, 60432, 0, 65000, 60576, 58120, + 24554, 60432, 22, 60039, 0, 64680, 64528, 60576, 62792, 0, 64680, 64528, + 24566, 58117, 24589, 60039, 12, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, + 58120, 27353, 60432, 14, 58120, 24584, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 2, 64992, 60896, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, 0, 64968, 64672, 60040, + 24617, 60432, 38, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 2, 64992, + 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 511, + 60432, 0, 65000, 60576, 58120, 24647, 60432, 22, 60039, 0, 64680, 64528, + 60576, 62792, 2, 64992, 64528, 0, 65000, 60576, 58120, 2, 64992, 60896, 64528, + 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61896, 0, 64968, 64672, 60040, + 24680, 60432, 38, 60039, 0, 64680, 64528, 60576, 62792, 2, 64992, 64528, 0, + 65000, 60576, 58120, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 255, 60432, 0, 65000, 60576, 58120, 24715, 60432, 22, + 60039, 0, 64680, 64528, 60576, 62792, 0, 64680, 64528, 24727, 58117, 24750, + 60039, 13, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 27353, 60432, + 14, 58120, 24745, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 2, 64992, + 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, 64992, 58120, 0, + 64968, 64672, 61384, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61896, 0, 64680, 64528, 1, 64992, 60896, 58120, 2, 64544, 64528, + 0, 65000, 60576, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 1, 64544, + 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 4, + 60432, 13, 58120, 24151, 60432, 14, 58120, 24828, 60432, 95, 60039, 0, 64680, + 64528, 5, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, + 65000, 60576, 58120, 24851, 60432, 22, 60039, 0, 64672, 64584, 0, 64680, + 64528, 25099, 58117, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 24875, 60432, 38, 60039, 0, 64680, 64528, 24882, 58117, 24940, + 60039, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 2, 60432, 0, 65000, + 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, + 6822, 60432, 14, 58120, 24915, 60432, 95, 60039, 0, 64680, 64528, 60576, + 61576, 3, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, + 64680, 64528, 1, 64992, 60896, 58120, 25030, 60039, 1, 64992, 60896, 64528, 0, + 65000, 60576, 58120, 2, 60432, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, + 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61896, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 24985, 60432, 95, + 60039, 0, 64680, 64528, 60576, 61576, 5, 60432, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64992, 60896, 58120, 1, 64992, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, + 61896, 0, 64680, 64528, 1, 64992, 58120, 1, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, + 1, 64544, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 2, 64992, 64528, 0, + 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 1, 64992, 64528, + 0, 65000, 60576, 58120, 4, 60432, 13, 58120, 24151, 60432, 14, 58120, 25092, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 24833, 60039, 0, 64968, 64672, + 60040, 54, 60039, 3, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 8643, + 60432, 14, 58120, 25123, 60432, 95, 60039, 0, 64680, 64528, 3, 58120, 2, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 25143, 60432, + 38, 60039, 0, 64680, 64528, 25150, 58117, 25173, 60039, 14, 60432, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 27353, 60432, 14, 58120, 25168, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 25188, 60432, 22, 60039, 0, 64680, 64528, 25195, 58117, + 25220, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 5808, 60432, 14, 58120, 25214, 60432, 95, 60039, 0, 64680, 64528, 3, 64992, + 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 64544, + 58120, 0, 64968, 64672, 60040, 0, 64680, 64528, 3, 64992, 60896, 58120, 3, + 64528, 0, 65000, 60576, 58120, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 3, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 60040, 25279, 60432, 22, 60039, 0, 64680, 64528, 25286, 58117, + 25310, 60039, 3, 64992, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 5877, 60432, 14, 58120, 25305, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 3, + 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 9357, 60432, 14, 58120, + 25328, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 64968, 64672, 60040, + 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, + 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 54, 60039, 2, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 2, 64992, 64528, 0, 65000, + 60576, 58120, 0, 64968, 64672, 60040, 25388, 60432, 38, 60039, 2, 64992, + 64528, 0, 65000, 60576, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, + 25407, 60432, 22, 60039, 0, 64680, 64528, 60576, 62792, 2, 64992, 64528, 0, + 65000, 60576, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 25431, + 60432, 6, 60039, 0, 64680, 64528, 60576, 62792, 0, 64680, 64528, 25443, 58117, + 25466, 60039, 15, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 27353, + 60432, 14, 58120, 25461, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 2, + 64992, 64528, 0, 65000, 60576, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, + 65000, 60576, 58120, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 3, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 25526, 60432, 38, 60039, 2, 64992, 64528, 0, 65000, 60576, + 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 25545, 60432, 22, + 60039, 0, 64680, 64528, 60576, 62792, 2, 64992, 64528, 0, 65000, 60576, 58120, + 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 25569, 60432, 6, 60039, 0, + 64680, 64528, 60576, 62792, 0, 64680, 64528, 25581, 58117, 25604, 60039, 16, + 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 27353, 60432, 14, 58120, + 25599, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 2, 64992, 64528, 0, 65000, + 60576, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, + 61576, 2, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 5, + 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 4, 64544, 58120, 0, 64968, 64672, 60040, 54, 60039, 2, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 3, 64992, 60896, 64528, 0, + 65000, 60576, 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 25690, 60432, 6, + 60039, 0, 64680, 64528, 25697, 58117, 25720, 60039, 17, 60432, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 27353, 60432, 14, 58120, 25715, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, + 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, + 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, + 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, + 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 3, 64992, 60896, 58120, 3, + 64528, 0, 65000, 60576, 58120, 54, 60039, 2, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 3, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 25829, 60432, 6, 60039, 0, 64680, 64528, 25836, + 58117, 25859, 60039, 18, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 27353, 60432, 14, 58120, 25854, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, + 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, + 64680, 64528, 60576, 61896, 0, 64680, 64528, 3, 64992, 60896, 58120, 0, 64968, + 64672, 60040, 54, 60039, 5, 60432, 58256, 0, 65000, 60576, 60040, 25891, + 58113, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 3, + 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 25926, + 60432, 6, 60039, 0, 64680, 64528, 25933, 58117, 25939, 60039, 0, 64968, 64672, + 60040, 54, 60039, 0, 64968, 64672, 60040, 0, 64672, 64584, 0, 64680, 64528, 1, + 64992, 60896, 60896, 58120, 0, 64968, 64672, 60040, 3, 64992, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, + 64544, 64528, 0, 65000, 60576, 58120, 45, 60432, 0, 65000, 60576, 58120, + 25992, 60432, 6, 60039, 0, 64680, 64528, 25999, 58117, 26025, 60039, 0, 64968, + 64672, 60040, 0, 64672, 64584, 0, 64680, 64528, 1, 64992, 60896, 60896, 60896, + 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 1, 64544, 58120, 1, 64544, + 64528, 0, 65000, 60576, 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, + 26044, 60432, 38, 60039, 1, 64528, 3, 57504, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61448, 0, 64672, 64584, 0, 64680, 64528, 26249, 58117, 1, + 64544, 64528, 0, 65000, 60576, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, 64544, 64528, 0, + 65000, 60576, 58120, 48, 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, + 60576, 61896, 0, 64680, 64528, 1, 64992, 60896, 58120, 1, 64992, 60896, 64528, + 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 26131, 60432, 38, 60039, 1, + 64992, 60896, 64528, 0, 65000, 60576, 58120, 9, 60432, 0, 65000, 60576, 58120, + 26149, 60432, 22, 60039, 0, 64680, 64528, 60576, 62792, 0, 64672, 64584, 0, + 64680, 64528, 1, 64992, 60896, 60896, 58120, 1, 64528, 3, 57504, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 26181, 58117, 26247, 60039, 1, 64992, + 64528, 0, 65000, 60576, 58120, 10, 60432, 0, 65000, 60576, 58120, 2, 60432, + 13, 58120, 6822, 60432, 14, 58120, 26206, 60432, 95, 60039, 1, 64992, 60896, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, + 1, 64992, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, + 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64544, 58120, 26025, + 60039, 1, 64528, 4, 57504, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, + 26265, 58117, 26282, 60039, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, 64672, + 64592, 59336, 0, 64680, 64528, 1, 64992, 58120, 1, 64992, 64528, 0, 65000, + 60576, 58120, 54, 60039, 4, 60432, 58256, 0, 65000, 60576, 60040, 26293, + 58113, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 3, 58120, 3, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 26327, 60432, 6, + 60039, 0, 64680, 64528, 26334, 58117, 26357, 60039, 19, 60432, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 27353, 60432, 14, 58120, 26352, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 6, 60432, 0, 65000, 60576, 58120, 1, 60432, + 13, 58120, 5808, 60432, 14, 58120, 26375, 60432, 95, 60039, 0, 64680, 64528, + 1, 64992, 60896, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64968, + 64672, 60040, 26397, 60432, 38, 60039, 0, 64680, 64528, 26404, 58117, 26436, + 60039, 0, 64968, 64672, 60040, 0, 64672, 64584, 0, 64680, 64528, 1, 64992, + 60896, 60896, 58120, 2, 64992, 64528, 0, 65000, 60576, 58120, 0, 64672, 64592, + 59336, 0, 64680, 64528, 2, 64992, 58120, 2, 64992, 64528, 0, 65000, 60576, + 58120, 0, 64680, 64528, 1, 64992, 58120, 1, 64992, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 60040, 26464, 60432, 22, 60039, 0, 64672, 64584, 0, + 64680, 64528, 26630, 58117, 2, 64992, 64528, 0, 65000, 60576, 58120, 10, + 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 7287, 60432, 14, 58120, + 26497, 60432, 95, 60039, 0, 64680, 64528, 1, 64992, 58120, 1, 64544, 64528, 0, + 65000, 60576, 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64680, + 64528, 60576, 61576, 48, 60432, 0, 65000, 60576, 58120, 2, 64992, 64528, 0, + 65000, 60576, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 10, 60432, 0, + 65000, 60576, 58120, 2, 60432, 13, 58120, 6822, 60432, 14, 58120, 26561, + 60432, 95, 60039, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, 60576, + 61576, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 1, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, + 64680, 64528, 1, 64544, 58120, 1, 64992, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 2, 64992, 58120, 26449, 60039, 1, 64528, 3, 57504, 64528, 0, + 65000, 60576, 58120, 0, 64680, 64528, 26646, 58117, 26716, 60039, 1, 64544, + 64528, 0, 65000, 60576, 58120, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 60576, 61576, 45, 60432, 0, 65000, 60576, 58120, 0, 64680, + 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, + 0, 64680, 64528, 4, 64544, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 0, + 64968, 64672, 61384, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 1, 64544, + 58120, 3, 64544, 64528, 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, + 60576, 58120, 26734, 60432, 38, 60039, 0, 64680, 64528, 26741, 58117, 26764, + 60039, 19, 60432, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, 27353, 60432, + 14, 58120, 26759, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 1, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 26779, 60432, 6, 60039, + 0, 64680, 64528, 26786, 58117, 26843, 60039, 0, 64968, 64672, 60040, 3, 64992, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 60576, 61576, 48, 60432, 0, + 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, 64528, 4, 58120, 5, + 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, 58120, 0, 64968, + 64672, 61384, 0, 64680, 64528, 3, 64992, 60896, 58120, 27003, 60039, 0, 64968, + 64672, 60040, 0, 64680, 64528, 3, 64992, 60896, 58120, 3, 64992, 60896, 64528, + 0, 65000, 60576, 58120, 1, 64544, 64528, 0, 65000, 60576, 58120, 26873, 60432, + 38, 60039, 0, 64672, 64584, 0, 64680, 64528, 27003, 58117, 3, 64992, 60896, + 64528, 0, 65000, 60576, 58120, 3, 64992, 64528, 0, 65000, 60576, 58120, 0, + 64680, 64528, 60576, 61576, 1, 64544, 64528, 0, 65000, 60576, 58120, 3, 64992, + 60896, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, + 60576, 61576, 0, 64680, 64528, 60576, 61896, 1, 64992, 60896, 64528, 0, 65000, + 60576, 58120, 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 4, 58120, 4, + 64544, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 5, 58120, 0, 64680, + 64528, 4, 58120, 5, 64528, 0, 65000, 60576, 58120, 0, 64680, 64528, 4, 64544, + 58120, 3, 64992, 60896, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 61384, + 0, 64680, 64528, 60576, 61576, 0, 64680, 64528, 3, 64992, 60896, 58120, 26854, + 60039, 1, 64992, 60896, 64528, 0, 65000, 60576, 58120, 1, 60432, 13, 58120, + 5877, 60432, 14, 58120, 27023, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, + 64968, 64672, 60040, 54, 60039, 128, 60432, 0, 65000, 60576, 58120, 54, 60039, + 129, 60432, 0, 65000, 60576, 58120, 54, 60039, 34, 60432, 0, 65000, 60576, + 58120, 54, 60039, 0, 60432, 13, 58120, 8453, 60432, 14, 58120, 27070, 60432, + 95, 60039, 0, 64680, 64528, 5, 58120, 0, 60432, 13, 58120, 6505, 60432, 14, + 58120, 27087, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 60432, 13, + 58120, 20329, 60432, 14, 58120, 27104, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 0, 60432, 13, 58120, 9854, 60432, 14, 58120, 27121, 60432, 95, 60039, + 0, 64680, 64528, 5, 58120, 0, 60432, 13, 58120, 5918, 60432, 14, 58120, 27138, + 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 60432, 13, 58120, 3837, 60432, + 14, 58120, 27155, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 0, 60432, 13, + 58120, 27177, 60432, 14, 58120, 27172, 60432, 95, 60039, 0, 64680, 64528, 5, + 58120, 0, 64968, 64672, 60040, 0, 64672, 64584, 0, 64672, 64584, 0, 64680, + 64528, 27194, 58117, 27177, 60039, 0, 65000, 60576, 60040, 2, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64968, 64672, 60040, 27213, 60432, 38, 60039, 0, + 64680, 64528, 27220, 58117, 27241, 60039, 0, 64968, 64672, 61384, 1, 60432, + 13, 58120, 27353, 60432, 14, 58120, 27236, 60432, 95, 60039, 0, 64680, 64528, + 5, 58120, 2, 64544, 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, + 27256, 60432, 22, 60039, 0, 64672, 64584, 0, 64680, 64528, 27347, 58117, 50, + 60432, 0, 65000, 60576, 58120, 0, 64680, 64528, 1, 64544, 58120, 1, 64544, + 64528, 0, 65000, 60576, 58120, 0, 64968, 64672, 60040, 27291, 60432, 22, + 60039, 0, 64672, 64584, 0, 64680, 64528, 27323, 58117, 1, 64544, 64528, 0, + 65000, 60576, 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61896, 0, + 64680, 64528, 1, 64544, 58120, 27276, 60039, 2, 64544, 64528, 0, 65000, 60576, + 58120, 0, 64968, 64672, 61384, 0, 64680, 64528, 60576, 61896, 0, 64680, 64528, + 2, 64544, 58120, 27241, 60039, 0, 64968, 64672, 60040, 54, 60039, 3, 60432, 0, + 65000, 60576, 58120, 1, 60432, 13, 58120, 25105, 60432, 14, 58120, 27371, + 60432, 95, 60039, 69, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, + 25659, 60432, 14, 58120, 27389, 60432, 95, 60039, 82, 60432, 0, 65000, 60576, + 58120, 2, 60432, 13, 58120, 25659, 60432, 14, 58120, 27407, 60432, 95, 60039, + 82, 60432, 0, 65000, 60576, 58120, 2, 60432, 13, 58120, 25659, 60432, 14, + 58120, 27425, 60432, 95, 60039, 1, 60432, 13, 58120, 19850, 60432, 14, 58120, + 27437, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, 2, 64544, 64528, 0, 65000, + 60576, 58120, 1, 60432, 13, 58120, 19981, 60432, 14, 58120, 27461, 60432, 95, + 60039, 0, 64680, 64528, 5, 58120, 0, 60432, 13, 58120, 27177, 60432, 14, + 58120, 27478, 60432, 95, 60039, 0, 64680, 64528, 5, 58120, +]; diff --git a/web-ide-main/projects/src/samples/project_06/05_fill.ts b/web-ide-main/projects/src/samples/project_06/05_fill.ts new file mode 100644 index 0000000..cce6153 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_06/05_fill.ts @@ -0,0 +1,49 @@ +export const FillAsm = `// Runs an infinite loop that listens to the keyboard input. +// When a key is pressed (any key), the program blackens the screen, +// i.e. writes "black" in every pixel. When no key is pressed, +// the screen should be cleared. + +// initialize variables +(START) // while (true) + @SCREEN + D=A + @i + M=D // i = SCREEN + +(LOOP) // while (i < screen - 1) + @i + D=M + @24575 // screen - 1 + D=A-D + @START + D;JLT // i < screen - 1 (negative check) + @KBD + D=M + @BLACKEN // if (kbd != 0) + D;JNE + +// Clear the screen (write "white" in every pixel) + @i + D=M + A=D + M=0 // write "white" + @CONTINUE + 0;JMP + +(BLACKEN) + @i + D=M + A=D + M=-1 // write "black" + +(CONTINUE) + @i + M=M+1 // i++ + @LOOP + 0;JMP`; + +export const FillHack = [ + 16384, 60432, 16, 58120, 16, 64528, 24575, 57808, 0, 58116, 24576, 64528, 20, + 58117, 16, 64528, 58144, 60040, 24, 60039, 16, 64528, 58144, 61064, 16, 64968, + 4, 60039, +]; diff --git a/web-ide-main/projects/src/samples/project_06/index.ts b/web-ide-main/projects/src/samples/project_06/index.ts new file mode 100644 index 0000000..f733dbe --- /dev/null +++ b/web-ide-main/projects/src/samples/project_06/index.ts @@ -0,0 +1,35 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { AddAsm, AddHack } from "./01_add.js"; +import { MaxAsm, MaxHack, MaxLAsm } from "./02_max.js"; +import { RectAsm, RectHack, RectLAsm } from "./03_rect.js"; +import { PongAsm, PongHack, PongLAsm } from "./04_pong_asm.js"; + +export const FILES = { + "Add.asm": AddAsm, + "Max.asm": MaxAsm, + "MaxL.asm": MaxLAsm, + "Rect.asm": RectAsm, + "RectL.asm": RectLAsm, + "Pong.asm": PongAsm, + "PongL.asm": PongLAsm, +}; + +export const ASM_SOLS: Record = { + "Add.asm": AddHack, + "Max.asm": MaxHack, + "MaxL.asm": MaxHack, + "Rect.asm": RectHack, + "RectL.asm": RectHack, + "Pong.asm": PongHack, + "PongL.asm": PongHack, +}; + +export async function resetFiles(fs: FileSystem): Promise { + await fs.pushd("/projects/06"); + await reset(fs, FILES); + await fs.popd(); +} + +export async function resetTests(fs: FileSystem): Promise { + return; +} diff --git a/web-ide-main/projects/src/samples/project_11/average.ts b/web-ide-main/projects/src/samples/project_11/average.ts new file mode 100644 index 0000000..6279b69 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/average.ts @@ -0,0 +1,439 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Average/Main.jack + +// Inputs some numbers and computes their average +class Main { + function void main() { + var Array a; + var int length; + var int i, sum; + + let length = Keyboard.readInt("How many numbers? "); + let a = Array.new(length); // constructs the array + + let i = 0; + while (i < length) { + let a[i] = Keyboard.readInt("Enter a number: "); + let sum = sum + a[i]; + let i = i + 1; + } + + do Output.printString("The average is "); + do Output.printInt(sum / length); + return; + } +}`; + +export const parsed = { + name: { value: "Main", span: { start: 234, end: 238, line: 7 } }, + varDecs: [], + subroutines: [ + { + type: "function", + returnType: { value: "void", span: { start: 253, end: 258, line: 8 } }, + name: { value: "main", span: { start: 258, end: 262, line: 8 } }, + parameters: [], + body: { + varDecs: [ + { + type: { value: "Array", span: { start: 277, end: 283, line: 9 } }, + names: ["a"], + }, + { + type: { value: "int", span: { start: 297, end: 301, line: 10 } }, + names: ["length"], + }, + { + type: { value: "int", span: { start: 319, end: 323, line: 11 } }, + names: ["i", "sum"], + }, + ], + statements: [ + { + statementType: "letStatement", + name: { value: "length", span: { start: 342, end: 348, line: 13 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Keyboard.readInt", + span: { start: 351, end: 367, line: 13 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "stringLiteral", + value: "How many numbers? ", + }, + rest: [], + }, + ], + span: { start: 351, end: 389, line: 13 }, + }, + rest: [], + }, + span: { start: 338, end: 390, line: 13 }, + }, + { + statementType: "letStatement", + name: { value: "a", span: { start: 401, end: 402, line: 14 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Array.new", + span: { start: 405, end: 414, line: 14 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "length", + span: { start: 415, end: 421, line: 14 }, + }, + rest: [], + }, + ], + span: { start: 405, end: 422, line: 14 }, + }, + rest: [], + }, + span: { start: 397, end: 423, line: 14 }, + }, + { + statementType: "letStatement", + name: { value: "i", span: { start: 464, end: 465, line: 16 } }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 460, end: 470, line: 16 }, + }, + { + statementType: "whileStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "i", + span: { start: 484, end: 485, line: 17 }, + }, + rest: [ + { + op: "<", + term: { + termType: "variable", + name: "length", + span: { start: 488, end: 494, line: 17 }, + }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { value: "a", span: { start: 511, end: 512, line: 18 } }, + arrayIndex: { + nodeType: "expression", + term: { + termType: "variable", + name: "i", + span: { start: 513, end: 514, line: 18 }, + }, + rest: [], + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Keyboard.readInt", + span: { start: 518, end: 534, line: 18 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "stringLiteral", + value: "Enter a number: ", + }, + rest: [], + }, + ], + span: { start: 518, end: 554, line: 18 }, + }, + rest: [], + }, + span: { start: 507, end: 555, line: 18 }, + }, + { + statementType: "letStatement", + name: { + value: "sum", + span: { start: 569, end: 572, line: 19 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "sum", + span: { start: 575, end: 578, line: 19 }, + }, + rest: [ + { + op: "+", + term: { + termType: "arrayAccess", + name: { + value: "a", + span: { start: 581, end: 582, line: 19 }, + }, + index: { + nodeType: "expression", + term: { + termType: "variable", + name: "i", + span: { start: 583, end: 584, line: 19 }, + }, + rest: [], + }, + span: { start: 581, end: 585, line: 19 }, + }, + }, + ], + }, + span: { start: 565, end: 586, line: 19 }, + }, + { + statementType: "letStatement", + name: { value: "i", span: { start: 600, end: 601, line: 20 } }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "i", + span: { start: 604, end: 605, line: 20 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 1 } }, + ], + }, + span: { start: 596, end: 610, line: 20 }, + }, + ], + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printString", + span: { start: 629, end: 647, line: 23 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "stringLiteral", value: "The average is " }, + rest: [], + }, + ], + span: { start: 629, end: 666, line: 23 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printInt", + span: { start: 677, end: 692, line: 24 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "sum", + span: { start: 693, end: 696, line: 24 }, + }, + rest: [ + { + op: "/", + term: { + termType: "variable", + name: "length", + span: { start: 699, end: 705, line: 24 }, + }, + }, + ], + }, + ], + span: { start: 677, end: 706, line: 24 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 714, end: 721, line: 25 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function Main.main 4 + push constant 18 + call String.new 1 + push constant 72 + call String.appendChar 2 + push constant 111 + call String.appendChar 2 + push constant 119 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 109 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 110 + call String.appendChar 2 + push constant 121 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 110 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 109 + call String.appendChar 2 + push constant 98 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 63 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + call Keyboard.readInt 1 + pop local 1 + push local 1 + call Array.new 1 + pop local 0 + push constant 0 + pop local 2 +label Main_0 + push local 2 + push local 1 + lt + not + if-goto Main_1 + push local 2 + push local 0 + add + push constant 16 + call String.new 1 + push constant 69 + call String.appendChar 2 + push constant 110 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 110 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 109 + call String.appendChar 2 + push constant 98 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + call Keyboard.readInt 1 + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + push local 3 + push local 2 + push local 0 + add + pop pointer 1 + push that 0 + add + pop local 3 + push local 2 + push constant 1 + add + pop local 2 + goto Main_0 +label Main_1 + push constant 15 + call String.new 1 + push constant 84 + call String.appendChar 2 + push constant 104 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 118 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 103 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 105 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + call Output.printString 1 + pop temp 0 + push local 3 + push local 1 + call Math.divide 2 + call Output.printInt 1 + pop temp 0 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/project_11/complex_arrays.ts b/web-ide-main/projects/src/samples/project_11/complex_arrays.ts new file mode 100644 index 0000000..942e2bd --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/complex_arrays.ts @@ -0,0 +1,1769 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/ComplexArrays/Main.jack +/** + * Performs several complex array processing tests. + * For each test, the expected result is printed, along with the + * actual result. In each test, the two results should be equal. + */ +class Main { + + function void main() { + var Array a, b, c; + + let a = Array.new(10); + let b = Array.new(5); + let c = Array.new(1); + + let a[3] = 2; + let a[4] = 8; + let a[5] = 4; + let b[a[3]] = a[3] + 3; // b[2] = 5 + let a[b[a[3]]] = a[a[5]] * b[((7 - a[3]) - Main.double(2)) + 1]; // a[5] = 8 * 5 = 40 + let c[0] = null; + let c = c[0]; + + do Output.printString("Test 1: expected result: 5; actual result: "); + do Output.printInt(b[2]); + do Output.println(); + do Output.printString("Test 2: expected result: 40; actual result: "); + do Output.printInt(a[5]); + do Output.println(); + do Output.printString("Test 3: expected result: 0; actual result: "); + do Output.printInt(c); + do Output.println(); + + let c = null; + + if (c = null) { + do Main.fill(a, 10); + let c = a[3]; + let c[1] = 33; + let c = a[7]; + let c[1] = 77; + let b = a[3]; + let b[1] = b[1] + c[1]; // b[1] = 33 + 77 = 110; + } + + do Output.printString("Test 4: expected result: 77; actual result: "); + do Output.printInt(c[1]); + do Output.println(); + do Output.printString("Test 5: expected result: 110; actual result: "); + do Output.printInt(b[1]); + do Output.println(); + return; + } + + function int double(int a) { + return a * 2; + } + + function void fill(Array a, int size) { + while (size > 0) { + let size = size - 1; + let a[size] = Array.new(3); + } + return; + } +}`; + +export const parsed = { + name: { value: "Main", span: { start: 379, end: 383, line: 10 } }, + varDecs: [], + subroutines: [ + { + type: "function", + returnType: { value: "void", span: { start: 400, end: 405, line: 12 } }, + name: { value: "main", span: { start: 405, end: 409, line: 12 } }, + parameters: [], + body: { + varDecs: [ + { + type: { value: "Array", span: { start: 426, end: 432, line: 13 } }, + names: ["a", "b", "c"], + }, + ], + statements: [ + { + statementType: "letStatement", + name: { value: "a", span: { start: 462, end: 463, line: 15 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Array.new", + span: { start: 466, end: 475, line: 15 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 10 }, + rest: [], + }, + ], + span: { start: 466, end: 479, line: 15 }, + }, + rest: [], + }, + span: { start: 458, end: 480, line: 15 }, + }, + { + statementType: "letStatement", + name: { value: "b", span: { start: 493, end: 494, line: 16 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Array.new", + span: { start: 497, end: 506, line: 16 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 5 }, + rest: [], + }, + ], + span: { start: 497, end: 509, line: 16 }, + }, + rest: [], + }, + span: { start: 489, end: 510, line: 16 }, + }, + { + statementType: "letStatement", + name: { value: "c", span: { start: 523, end: 524, line: 17 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Array.new", + span: { start: 527, end: 536, line: 17 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + ], + span: { start: 527, end: 539, line: 17 }, + }, + rest: [], + }, + span: { start: 519, end: 540, line: 17 }, + }, + { + statementType: "letStatement", + name: { value: "a", span: { start: 562, end: 563, line: 19 } }, + arrayIndex: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 3 }, + rest: [], + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 2 }, + rest: [], + }, + span: { start: 558, end: 571, line: 19 }, + }, + { + statementType: "letStatement", + name: { value: "a", span: { start: 584, end: 585, line: 20 } }, + arrayIndex: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 4 }, + rest: [], + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 8 }, + rest: [], + }, + span: { start: 580, end: 593, line: 20 }, + }, + { + statementType: "letStatement", + name: { value: "a", span: { start: 606, end: 607, line: 21 } }, + arrayIndex: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 5 }, + rest: [], + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 4 }, + rest: [], + }, + span: { start: 602, end: 615, line: 21 }, + }, + { + statementType: "letStatement", + name: { value: "b", span: { start: 628, end: 629, line: 22 } }, + arrayIndex: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { value: "a", span: { start: 630, end: 631, line: 22 } }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 3 }, + rest: [], + }, + span: { start: 630, end: 634, line: 22 }, + }, + rest: [], + }, + value: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { value: "a", span: { start: 638, end: 639, line: 22 } }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 3 }, + rest: [], + }, + span: { start: 638, end: 642, line: 22 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 3 } }, + ], + }, + span: { start: 624, end: 647, line: 22 }, + }, + { + statementType: "letStatement", + name: { value: "a", span: { start: 673, end: 674, line: 23 } }, + arrayIndex: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { value: "b", span: { start: 675, end: 676, line: 23 } }, + index: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { + value: "a", + span: { start: 677, end: 678, line: 23 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 3 }, + rest: [], + }, + span: { start: 677, end: 681, line: 23 }, + }, + rest: [], + }, + span: { start: 675, end: 682, line: 23 }, + }, + rest: [], + }, + value: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { value: "a", span: { start: 686, end: 687, line: 23 } }, + index: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { + value: "a", + span: { start: 688, end: 689, line: 23 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 5 }, + rest: [], + }, + span: { start: 688, end: 692, line: 23 }, + }, + rest: [], + }, + span: { start: 686, end: 693, line: 23 }, + }, + rest: [ + { + op: "*", + term: { + termType: "arrayAccess", + name: { + value: "b", + span: { start: 696, end: 697, line: 23 }, + }, + index: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 7 }, + rest: [ + { + op: "-", + term: { + termType: "arrayAccess", + name: { + value: "a", + span: { start: 704, end: 705, line: 23 }, + }, + index: { + nodeType: "expression", + term: { + termType: "numericLiteral", + value: 3, + }, + rest: [], + }, + span: { start: 704, end: 708, line: 23 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "-", + term: { + termType: "subroutineCall", + name: { + value: "Main.double", + span: { start: 712, end: 723, line: 23 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "numericLiteral", + value: 2, + }, + rest: [], + }, + ], + span: { start: 712, end: 726, line: 23 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + span: { start: 696, end: 732, line: 23 }, + }, + }, + ], + }, + span: { start: 669, end: 733, line: 23 }, + }, + { + statementType: "letStatement", + name: { value: "c", span: { start: 768, end: 769, line: 24 } }, + arrayIndex: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "null" }, + rest: [], + }, + span: { start: 764, end: 780, line: 24 }, + }, + { + statementType: "letStatement", + name: { value: "c", span: { start: 793, end: 794, line: 25 } }, + value: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { value: "c", span: { start: 797, end: 798, line: 25 } }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 797, end: 801, line: 25 }, + }, + rest: [], + }, + span: { start: 789, end: 802, line: 25 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printString", + span: { start: 823, end: 841, line: 27 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "stringLiteral", + value: "Test 1: expected result: 5; actual result: ", + }, + rest: [], + }, + ], + span: { start: 823, end: 888, line: 27 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printInt", + span: { start: 901, end: 916, line: 28 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { + value: "b", + span: { start: 917, end: 918, line: 28 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 2 }, + rest: [], + }, + span: { start: 917, end: 921, line: 28 }, + }, + rest: [], + }, + ], + span: { start: 901, end: 922, line: 28 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.println", + span: { start: 935, end: 949, line: 29 }, + }, + parameters: [], + span: { start: 935, end: 951, line: 29 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printString", + span: { start: 964, end: 982, line: 30 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "stringLiteral", + value: "Test 2: expected result: 40; actual result: ", + }, + rest: [], + }, + ], + span: { start: 964, end: 1030, line: 30 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printInt", + span: { start: 1043, end: 1058, line: 31 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { + value: "a", + span: { start: 1059, end: 1060, line: 31 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 5 }, + rest: [], + }, + span: { start: 1059, end: 1063, line: 31 }, + }, + rest: [], + }, + ], + span: { start: 1043, end: 1064, line: 31 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.println", + span: { start: 1077, end: 1091, line: 32 }, + }, + parameters: [], + span: { start: 1077, end: 1093, line: 32 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printString", + span: { start: 1106, end: 1124, line: 33 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "stringLiteral", + value: "Test 3: expected result: 0; actual result: ", + }, + rest: [], + }, + ], + span: { start: 1106, end: 1171, line: 33 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printInt", + span: { start: 1184, end: 1199, line: 34 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "c", + span: { start: 1200, end: 1201, line: 34 }, + }, + rest: [], + }, + ], + span: { start: 1184, end: 1202, line: 34 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.println", + span: { start: 1215, end: 1229, line: 35 }, + }, + parameters: [], + span: { start: 1215, end: 1231, line: 35 }, + }, + }, + { + statementType: "letStatement", + name: { value: "c", span: { start: 1254, end: 1255, line: 37 } }, + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "null" }, + rest: [], + }, + span: { start: 1250, end: 1263, line: 37 }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "c", + span: { start: 1277, end: 1278, line: 39 }, + }, + rest: [ + { + op: "=", + term: { termType: "keywordLiteral", value: "null" }, + }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Main.fill", + span: { start: 1304, end: 1313, line: 40 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "a", + span: { start: 1314, end: 1315, line: 40 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 10 }, + rest: [], + }, + ], + span: { start: 1304, end: 1320, line: 40 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "c", + span: { start: 1338, end: 1339, line: 41 }, + }, + value: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { + value: "a", + span: { start: 1342, end: 1343, line: 41 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 3 }, + rest: [], + }, + span: { start: 1342, end: 1346, line: 41 }, + }, + rest: [], + }, + span: { start: 1334, end: 1347, line: 41 }, + }, + { + statementType: "letStatement", + name: { + value: "c", + span: { start: 1364, end: 1365, line: 42 }, + }, + arrayIndex: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 33 }, + rest: [], + }, + span: { start: 1360, end: 1374, line: 42 }, + }, + { + statementType: "letStatement", + name: { + value: "c", + span: { start: 1391, end: 1392, line: 43 }, + }, + value: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { + value: "a", + span: { start: 1395, end: 1396, line: 43 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 7 }, + rest: [], + }, + span: { start: 1395, end: 1399, line: 43 }, + }, + rest: [], + }, + span: { start: 1387, end: 1400, line: 43 }, + }, + { + statementType: "letStatement", + name: { + value: "c", + span: { start: 1417, end: 1418, line: 44 }, + }, + arrayIndex: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 77 }, + rest: [], + }, + span: { start: 1413, end: 1427, line: 44 }, + }, + { + statementType: "letStatement", + name: { + value: "b", + span: { start: 1444, end: 1445, line: 45 }, + }, + value: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { + value: "a", + span: { start: 1448, end: 1449, line: 45 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 3 }, + rest: [], + }, + span: { start: 1448, end: 1452, line: 45 }, + }, + rest: [], + }, + span: { start: 1440, end: 1453, line: 45 }, + }, + { + statementType: "letStatement", + name: { + value: "b", + span: { start: 1470, end: 1471, line: 46 }, + }, + arrayIndex: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + value: { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { + value: "b", + span: { start: 1477, end: 1478, line: 46 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + span: { start: 1477, end: 1481, line: 46 }, + }, + rest: [ + { + op: "+", + term: { + termType: "arrayAccess", + name: { + value: "c", + span: { start: 1484, end: 1485, line: 46 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + span: { start: 1484, end: 1488, line: 46 }, + }, + }, + ], + }, + span: { start: 1466, end: 1489, line: 46 }, + }, + ], + else: [], + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printString", + span: { start: 1538, end: 1556, line: 49 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "stringLiteral", + value: "Test 4: expected result: 77; actual result: ", + }, + rest: [], + }, + ], + span: { start: 1538, end: 1604, line: 49 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printInt", + span: { start: 1617, end: 1632, line: 50 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { + value: "c", + span: { start: 1633, end: 1634, line: 50 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + span: { start: 1633, end: 1637, line: 50 }, + }, + rest: [], + }, + ], + span: { start: 1617, end: 1638, line: 50 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.println", + span: { start: 1651, end: 1665, line: 51 }, + }, + parameters: [], + span: { start: 1651, end: 1667, line: 51 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printString", + span: { start: 1680, end: 1698, line: 52 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "stringLiteral", + value: "Test 5: expected result: 110; actual result: ", + }, + rest: [], + }, + ], + span: { start: 1680, end: 1747, line: 52 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printInt", + span: { start: 1760, end: 1775, line: 53 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "arrayAccess", + name: { + value: "b", + span: { start: 1776, end: 1777, line: 53 }, + }, + index: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + span: { start: 1776, end: 1780, line: 53 }, + }, + rest: [], + }, + ], + span: { start: 1760, end: 1781, line: 53 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.println", + span: { start: 1794, end: 1808, line: 54 }, + }, + parameters: [], + span: { start: 1794, end: 1810, line: 54 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1820, end: 1827, line: 55 }, + }, + ], + }, + }, + { + type: "function", + returnType: { value: "int", span: { start: 1852, end: 1856, line: 58 } }, + name: { value: "double", span: { start: 1856, end: 1862, line: 58 } }, + parameters: [ + { + type: { value: "int", span: { start: 1863, end: 1867, line: 58 } }, + name: "a", + }, + ], + body: { + varDecs: [], + statements: [ + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "a", + span: { start: 1885, end: 1886, line: 59 }, + }, + rest: [ + { op: "*", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + span: { start: 1878, end: 1891, line: 59 }, + }, + ], + }, + }, + { + type: "function", + returnType: { value: "void", span: { start: 1916, end: 1921, line: 62 } }, + name: { value: "fill", span: { start: 1921, end: 1925, line: 62 } }, + parameters: [ + { + type: { value: "Array", span: { start: 1926, end: 1932, line: 62 } }, + name: "a", + }, + { + type: { value: "int", span: { start: 1935, end: 1939, line: 62 } }, + name: "size", + }, + ], + body: { + varDecs: [], + statements: [ + { + statementType: "whileStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "size", + span: { start: 1962, end: 1966, line: 63 }, + }, + rest: [ + { op: ">", term: { termType: "numericLiteral", value: 0 } }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "size", + span: { start: 1990, end: 1994, line: 64 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "size", + span: { start: 1997, end: 2001, line: 64 }, + }, + rest: [ + { op: "-", term: { termType: "numericLiteral", value: 1 } }, + ], + }, + span: { start: 1986, end: 2006, line: 64 }, + }, + { + statementType: "letStatement", + name: { + value: "a", + span: { start: 2023, end: 2024, line: 65 }, + }, + arrayIndex: { + nodeType: "expression", + term: { + termType: "variable", + name: "size", + span: { start: 2025, end: 2029, line: 65 }, + }, + rest: [], + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Array.new", + span: { start: 2033, end: 2042, line: 65 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 3 }, + rest: [], + }, + ], + span: { start: 2033, end: 2045, line: 65 }, + }, + rest: [], + }, + span: { start: 2019, end: 2046, line: 65 }, + }, + ], + }, + { + statementType: "returnStatement", + span: { start: 2065, end: 2072, line: 67 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function Main.main 3 + push constant 10 + call Array.new 1 + pop local 0 + push constant 5 + call Array.new 1 + pop local 1 + push constant 1 + call Array.new 1 + pop local 2 + push constant 3 + push local 0 + add + push constant 2 + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + push constant 4 + push local 0 + add + push constant 8 + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + push constant 5 + push local 0 + add + push constant 4 + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + push constant 3 + push local 0 + add + pop pointer 1 + push that 0 + push local 1 + add + push constant 3 + push local 0 + add + pop pointer 1 + push that 0 + push constant 3 + add + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + push constant 3 + push local 0 + add + pop pointer 1 + push that 0 + push local 1 + add + pop pointer 1 + push that 0 + push local 0 + add + push constant 5 + push local 0 + add + pop pointer 1 + push that 0 + push local 0 + add + pop pointer 1 + push that 0 + push constant 7 + push constant 3 + push local 0 + add + pop pointer 1 + push that 0 + sub + push constant 2 + call Main.double 1 + sub + push constant 1 + add + push local 1 + add + pop pointer 1 + push that 0 + call Math.multiply 2 + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + push constant 0 + push local 2 + add + push constant 0 + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + push constant 0 + push local 2 + add + pop pointer 1 + push that 0 + pop local 2 + push constant 43 + call String.new 1 + push constant 84 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 49 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 120 + call String.appendChar 2 + push constant 112 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 100 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 53 + call String.appendChar 2 + push constant 59 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + call Output.printString 1 + pop temp 0 + push constant 2 + push local 1 + add + pop pointer 1 + push that 0 + call Output.printInt 1 + pop temp 0 + call Output.println 0 + pop temp 0 + push constant 44 + call String.new 1 + push constant 84 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 50 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 120 + call String.appendChar 2 + push constant 112 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 100 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 52 + call String.appendChar 2 + push constant 48 + call String.appendChar 2 + push constant 59 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + call Output.printString 1 + pop temp 0 + push constant 5 + push local 0 + add + pop pointer 1 + push that 0 + call Output.printInt 1 + pop temp 0 + call Output.println 0 + pop temp 0 + push constant 43 + call String.new 1 + push constant 84 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 51 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 120 + call String.appendChar 2 + push constant 112 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 100 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 48 + call String.appendChar 2 + push constant 59 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + call Output.printString 1 + pop temp 0 + push local 2 + call Output.printInt 1 + pop temp 0 + call Output.println 0 + pop temp 0 + push constant 0 + pop local 2 + push local 2 + push constant 0 + eq + not + if-goto Main_1 + push local 0 + push constant 10 + call Main.fill 2 + pop temp 0 + push constant 3 + push local 0 + add + pop pointer 1 + push that 0 + pop local 2 + push constant 1 + push local 2 + add + push constant 33 + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + push constant 7 + push local 0 + add + pop pointer 1 + push that 0 + pop local 2 + push constant 1 + push local 2 + add + push constant 77 + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + push constant 3 + push local 0 + add + pop pointer 1 + push that 0 + pop local 1 + push constant 1 + push local 1 + add + push constant 1 + push local 1 + add + pop pointer 1 + push that 0 + push constant 1 + push local 2 + add + pop pointer 1 + push that 0 + add + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + goto Main_0 +label Main_1 +label Main_0 + push constant 44 + call String.new 1 + push constant 84 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 52 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 120 + call String.appendChar 2 + push constant 112 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 100 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 55 + call String.appendChar 2 + push constant 55 + call String.appendChar 2 + push constant 59 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + call Output.printString 1 + pop temp 0 + push constant 1 + push local 2 + add + pop pointer 1 + push that 0 + call Output.printInt 1 + pop temp 0 + call Output.println 0 + pop temp 0 + push constant 45 + call String.new 1 + push constant 84 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 53 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 120 + call String.appendChar 2 + push constant 112 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 100 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 49 + call String.appendChar 2 + push constant 49 + call String.appendChar 2 + push constant 48 + call String.appendChar 2 + push constant 59 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 115 + call String.appendChar 2 + push constant 117 + call String.appendChar 2 + push constant 108 + call String.appendChar 2 + push constant 116 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + call Output.printString 1 + pop temp 0 + push constant 1 + push local 1 + add + pop pointer 1 + push that 0 + call Output.printInt 1 + pop temp 0 + call Output.println 0 + pop temp 0 + push constant 0 + return +function Main.double 0 + push argument 0 + push constant 2 + call Math.multiply 2 + return +function Main.fill 0 +label Main_2 + push argument 1 + push constant 0 + gt + not + if-goto Main_3 + push argument 1 + push constant 1 + sub + pop argument 1 + push argument 1 + push argument 0 + add + push constant 3 + call Array.new 1 + pop temp 0 + pop pointer 1 + push temp 0 + pop that 0 + goto Main_2 +label Main_3 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/project_11/convert_to_bin.ts b/web-ide-main/projects/src/samples/project_11/convert_to_bin.ts new file mode 100644 index 0000000..be1296c --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/convert_to_bin.ts @@ -0,0 +1,734 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/ConvertToBin/Main.jack +/** + * Unpacks a 16-bit number into its binary representation: + * Takes the 16-bit number stored in RAM[8000] and stores its individual + * bits in RAM[8001]..RAM[8016] (each location will contain 0 or 1). + * Before the conversion, RAM[8001]..RAM[8016] are initialized to -1. + * + * The program should be tested as follows: + * 1) Load the program into the supplied VM emulator + * 2) Put some value in RAM[8000] + * 3) Switch to "no animation" + * 4) Run the program (give it enough time to run) + * 5) Stop the program + * 6) Check that RAM[8001]..RAM[8016] contain the correct bits, and + * that none of these memory locations contains -1. + */ +class Main { + + /** + * Initializes RAM[8001]..RAM[8016] to -1, + * and converts the value in RAM[8000] to binary. + */ + function void main() { + var int value; + do Main.fillMemory(8001, 16, -1); // sets RAM[8001]..RAM[8016] to -1 + let value = Memory.peek(8000); // Uses an OS routine to read the input + do Main.convert(value); // performs the conversion + return; + } + + /** Converts the given decimal value to binary, and puts + * the resulting bits in RAM[8001]..RAM[8016]. */ + function void convert(int value) { + var int mask, position; + var boolean loop; + + let loop = true; + while (loop) { + let position = position + 1; + let mask = Main.nextMask(mask); + + if (~(position > 16)) { + + if (~((value & mask) = 0)) { + do Memory.poke(8000 + position, 1); + } + else { + do Memory.poke(8000 + position, 0); + } + } + else { + let loop = false; + } + } + return; + } + + /** Returns the next mask (the mask that should follow the given mask). */ + function int nextMask(int mask) { + if (mask = 0) { + return 1; + } + else { + return mask * 2; + } + } + + /** Fills 'length' consecutive memory locations with 'value', + * starting at 'address'. */ + function void fillMemory(int address, int length, int value) { + while (length > 0) { + do Memory.poke(address, value); + let length = length - 1; + let address = address + 1; + } + return; + } +}`; + +export const parsed = { + name: { value: "Main", span: { start: 831, end: 835, line: 20 } }, + varDecs: [], + subroutines: [ + { + type: "function", + returnType: { value: "void", span: { start: 973, end: 978, line: 26 } }, + name: { value: "main", span: { start: 978, end: 982, line: 26 } }, + parameters: [], + body: { + varDecs: [ + { + type: { value: "int", span: { start: 997, end: 1001, line: 27 } }, + names: ["value"], + }, + ], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Main.fillMemory", + span: { start: 1019, end: 1034, line: 28 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 8001 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 16 }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "-", + term: { termType: "numericLiteral", value: 1 }, + }, + rest: [], + }, + ], + span: { start: 1019, end: 1048, line: 28 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "value", + span: { start: 1097, end: 1102, line: 29 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Memory.peek", + span: { start: 1105, end: 1116, line: 29 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 8000 }, + rest: [], + }, + ], + span: { start: 1105, end: 1122, line: 29 }, + }, + rest: [], + }, + span: { start: 1093, end: 1123, line: 29 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Main.convert", + span: { start: 1178, end: 1190, line: 30 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "value", + span: { start: 1191, end: 1196, line: 30 }, + }, + rest: [], + }, + ], + span: { start: 1178, end: 1197, line: 30 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1244, end: 1251, line: 31 }, + }, + ], + }, + }, + { + type: "function", + returnType: { value: "void", span: { start: 1393, end: 1398, line: 36 } }, + name: { value: "convert", span: { start: 1398, end: 1405, line: 36 } }, + parameters: [ + { + type: { value: "int", span: { start: 1406, end: 1410, line: 36 } }, + name: "value", + }, + ], + body: { + varDecs: [ + { + type: { value: "int", span: { start: 1429, end: 1433, line: 37 } }, + names: ["mask", "position"], + }, + { + type: { + value: "boolean", + span: { start: 1459, end: 1467, line: 38 }, + }, + names: ["loop"], + }, + ], + statements: [ + { + statementType: "letStatement", + name: { value: "loop", span: { start: 1490, end: 1494, line: 40 } }, + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + span: { start: 1486, end: 1502, line: 40 }, + }, + { + statementType: "whileStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "loop", + span: { start: 1516, end: 1520, line: 41 }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "position", + span: { start: 1538, end: 1546, line: 42 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "position", + span: { start: 1549, end: 1557, line: 42 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 1 } }, + ], + }, + span: { start: 1534, end: 1562, line: 42 }, + }, + { + statementType: "letStatement", + name: { + value: "mask", + span: { start: 1577, end: 1581, line: 43 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Main.nextMask", + span: { start: 1584, end: 1597, line: 43 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "mask", + span: { start: 1598, end: 1602, line: 43 }, + }, + rest: [], + }, + ], + span: { start: 1584, end: 1603, line: 43 }, + }, + rest: [], + }, + span: { start: 1573, end: 1604, line: 43 }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "position", + span: { start: 1628, end: 1636, line: 45 }, + }, + rest: [ + { + op: ">", + term: { termType: "numericLiteral", value: 16 }, + }, + ], + }, + }, + }, + rest: [], + }, + body: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "value", + span: { start: 1674, end: 1679, line: 47 }, + }, + rest: [ + { + op: "&", + term: { + termType: "variable", + name: "mask", + span: { + start: 1682, + end: 1686, + line: 47, + }, + }, + }, + ], + }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 0 }, + }, + ], + }, + }, + }, + rest: [], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Memory.poke", + span: { start: 1717, end: 1728, line: 48 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 8000 }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "position", + span: { start: 1736, end: 1744, line: 48 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + ], + span: { start: 1717, end: 1748, line: 48 }, + }, + }, + ], + else: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Memory.poke", + span: { start: 1811, end: 1822, line: 51 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 8000 }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "position", + span: { start: 1830, end: 1838, line: 51 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + ], + span: { start: 1811, end: 1842, line: 51 }, + }, + }, + ], + }, + ], + else: [ + { + statementType: "letStatement", + name: { + value: "loop", + span: { start: 1913, end: 1917, line: 55 }, + }, + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + span: { start: 1909, end: 1926, line: 55 }, + }, + ], + }, + ], + }, + { + statementType: "returnStatement", + span: { start: 1953, end: 1960, line: 58 }, + }, + ], + }, + }, + { + type: "function", + returnType: { value: "int", span: { start: 2061, end: 2065, line: 62 } }, + name: { value: "nextMask", span: { start: 2065, end: 2073, line: 62 } }, + parameters: [ + { + type: { value: "int", span: { start: 2074, end: 2078, line: 62 } }, + name: "mask", + }, + ], + body: { + varDecs: [], + statements: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "mask", + span: { start: 2096, end: 2100, line: 63 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 0 } }, + ], + }, + body: [ + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + span: { start: 2118, end: 2127, line: 64 }, + }, + ], + else: [ + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "mask", + span: { start: 2162, end: 2166, line: 67 }, + }, + rest: [ + { op: "*", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + span: { start: 2155, end: 2171, line: 67 }, + }, + ], + }, + ], + }, + }, + { + type: "function", + returnType: { value: "void", span: { start: 2304, end: 2309, line: 73 } }, + name: { value: "fillMemory", span: { start: 2309, end: 2319, line: 73 } }, + parameters: [ + { + type: { value: "int", span: { start: 2320, end: 2324, line: 73 } }, + name: "address", + }, + { + type: { value: "int", span: { start: 2333, end: 2337, line: 73 } }, + name: "length", + }, + { + type: { value: "int", span: { start: 2345, end: 2349, line: 73 } }, + name: "value", + }, + ], + body: { + varDecs: [], + statements: [ + { + statementType: "whileStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "length", + span: { start: 2373, end: 2379, line: 74 }, + }, + rest: [ + { op: ">", term: { termType: "numericLiteral", value: 0 } }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Memory.poke", + span: { start: 2402, end: 2413, line: 75 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "address", + span: { start: 2414, end: 2421, line: 75 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "value", + span: { start: 2423, end: 2428, line: 75 }, + }, + rest: [], + }, + ], + span: { start: 2402, end: 2429, line: 75 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "length", + span: { start: 2447, end: 2453, line: 76 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "length", + span: { start: 2456, end: 2462, line: 76 }, + }, + rest: [ + { op: "-", term: { termType: "numericLiteral", value: 1 } }, + ], + }, + span: { start: 2443, end: 2467, line: 76 }, + }, + { + statementType: "letStatement", + name: { + value: "address", + span: { start: 2484, end: 2491, line: 77 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "address", + span: { start: 2494, end: 2501, line: 77 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 1 } }, + ], + }, + span: { start: 2480, end: 2506, line: 77 }, + }, + ], + }, + { + statementType: "returnStatement", + span: { start: 2525, end: 2532, line: 79 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function Main.main 1 + push constant 8001 + push constant 16 + push constant 1 + neg + call Main.fillMemory 3 + pop temp 0 + push constant 8000 + call Memory.peek 1 + pop local 0 + push local 0 + call Main.convert 1 + pop temp 0 + push constant 0 + return +function Main.convert 3 + push constant 1 + neg + pop local 2 +label Main_0 + push local 2 + not + if-goto Main_1 + push local 1 + push constant 1 + add + pop local 1 + push local 0 + call Main.nextMask 1 + pop local 0 + push local 1 + push constant 16 + gt + not + not + if-goto Main_3 + push argument 0 + push local 0 + and + push constant 0 + eq + not + not + if-goto Main_5 + push constant 8000 + push local 1 + add + push constant 1 + call Memory.poke 2 + pop temp 0 + goto Main_4 +label Main_5 + push constant 8000 + push local 1 + add + push constant 0 + call Memory.poke 2 + pop temp 0 +label Main_4 + goto Main_2 +label Main_3 + push constant 0 + pop local 2 +label Main_2 + goto Main_0 +label Main_1 + push constant 0 + return +function Main.nextMask 0 + push argument 0 + push constant 0 + eq + not + if-goto Main_7 + push constant 1 + return + goto Main_6 +label Main_7 + push argument 0 + push constant 2 + call Math.multiply 2 + return +label Main_6 +function Main.fillMemory 0 +label Main_8 + push argument 1 + push constant 0 + gt + not + if-goto Main_9 + push argument 0 + push argument 2 + call Memory.poke 2 + pop temp 0 + push argument 1 + push constant 1 + sub + pop argument 1 + push argument 0 + push constant 1 + add + pop argument 0 + goto Main_8 +label Main_9 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/project_11/index.ts b/web-ide-main/projects/src/samples/project_11/index.ts new file mode 100644 index 0000000..bf295d8 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/index.ts @@ -0,0 +1,29 @@ +import * as average from "./average.js"; +import * as complex_arrays from "./complex_arrays.js"; +import * as convert_to_bin from "./convert_to_bin.js"; +import * as pong_ball from "./pong/ball.js"; +import * as pong_bat from "./pong/bat.js"; +import * as pong_main from "./pong/main.js"; +import * as pong_game from "./pong/pong_game.js"; +import * as seven from "./seven.js"; +import * as square_main from "./square/main.js"; +import * as square from "./square/square.js"; +import * as square_game from "./square/square_game.js"; + +type Program = Record< + string, + { jack: string; parsed: unknown; compiled: string } +>; +export const Programs: Record = { + average: { Main: average }, + complex_arrays: { Main: complex_arrays }, + convert_to_bin: { Main: convert_to_bin }, + pong: { + Ball: pong_ball, + Bat: pong_bat, + PongGame: pong_game, + Main: pong_main, + }, + seven: { Main: seven }, + square: { Square: square, Main: square_main, SquareGame: square_game }, +}; diff --git a/web-ide-main/projects/src/samples/project_11/pong/ball.ts b/web-ide-main/projects/src/samples/project_11/pong/ball.ts new file mode 100644 index 0000000..789f1c9 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/pong/ball.ts @@ -0,0 +1,2960 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Pong/Ball.jack +// (Same as projects/9/Pong/Ball.jack) +/** + * A graphical ball in a Pong game. Characterized by a screen location and + * distance of last destination. Has methods for drawing, erasing and moving + * on the screen. The ball is displayed as a filled, 6-by-6 pixles rectangle. + */ +class Ball { + + field int x, y; // the ball's screen location (in pixels) + field int lengthx, lengthy; // distance of last destination (in pixels) + + field int d, straightD, diagonalD; // used for straight line movement computation + field boolean invert, positivex, positivey; // (same) + + field int leftWall, rightWall, topWall, bottomWall; // wall locations + + field int wall; // last wall that the ball was bounced off of + + /** Constructs a new ball with the given initial location and wall locations. */ + constructor Ball new(int Ax, int Ay, + int AleftWall, int ArightWall, int AtopWall, int AbottomWall) { + let x = Ax; + let y = Ay; + let leftWall = AleftWall; + let rightWall = ArightWall - 6; // -6 for ball size + let topWall = AtopWall; + let bottomWall = AbottomWall - 6; // -6 for ball size + let wall = 0; + do show(); + return this; + } + + /** Deallocates the Ball's memory. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Shows the ball. */ + method void show() { + do Screen.setColor(true); + do draw(); + return; + } + + /** Hides the ball. */ + method void hide() { + do Screen.setColor(false); + do draw(); + return; + } + + /** Draws the ball. */ + method void draw() { + do Screen.drawRectangle(x, y, x + 5, y + 5); + return; + } + + /** Returns the ball's left edge. */ + method int getLeft() { + return x; + } + + /** Returns the ball's right edge. */ + method int getRight() { + return x + 5; + } + + /** Computes and sets the ball's destination. */ + method void setDestination(int destx, int desty) { + var int dx, dy, temp; + let lengthx = destx - x; + let lengthy = desty - y; + let dx = Math.abs(lengthx); + let dy = Math.abs(lengthy); + let invert = (dx < dy); + + if (invert) { + let temp = dx; // swap dx, dy + let dx = dy; + let dy = temp; + let positivex = (y < desty); + let positivey = (x < destx); + } + else { + let positivex = (x < destx); + let positivey = (y < desty); + } + + let d = (2 * dy) - dx; + let straightD = 2 * dy; + let diagonalD = 2 * (dy - dx); + + return; + } + + /** + * Moves the ball one step towards its destination. + * If the ball has reached a wall, returns 0. + * Else, returns a value according to the wall: + * 1 (left wall), 2 (right wall), 3 (top wall), 4 (bottom wall). + */ + method int move() { + + do hide(); + + if (d < 0) { let d = d + straightD; } + else { + let d = d + diagonalD; + + if (positivey) { + if (invert) { let x = x + 4; } + else { let y = y + 4; } + } + else { + if (invert) { let x = x - 4; } + else { let y = y - 4; } + } + } + + if (positivex) { + if (invert) { let y = y + 4; } + else { let x = x + 4; } + } + else { + if (invert) { let y = y - 4; } + else { let x = x - 4; } + } + + if (~(x > leftWall)) { + let wall = 1; + let x = leftWall; + } + if (~(x < rightWall)) { + let wall = 2; + let x = rightWall; + } + if (~(y > topWall)) { + let wall = 3; + let y = topWall; + } + if (~(y < bottomWall)) { + let wall = 4; + let y = bottomWall; + } + + do show(); + + return wall; + } + + /** + * Bounces off the current wall: sets the new destination + * of the ball according to the ball's angle and the given + * bouncing direction (-1/0/1=left/center/right or up/center/down). + */ + method void bounce(int bouncingDirection) { + var int newx, newy, divLengthx, divLengthy, factor; + + // Since results are too big, divides by 10 + let divLengthx = lengthx / 10; + let divLengthy = lengthy / 10; + if (bouncingDirection = 0) { let factor = 10; } + else { + if (((~(lengthx < 0)) & (bouncingDirection = 1)) | ((lengthx < 0) & (bouncingDirection = (-1)))) { + let factor = 20; // bounce direction is in ball direction + } + else { let factor = 5; } // bounce direction is against ball direction + } + + if (wall = 1) { + let newx = 506; + let newy = (divLengthy * (-50)) / divLengthx; + let newy = y + (newy * factor); + } + else { + if (wall = 2) { + let newx = 0; + let newy = (divLengthy * 50) / divLengthx; + let newy = y + (newy * factor); + } + else { + if (wall = 3) { + let newy = 250; + let newx = (divLengthx * (-25)) / divLengthy; + let newx = x + (newx * factor); + } + else { // assumes wall = 4 + let newy = 0; + let newx = (divLengthx * 25) / divLengthy; + let newx = x + (newx * factor); + } + } + } + + do setDestination(newx, newy); + return; + } +}`; + +export const parsed = { + name: { value: "Ball", span: { start: 459, end: 463, line: 11 } }, + varDecs: [ + { + varType: "field", + type: { value: "int", span: { start: 477, end: 481, line: 13 } }, + names: ["x", "y"], + }, + { + varType: "field", + type: { value: "int", span: { start: 553, end: 557, line: 14 } }, + names: ["lengthx", "lengthy"], + }, + { + varType: "field", + type: { value: "int", span: { start: 632, end: 636, line: 16 } }, + names: ["d", "straightD", "diagonalD"], + }, + { + varType: "field", + type: { value: "boolean", span: { start: 720, end: 728, line: 17 } }, + names: ["invert", "positivex", "positivey"], + }, + { + varType: "field", + type: { value: "int", span: { start: 784, end: 788, line: 19 } }, + names: ["leftWall", "rightWall", "topWall", "bottomWall"], + }, + { + varType: "field", + type: { value: "int", span: { start: 863, end: 867, line: 21 } }, + names: ["wall"], + }, + ], + subroutines: [ + { + type: "constructor", + returnType: { value: "Ball", span: { start: 1023, end: 1028, line: 24 } }, + name: { value: "new", span: { start: 1028, end: 1031, line: 24 } }, + parameters: [ + { + type: { value: "int", span: { start: 1032, end: 1036, line: 24 } }, + name: "Ax", + }, + { + type: { value: "int", span: { start: 1040, end: 1044, line: 24 } }, + name: "Ay", + }, + { + type: { value: "int", span: { start: 1073, end: 1077, line: 25 } }, + name: "AleftWall", + }, + { + type: { value: "int", span: { start: 1088, end: 1092, line: 25 } }, + name: "ArightWall", + }, + { + type: { value: "int", span: { start: 1104, end: 1108, line: 25 } }, + name: "AtopWall", + }, + { + type: { value: "int", span: { start: 1118, end: 1122, line: 25 } }, + name: "AbottomWall", + }, + ], + body: { + varDecs: [], + statements: [ + { + statementType: "letStatement", + name: { value: "x", span: { start: 1152, end: 1153, line: 26 } }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "Ax", + span: { start: 1156, end: 1158, line: 26 }, + }, + rest: [], + }, + span: { start: 1148, end: 1159, line: 26 }, + }, + { + statementType: "letStatement", + name: { value: "y", span: { start: 1172, end: 1173, line: 27 } }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "Ay", + span: { start: 1176, end: 1178, line: 27 }, + }, + rest: [], + }, + span: { start: 1168, end: 1179, line: 27 }, + }, + { + statementType: "letStatement", + name: { + value: "leftWall", + span: { start: 1190, end: 1198, line: 28 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "AleftWall", + span: { start: 1201, end: 1210, line: 28 }, + }, + rest: [], + }, + span: { start: 1186, end: 1211, line: 28 }, + }, + { + statementType: "letStatement", + name: { + value: "rightWall", + span: { start: 1222, end: 1231, line: 29 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "ArightWall", + span: { start: 1234, end: 1244, line: 29 }, + }, + rest: [ + { op: "-", term: { termType: "numericLiteral", value: 6 } }, + ], + }, + span: { start: 1218, end: 1249, line: 29 }, + }, + { + statementType: "letStatement", + name: { + value: "topWall", + span: { start: 1283, end: 1290, line: 30 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "AtopWall", + span: { start: 1293, end: 1301, line: 30 }, + }, + rest: [], + }, + span: { start: 1279, end: 1302, line: 30 }, + }, + { + statementType: "letStatement", + name: { + value: "bottomWall", + span: { start: 1314, end: 1324, line: 31 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "AbottomWall", + span: { start: 1327, end: 1338, line: 31 }, + }, + rest: [ + { op: "-", term: { termType: "numericLiteral", value: 6 } }, + ], + }, + span: { start: 1310, end: 1343, line: 31 }, + }, + { + statementType: "letStatement", + name: { value: "wall", span: { start: 1375, end: 1379, line: 32 } }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 1371, end: 1384, line: 32 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "show", + span: { start: 1396, end: 1400, line: 33 }, + }, + parameters: [], + span: { start: 1396, end: 1402, line: 33 }, + }, + }, + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "this" }, + rest: [], + }, + span: { start: 1412, end: 1424, line: 34 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1485, end: 1490, line: 38 } }, + name: { value: "dispose", span: { start: 1490, end: 1497, line: 38 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Memory.deAlloc", + span: { start: 1513, end: 1527, line: 39 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "this" }, + rest: [], + }, + ], + span: { start: 1513, end: 1533, line: 39 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1543, end: 1550, line: 40 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1596, end: 1601, line: 44 } }, + name: { value: "show", span: { start: 1601, end: 1605, line: 44 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 1621, end: 1636, line: 45 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + ], + span: { start: 1621, end: 1642, line: 45 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "draw", + span: { start: 1655, end: 1659, line: 46 }, + }, + parameters: [], + span: { start: 1655, end: 1661, line: 46 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1671, end: 1678, line: 47 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1724, end: 1729, line: 51 } }, + name: { value: "hide", span: { start: 1729, end: 1733, line: 51 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 1749, end: 1764, line: 52 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + ], + span: { start: 1749, end: 1771, line: 52 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "draw", + span: { start: 1782, end: 1786, line: 53 }, + }, + parameters: [], + span: { start: 1782, end: 1788, line: 53 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1798, end: 1805, line: 54 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1851, end: 1856, line: 58 } }, + name: { value: "draw", span: { start: 1856, end: 1860, line: 58 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 1874, end: 1894, line: 59 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 1895, end: 1896, line: 59 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 1898, end: 1899, line: 59 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 1901, end: 1902, line: 59 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 5 } }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 1908, end: 1909, line: 59 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 5 } }, + ], + }, + ], + span: { start: 1874, end: 1914, line: 59 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1922, end: 1929, line: 60 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "int", span: { start: 1989, end: 1993, line: 64 } }, + name: { value: "getLeft", span: { start: 1993, end: 2000, line: 64 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2020, end: 2021, line: 65 }, + }, + rest: [], + }, + span: { start: 2013, end: 2022, line: 65 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "int", span: { start: 2083, end: 2087, line: 69 } }, + name: { value: "getRight", span: { start: 2087, end: 2095, line: 69 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2115, end: 2116, line: 70 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 5 } }, + ], + }, + span: { start: 2108, end: 2121, line: 70 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 2193, end: 2198, line: 74 } }, + name: { + value: "setDestination", + span: { start: 2198, end: 2212, line: 74 }, + }, + parameters: [ + { + type: { value: "int", span: { start: 2213, end: 2217, line: 74 } }, + name: "destx", + }, + { + type: { value: "int", span: { start: 2224, end: 2228, line: 74 } }, + name: "desty", + }, + ], + body: { + varDecs: [ + { + type: { value: "int", span: { start: 2249, end: 2253, line: 75 } }, + names: ["dx", "dy", "temp"], + }, + ], + statements: [ + { + statementType: "letStatement", + name: { + value: "lengthx", + span: { start: 2279, end: 2286, line: 76 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "destx", + span: { start: 2289, end: 2294, line: 76 }, + }, + rest: [ + { + op: "-", + term: { + termType: "variable", + name: "x", + span: { start: 2297, end: 2298, line: 76 }, + }, + }, + ], + }, + span: { start: 2275, end: 2299, line: 76 }, + }, + { + statementType: "letStatement", + name: { + value: "lengthy", + span: { start: 2310, end: 2317, line: 77 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "desty", + span: { start: 2320, end: 2325, line: 77 }, + }, + rest: [ + { + op: "-", + term: { + termType: "variable", + name: "y", + span: { start: 2328, end: 2329, line: 77 }, + }, + }, + ], + }, + span: { start: 2306, end: 2330, line: 77 }, + }, + { + statementType: "letStatement", + name: { value: "dx", span: { start: 2343, end: 2345, line: 78 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Math.abs", + span: { start: 2348, end: 2356, line: 78 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "lengthx", + span: { start: 2357, end: 2364, line: 78 }, + }, + rest: [], + }, + ], + span: { start: 2348, end: 2365, line: 78 }, + }, + rest: [], + }, + span: { start: 2339, end: 2366, line: 78 }, + }, + { + statementType: "letStatement", + name: { value: "dy", span: { start: 2379, end: 2381, line: 79 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Math.abs", + span: { start: 2384, end: 2392, line: 79 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "lengthy", + span: { start: 2393, end: 2400, line: 79 }, + }, + rest: [], + }, + ], + span: { start: 2384, end: 2401, line: 79 }, + }, + rest: [], + }, + span: { start: 2375, end: 2402, line: 79 }, + }, + { + statementType: "letStatement", + name: { + value: "invert", + span: { start: 2415, end: 2421, line: 80 }, + }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "dx", + span: { start: 2425, end: 2427, line: 80 }, + }, + rest: [ + { + op: "<", + term: { + termType: "variable", + name: "dy", + span: { start: 2430, end: 2432, line: 80 }, + }, + }, + ], + }, + }, + rest: [], + }, + span: { start: 2411, end: 2434, line: 80 }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "invert", + span: { start: 2448, end: 2454, line: 82 }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "temp", + span: { start: 2474, end: 2478, line: 83 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "dx", + span: { start: 2481, end: 2483, line: 83 }, + }, + rest: [], + }, + span: { start: 2470, end: 2484, line: 83 }, + }, + { + statementType: "letStatement", + name: { + value: "dx", + span: { start: 2516, end: 2518, line: 84 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "dy", + span: { start: 2521, end: 2523, line: 84 }, + }, + rest: [], + }, + span: { start: 2512, end: 2524, line: 84 }, + }, + { + statementType: "letStatement", + name: { + value: "dy", + span: { start: 2541, end: 2543, line: 85 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "temp", + span: { start: 2546, end: 2550, line: 85 }, + }, + rest: [], + }, + span: { start: 2537, end: 2551, line: 85 }, + }, + { + statementType: "letStatement", + name: { + value: "positivex", + span: { start: 2569, end: 2578, line: 86 }, + }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2582, end: 2583, line: 86 }, + }, + rest: [ + { + op: "<", + term: { + termType: "variable", + name: "desty", + span: { start: 2586, end: 2591, line: 86 }, + }, + }, + ], + }, + }, + rest: [], + }, + span: { start: 2565, end: 2593, line: 86 }, + }, + { + statementType: "letStatement", + name: { + value: "positivey", + span: { start: 2610, end: 2619, line: 87 }, + }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2623, end: 2624, line: 87 }, + }, + rest: [ + { + op: "<", + term: { + termType: "variable", + name: "destx", + span: { start: 2627, end: 2632, line: 87 }, + }, + }, + ], + }, + }, + rest: [], + }, + span: { start: 2606, end: 2634, line: 87 }, + }, + ], + else: [ + { + statementType: "letStatement", + name: { + value: "positivex", + span: { start: 2674, end: 2683, line: 90 }, + }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2687, end: 2688, line: 90 }, + }, + rest: [ + { + op: "<", + term: { + termType: "variable", + name: "destx", + span: { start: 2691, end: 2696, line: 90 }, + }, + }, + ], + }, + }, + rest: [], + }, + span: { start: 2670, end: 2698, line: 90 }, + }, + { + statementType: "letStatement", + name: { + value: "positivey", + span: { start: 2715, end: 2724, line: 91 }, + }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2728, end: 2729, line: 91 }, + }, + rest: [ + { + op: "<", + term: { + termType: "variable", + name: "desty", + span: { start: 2732, end: 2737, line: 91 }, + }, + }, + ], + }, + }, + rest: [], + }, + span: { start: 2711, end: 2739, line: 91 }, + }, + ], + }, + { + statementType: "letStatement", + name: { value: "d", span: { start: 2763, end: 2764, line: 94 } }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 2 }, + rest: [ + { + op: "*", + term: { + termType: "variable", + name: "dy", + span: { start: 2772, end: 2774, line: 94 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "-", + term: { + termType: "variable", + name: "dx", + span: { start: 2778, end: 2780, line: 94 }, + }, + }, + ], + }, + span: { start: 2759, end: 2781, line: 94 }, + }, + { + statementType: "letStatement", + name: { + value: "straightD", + span: { start: 2794, end: 2803, line: 95 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 2 }, + rest: [ + { + op: "*", + term: { + termType: "variable", + name: "dy", + span: { start: 2810, end: 2812, line: 95 }, + }, + }, + ], + }, + span: { start: 2790, end: 2813, line: 95 }, + }, + { + statementType: "letStatement", + name: { + value: "diagonalD", + span: { start: 2826, end: 2835, line: 96 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 2 }, + rest: [ + { + op: "*", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "dy", + span: { start: 2843, end: 2845, line: 96 }, + }, + rest: [ + { + op: "-", + term: { + termType: "variable", + name: "dx", + span: { start: 2848, end: 2850, line: 96 }, + }, + }, + ], + }, + }, + }, + ], + }, + span: { start: 2822, end: 2852, line: 96 }, + }, + { + statementType: "returnStatement", + span: { start: 2860, end: 2867, line: 98 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "int", span: { start: 3129, end: 3133, line: 107 } }, + name: { value: "move", span: { start: 3133, end: 3137, line: 107 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "hide", + span: { start: 3152, end: 3156, line: 109 }, + }, + parameters: [], + span: { start: 3152, end: 3158, line: 109 }, + }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "d", + span: { start: 3173, end: 3174, line: 111 }, + }, + rest: [ + { op: "<", term: { termType: "numericLiteral", value: 0 } }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "d", + span: { start: 3186, end: 3187, line: 111 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "d", + span: { start: 3190, end: 3191, line: 111 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "straightD", + span: { start: 3194, end: 3203, line: 111 }, + }, + }, + ], + }, + span: { start: 3182, end: 3204, line: 111 }, + }, + ], + else: [ + { + statementType: "letStatement", + name: { + value: "d", + span: { start: 3238, end: 3239, line: 113 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "d", + span: { start: 3242, end: 3243, line: 113 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "diagonalD", + span: { start: 3246, end: 3255, line: 113 }, + }, + }, + ], + }, + span: { start: 3234, end: 3256, line: 113 }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "positivey", + span: { start: 3274, end: 3283, line: 115 }, + }, + rest: [], + }, + body: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "invert", + span: { start: 3307, end: 3313, line: 116 }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 3321, end: 3322, line: 116 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3325, end: 3326, line: 116 }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 4 }, + }, + ], + }, + span: { start: 3317, end: 3331, line: 116 }, + }, + ], + else: [ + { + statementType: "letStatement", + name: { + value: "y", + span: { start: 3361, end: 3362, line: 117 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 3365, end: 3366, line: 117 }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 4 }, + }, + ], + }, + span: { start: 3357, end: 3371, line: 117 }, + }, + ], + }, + ], + else: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "invert", + span: { start: 3427, end: 3433, line: 120 }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 3441, end: 3442, line: 120 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3445, end: 3446, line: 120 }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 4 }, + }, + ], + }, + span: { start: 3437, end: 3451, line: 120 }, + }, + ], + else: [ + { + statementType: "letStatement", + name: { + value: "y", + span: { start: 3481, end: 3482, line: 121 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 3485, end: 3486, line: 121 }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 4 }, + }, + ], + }, + span: { start: 3477, end: 3491, line: 121 }, + }, + ], + }, + ], + }, + ], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "positivex", + span: { start: 3529, end: 3538, line: 125 }, + }, + rest: [], + }, + body: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "invert", + span: { start: 3558, end: 3564, line: 126 }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "y", + span: { start: 3572, end: 3573, line: 126 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 3576, end: 3577, line: 126 }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 4 }, + }, + ], + }, + span: { start: 3568, end: 3582, line: 126 }, + }, + ], + else: [ + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 3608, end: 3609, line: 127 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3612, end: 3613, line: 127 }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 4 }, + }, + ], + }, + span: { start: 3604, end: 3618, line: 127 }, + }, + ], + }, + ], + else: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "invert", + span: { start: 3658, end: 3664, line: 130 }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "y", + span: { start: 3672, end: 3673, line: 130 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 3676, end: 3677, line: 130 }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 4 }, + }, + ], + }, + span: { start: 3668, end: 3682, line: 130 }, + }, + ], + else: [ + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 3708, end: 3709, line: 131 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3712, end: 3713, line: 131 }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 4 }, + }, + ], + }, + span: { start: 3704, end: 3718, line: 131 }, + }, + ], + }, + ], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3742, end: 3743, line: 134 }, + }, + rest: [ + { + op: ">", + term: { + termType: "variable", + name: "leftWall", + span: { start: 3746, end: 3754, line: 134 }, + }, + }, + ], + }, + }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "wall", + span: { start: 3773, end: 3777, line: 135 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + span: { start: 3769, end: 3782, line: 135 }, + }, + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 3801, end: 3802, line: 136 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "leftWall", + span: { start: 3805, end: 3813, line: 136 }, + }, + rest: [], + }, + span: { start: 3797, end: 3814, line: 136 }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3837, end: 3838, line: 138 }, + }, + rest: [ + { + op: "<", + term: { + termType: "variable", + name: "rightWall", + span: { start: 3841, end: 3850, line: 138 }, + }, + }, + ], + }, + }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "wall", + span: { start: 3869, end: 3873, line: 139 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 2 }, + rest: [], + }, + span: { start: 3865, end: 3878, line: 139 }, + }, + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 3897, end: 3898, line: 140 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "rightWall", + span: { start: 3901, end: 3910, line: 140 }, + }, + rest: [], + }, + span: { start: 3893, end: 3911, line: 140 }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 3934, end: 3935, line: 142 }, + }, + rest: [ + { + op: ">", + term: { + termType: "variable", + name: "topWall", + span: { start: 3938, end: 3945, line: 142 }, + }, + }, + ], + }, + }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "wall", + span: { start: 3966, end: 3970, line: 143 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 3 }, + rest: [], + }, + span: { start: 3962, end: 3975, line: 143 }, + }, + { + statementType: "letStatement", + name: { + value: "y", + span: { start: 3994, end: 3995, line: 144 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "topWall", + span: { start: 3998, end: 4005, line: 144 }, + }, + rest: [], + }, + span: { start: 3990, end: 4006, line: 144 }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 4031, end: 4032, line: 146 }, + }, + rest: [ + { + op: "<", + term: { + termType: "variable", + name: "bottomWall", + span: { start: 4035, end: 4045, line: 146 }, + }, + }, + ], + }, + }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "wall", + span: { start: 4066, end: 4070, line: 147 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 4 }, + rest: [], + }, + span: { start: 4062, end: 4075, line: 147 }, + }, + { + statementType: "letStatement", + name: { + value: "y", + span: { start: 4094, end: 4095, line: 148 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "bottomWall", + span: { start: 4098, end: 4108, line: 148 }, + }, + rest: [], + }, + span: { start: 4090, end: 4109, line: 148 }, + }, + ], + else: [], + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "show", + span: { start: 4130, end: 4134, line: 151 }, + }, + parameters: [], + span: { start: 4130, end: 4136, line: 151 }, + }, + }, + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "wall", + span: { start: 4152, end: 4156, line: 153 }, + }, + rest: [], + }, + span: { start: 4145, end: 4157, line: 153 }, + }, + ], + }, + }, + { + type: "method", + returnType: { + value: "void", + span: { start: 4389, end: 4394, line: 161 }, + }, + name: { value: "bounce", span: { start: 4394, end: 4400, line: 161 } }, + parameters: [ + { + type: { value: "int", span: { start: 4401, end: 4405, line: 161 } }, + name: "bouncingDirection", + }, + ], + body: { + varDecs: [ + { + type: { value: "int", span: { start: 4438, end: 4442, line: 162 } }, + names: ["newx", "newy", "divLengthx", "divLengthy", "factor"], + }, + ], + statements: [ + { + statementType: "letStatement", + name: { + value: "divLengthx", + span: { start: 4549, end: 4559, line: 165 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "lengthx", + span: { start: 4562, end: 4569, line: 165 }, + }, + rest: [ + { op: "/", term: { termType: "numericLiteral", value: 10 } }, + ], + }, + span: { start: 4545, end: 4575, line: 165 }, + }, + { + statementType: "letStatement", + name: { + value: "divLengthy", + span: { start: 4588, end: 4598, line: 166 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "lengthy", + span: { start: 4601, end: 4608, line: 166 }, + }, + rest: [ + { op: "/", term: { termType: "numericLiteral", value: 10 } }, + ], + }, + span: { start: 4584, end: 4614, line: 166 }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "bouncingDirection", + span: { start: 4625, end: 4642, line: 167 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 0 } }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "factor", + span: { start: 4654, end: 4660, line: 167 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 10 }, + rest: [], + }, + span: { start: 4650, end: 4666, line: 167 }, + }, + ], + else: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "lengthx", + span: { start: 4700, end: 4707, line: 169 }, + }, + rest: [ + { + op: "<", + term: { + termType: "numericLiteral", + value: 0, + }, + }, + ], + }, + }, + }, + rest: [], + }, + }, + rest: [ + { + op: "&", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "bouncingDirection", + span: { start: 4717, end: 4734, line: 169 }, + }, + rest: [ + { + op: "=", + term: { + termType: "numericLiteral", + value: 1, + }, + }, + ], + }, + }, + }, + ], + }, + }, + rest: [ + { + op: "|", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "lengthx", + span: { start: 4745, end: 4752, line: 169 }, + }, + rest: [ + { + op: "<", + term: { + termType: "numericLiteral", + value: 0, + }, + }, + ], + }, + }, + rest: [ + { + op: "&", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "bouncingDirection", + span: { start: 4761, end: 4778, line: 169 }, + }, + rest: [ + { + op: "=", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "-", + term: { + termType: "numericLiteral", + value: 1, + }, + }, + rest: [], + }, + }, + }, + ], + }, + }, + }, + ], + }, + }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "factor", + span: { start: 4811, end: 4817, line: 170 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 20 }, + rest: [], + }, + span: { start: 4807, end: 4823, line: 170 }, + }, + ], + else: [ + { + statementType: "letStatement", + name: { + value: "factor", + span: { start: 4900, end: 4906, line: 172 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 5 }, + rest: [], + }, + span: { start: 4896, end: 4911, line: 172 }, + }, + ], + }, + ], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "wall", + span: { start: 4979, end: 4983, line: 175 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 1 } }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "newx", + span: { start: 5005, end: 5009, line: 176 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 506 }, + rest: [], + }, + span: { start: 5001, end: 5016, line: 176 }, + }, + { + statementType: "letStatement", + name: { + value: "newy", + span: { start: 5031, end: 5035, line: 177 }, + }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "divLengthy", + span: { start: 5039, end: 5049, line: 177 }, + }, + rest: [ + { + op: "*", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "-", + term: { termType: "numericLiteral", value: 50 }, + }, + rest: [], + }, + }, + }, + ], + }, + }, + rest: [ + { + op: "/", + term: { + termType: "variable", + name: "divLengthx", + span: { start: 5061, end: 5071, line: 177 }, + }, + }, + ], + }, + span: { start: 5027, end: 5072, line: 177 }, + }, + { + statementType: "letStatement", + name: { + value: "newy", + span: { start: 5089, end: 5093, line: 178 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 5096, end: 5097, line: 178 }, + }, + rest: [ + { + op: "+", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "newy", + span: { start: 5101, end: 5105, line: 178 }, + }, + rest: [ + { + op: "*", + term: { + termType: "variable", + name: "factor", + span: { start: 5108, end: 5114, line: 178 }, + }, + }, + ], + }, + }, + }, + ], + }, + span: { start: 5085, end: 5116, line: 178 }, + }, + ], + else: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "wall", + span: { start: 5156, end: 5160, line: 181 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "newx", + span: { start: 5188, end: 5192, line: 182 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 5184, end: 5197, line: 182 }, + }, + { + statementType: "letStatement", + name: { + value: "newy", + span: { start: 5218, end: 5222, line: 183 }, + }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "divLengthy", + span: { start: 5226, end: 5236, line: 183 }, + }, + rest: [ + { + op: "*", + term: { termType: "numericLiteral", value: 50 }, + }, + ], + }, + }, + rest: [ + { + op: "/", + term: { + termType: "variable", + name: "divLengthx", + span: { start: 5245, end: 5255, line: 183 }, + }, + }, + ], + }, + span: { start: 5214, end: 5256, line: 183 }, + }, + { + statementType: "letStatement", + name: { + value: "newy", + span: { start: 5277, end: 5281, line: 184 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 5284, end: 5285, line: 184 }, + }, + rest: [ + { + op: "+", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "newy", + span: { start: 5289, end: 5293, line: 184 }, + }, + rest: [ + { + op: "*", + term: { + termType: "variable", + name: "factor", + span: { start: 5296, end: 5302, line: 184 }, + }, + }, + ], + }, + }, + }, + ], + }, + span: { start: 5273, end: 5304, line: 184 }, + }, + ], + else: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "wall", + span: { start: 5354, end: 5358, line: 187 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 3 }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "newy", + span: { start: 5386, end: 5390, line: 188 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 250 }, + rest: [], + }, + span: { start: 5382, end: 5397, line: 188 }, + }, + { + statementType: "letStatement", + name: { + value: "newx", + span: { start: 5418, end: 5422, line: 189 }, + }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "divLengthx", + span: { start: 5426, end: 5436, line: 189 }, + }, + rest: [ + { + op: "*", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "-", + term: { + termType: "numericLiteral", + value: 25, + }, + }, + rest: [], + }, + }, + }, + ], + }, + }, + rest: [ + { + op: "/", + term: { + termType: "variable", + name: "divLengthy", + span: { start: 5448, end: 5458, line: 189 }, + }, + }, + ], + }, + span: { start: 5414, end: 5459, line: 189 }, + }, + { + statementType: "letStatement", + name: { + value: "newx", + span: { start: 5484, end: 5488, line: 190 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 5491, end: 5492, line: 190 }, + }, + rest: [ + { + op: "+", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "newx", + span: { start: 5496, end: 5500, line: 190 }, + }, + rest: [ + { + op: "*", + term: { + termType: "variable", + name: "factor", + span: { + start: 5503, + end: 5509, + line: 190, + }, + }, + }, + ], + }, + }, + }, + ], + }, + span: { start: 5480, end: 5511, line: 190 }, + }, + ], + else: [ + { + statementType: "letStatement", + name: { + value: "newy", + span: { start: 5589, end: 5593, line: 193 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 5585, end: 5598, line: 193 }, + }, + { + statementType: "letStatement", + name: { + value: "newx", + span: { start: 5619, end: 5623, line: 194 }, + }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "divLengthx", + span: { start: 5627, end: 5637, line: 194 }, + }, + rest: [ + { + op: "*", + term: { + termType: "numericLiteral", + value: 25, + }, + }, + ], + }, + }, + rest: [ + { + op: "/", + term: { + termType: "variable", + name: "divLengthy", + span: { start: 5646, end: 5656, line: 194 }, + }, + }, + ], + }, + span: { start: 5615, end: 5657, line: 194 }, + }, + { + statementType: "letStatement", + name: { + value: "newx", + span: { start: 5682, end: 5686, line: 195 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 5689, end: 5690, line: 195 }, + }, + rest: [ + { + op: "+", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "newx", + span: { start: 5694, end: 5698, line: 195 }, + }, + rest: [ + { + op: "*", + term: { + termType: "variable", + name: "factor", + span: { + start: 5701, + end: 5707, + line: 195, + }, + }, + }, + ], + }, + }, + }, + ], + }, + span: { start: 5678, end: 5709, line: 195 }, + }, + ], + }, + ], + }, + ], + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "setDestination", + span: { start: 5760, end: 5774, line: 200 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "newx", + span: { start: 5775, end: 5779, line: 200 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "newy", + span: { start: 5781, end: 5785, line: 200 }, + }, + rest: [], + }, + ], + span: { start: 5760, end: 5786, line: 200 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 5796, end: 5803, line: 201 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function Ball.new 0 + push constant 15 + call Memory.alloc 1 + pop pointer 0 + push argument 0 + pop this 0 + push argument 1 + pop this 1 + push argument 2 + pop this 10 + push argument 3 + push constant 6 + sub + pop this 11 + push argument 4 + pop this 12 + push argument 5 + push constant 6 + sub + pop this 13 + push constant 0 + pop this 14 + push pointer 0 + call Ball.show 1 + pop temp 0 + push pointer 0 + return +function Ball.dispose 0 + push argument 0 + pop pointer 0 + push pointer 0 + call Memory.deAlloc 1 + pop temp 0 + push constant 0 + return +function Ball.show 0 + push argument 0 + pop pointer 0 + push constant 1 + neg + call Screen.setColor 1 + pop temp 0 + push pointer 0 + call Ball.draw 1 + pop temp 0 + push constant 0 + return +function Ball.hide 0 + push argument 0 + pop pointer 0 + push constant 0 + call Screen.setColor 1 + pop temp 0 + push pointer 0 + call Ball.draw 1 + pop temp 0 + push constant 0 + return +function Ball.draw 0 + push argument 0 + pop pointer 0 + push this 0 + push this 1 + push this 0 + push constant 5 + add + push this 1 + push constant 5 + add + call Screen.drawRectangle 4 + pop temp 0 + push constant 0 + return +function Ball.getLeft 0 + push argument 0 + pop pointer 0 + push this 0 + return +function Ball.getRight 0 + push argument 0 + pop pointer 0 + push this 0 + push constant 5 + add + return +function Ball.setDestination 3 + push argument 0 + pop pointer 0 + push argument 1 + push this 0 + sub + pop this 2 + push argument 2 + push this 1 + sub + pop this 3 + push this 2 + call Math.abs 1 + pop local 0 + push this 3 + call Math.abs 1 + pop local 1 + push local 0 + push local 1 + lt + pop this 7 + push this 7 + not + if-goto Ball_1 + push local 0 + pop local 2 + push local 1 + pop local 0 + push local 2 + pop local 1 + push this 1 + push argument 2 + lt + pop this 8 + push this 0 + push argument 1 + lt + pop this 9 + goto Ball_0 +label Ball_1 + push this 0 + push argument 1 + lt + pop this 8 + push this 1 + push argument 2 + lt + pop this 9 +label Ball_0 + push constant 2 + push local 1 + call Math.multiply 2 + push local 0 + sub + pop this 4 + push constant 2 + push local 1 + call Math.multiply 2 + pop this 5 + push constant 2 + push local 1 + push local 0 + sub + call Math.multiply 2 + pop this 6 + push constant 0 + return +function Ball.move 0 + push argument 0 + pop pointer 0 + push pointer 0 + call Ball.hide 1 + pop temp 0 + push this 4 + push constant 0 + lt + not + if-goto Ball_3 + push this 4 + push this 5 + add + pop this 4 + goto Ball_2 +label Ball_3 + push this 4 + push this 6 + add + pop this 4 + push this 9 + not + if-goto Ball_5 + push this 7 + not + if-goto Ball_7 + push this 0 + push constant 4 + add + pop this 0 + goto Ball_6 +label Ball_7 + push this 1 + push constant 4 + add + pop this 1 +label Ball_6 + goto Ball_4 +label Ball_5 + push this 7 + not + if-goto Ball_9 + push this 0 + push constant 4 + sub + pop this 0 + goto Ball_8 +label Ball_9 + push this 1 + push constant 4 + sub + pop this 1 +label Ball_8 +label Ball_4 +label Ball_2 + push this 8 + not + if-goto Ball_11 + push this 7 + not + if-goto Ball_13 + push this 1 + push constant 4 + add + pop this 1 + goto Ball_12 +label Ball_13 + push this 0 + push constant 4 + add + pop this 0 +label Ball_12 + goto Ball_10 +label Ball_11 + push this 7 + not + if-goto Ball_15 + push this 1 + push constant 4 + sub + pop this 1 + goto Ball_14 +label Ball_15 + push this 0 + push constant 4 + sub + pop this 0 +label Ball_14 +label Ball_10 + push this 0 + push this 10 + gt + not + not + if-goto Ball_17 + push constant 1 + pop this 14 + push this 10 + pop this 0 + goto Ball_16 +label Ball_17 +label Ball_16 + push this 0 + push this 11 + lt + not + not + if-goto Ball_19 + push constant 2 + pop this 14 + push this 11 + pop this 0 + goto Ball_18 +label Ball_19 +label Ball_18 + push this 1 + push this 12 + gt + not + not + if-goto Ball_21 + push constant 3 + pop this 14 + push this 12 + pop this 1 + goto Ball_20 +label Ball_21 +label Ball_20 + push this 1 + push this 13 + lt + not + not + if-goto Ball_23 + push constant 4 + pop this 14 + push this 13 + pop this 1 + goto Ball_22 +label Ball_23 +label Ball_22 + push pointer 0 + call Ball.show 1 + pop temp 0 + push this 14 + return +function Ball.bounce 5 + push argument 0 + pop pointer 0 + push this 2 + push constant 10 + call Math.divide 2 + pop local 2 + push this 3 + push constant 10 + call Math.divide 2 + pop local 3 + push argument 1 + push constant 0 + eq + not + if-goto Ball_25 + push constant 10 + pop local 4 + goto Ball_24 +label Ball_25 + push this 2 + push constant 0 + lt + not + push argument 1 + push constant 1 + eq + and + push this 2 + push constant 0 + lt + push argument 1 + push constant 1 + neg + eq + and + or + not + if-goto Ball_27 + push constant 20 + pop local 4 + goto Ball_26 +label Ball_27 + push constant 5 + pop local 4 +label Ball_26 +label Ball_24 + push this 14 + push constant 1 + eq + not + if-goto Ball_29 + push constant 506 + pop local 0 + push local 3 + push constant 50 + neg + call Math.multiply 2 + push local 2 + call Math.divide 2 + pop local 1 + push this 1 + push local 1 + push local 4 + call Math.multiply 2 + add + pop local 1 + goto Ball_28 +label Ball_29 + push this 14 + push constant 2 + eq + not + if-goto Ball_31 + push constant 0 + pop local 0 + push local 3 + push constant 50 + call Math.multiply 2 + push local 2 + call Math.divide 2 + pop local 1 + push this 1 + push local 1 + push local 4 + call Math.multiply 2 + add + pop local 1 + goto Ball_30 +label Ball_31 + push this 14 + push constant 3 + eq + not + if-goto Ball_33 + push constant 250 + pop local 1 + push local 2 + push constant 25 + neg + call Math.multiply 2 + push local 3 + call Math.divide 2 + pop local 0 + push this 0 + push local 0 + push local 4 + call Math.multiply 2 + add + pop local 0 + goto Ball_32 +label Ball_33 + push constant 0 + pop local 1 + push local 2 + push constant 25 + call Math.multiply 2 + push local 3 + call Math.divide 2 + pop local 0 + push this 0 + push local 0 + push local 4 + call Math.multiply 2 + add + pop local 0 +label Ball_32 +label Ball_30 +label Ball_28 + push pointer 0 + push local 0 + push local 1 + call Ball.setDestination 3 + pop temp 0 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/project_11/pong/bat.ts b/web-ide-main/projects/src/samples/project_11/pong/bat.ts new file mode 100644 index 0000000..fb8188a --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/pong/bat.ts @@ -0,0 +1,1373 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Pong/Bat.jack +// (Same as projects/9/Pong/Bat.jack) +/** + * A graphical bat in a Pong game. + * Displayed as a filled horizontal rectangle that has a screen location, + * a width and a height. + * Has methods for drawing, erasing, moving left and right, and changing + * its width (to make the hitting action more challenging). + * This class should have been called "Paddle", following the + * standard Pong terminology. Unaware of this terminology, + * we called it "bat", and the name stuck. + */ +class Bat { + + field int x, y; // the bat's screen location + field int width, height; // the bat's width and height + field int direction; // direction of the bat's movement + // (1 = left, 2 = right) + + /** Constructs a new bat with the given location and width. */ + constructor Bat new(int Ax, int Ay, int Awidth, int Aheight) { + let x = Ax; + let y = Ay; + let width = Awidth; + let height = Aheight; + let direction = 2; + do show(); + return this; + } + + /** Deallocates the object's memory. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Shows the bat. */ + method void show() { + do Screen.setColor(true); + do draw(); + return; + } + + /** Hides the bat. */ + method void hide() { + do Screen.setColor(false); + do draw(); + return; + } + + /** Draws the bat. */ + method void draw() { + do Screen.drawRectangle(x, y, x + width, y + height); + return; + } + + /** Sets the bat's direction (0=stop, 1=left, 2=right). */ + method void setDirection(int Adirection) { + let direction = Adirection; + return; + } + + /** Returns the bat's left edge. */ + method int getLeft() { + return x; + } + + /** Returns the bat's right edge. */ + method int getRight() { + return x + width; + } + + /** Sets the bat's width. */ + method void setWidth(int Awidth) { + do hide(); + let width = Awidth; + do show(); + return; + } + + /** Moves the bat one step in the bat's direction. */ + method void move() { + if (direction = 1) { + let x = x - 4; + if (x < 0) { let x = 0; } + do Screen.setColor(false); + do Screen.drawRectangle((x + width) + 1, y, (x + width) + 4, y + height); + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + 3, y + height); + } + else { + let x = x + 4; + if ((x + width) > 511) { let x = 511 - width; } + do Screen.setColor(false); + do Screen.drawRectangle(x - 4, y, x - 1, y + height); + do Screen.setColor(true); + do Screen.drawRectangle((x + width) - 3, y, x + width, y + height); + } + return; + } +}`; + +export const parsed = { + name: { value: "Bat", span: { start: 660, end: 663, line: 16 } }, + varDecs: [ + { + varType: "field", + type: { value: "int", span: { start: 677, end: 681, line: 18 } }, + names: ["x", "y"], + }, + { + varType: "field", + type: { value: "int", span: { start: 736, end: 740, line: 19 } }, + names: ["width", "height"], + }, + { + varType: "field", + type: { value: "int", span: { start: 796, end: 800, line: 20 } }, + names: ["direction"], + }, + ], + subroutines: [ + { + type: "constructor", + returnType: { value: "Bat", span: { start: 991, end: 995, line: 24 } }, + name: { value: "new", span: { start: 995, end: 998, line: 24 } }, + parameters: [ + { + type: { value: "int", span: { start: 999, end: 1003, line: 24 } }, + name: "Ax", + }, + { + type: { value: "int", span: { start: 1007, end: 1011, line: 24 } }, + name: "Ay", + }, + { + type: { value: "int", span: { start: 1015, end: 1019, line: 24 } }, + name: "Awidth", + }, + { + type: { value: "int", span: { start: 1027, end: 1031, line: 24 } }, + name: "Aheight", + }, + ], + body: { + varDecs: [], + statements: [ + { + statementType: "letStatement", + name: { value: "x", span: { start: 1054, end: 1055, line: 25 } }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "Ax", + span: { start: 1058, end: 1060, line: 25 }, + }, + rest: [], + }, + span: { start: 1050, end: 1061, line: 25 }, + }, + { + statementType: "letStatement", + name: { value: "y", span: { start: 1074, end: 1075, line: 26 } }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "Ay", + span: { start: 1078, end: 1080, line: 26 }, + }, + rest: [], + }, + span: { start: 1070, end: 1081, line: 26 }, + }, + { + statementType: "letStatement", + name: { + value: "width", + span: { start: 1094, end: 1099, line: 27 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "Awidth", + span: { start: 1102, end: 1108, line: 27 }, + }, + rest: [], + }, + span: { start: 1090, end: 1109, line: 27 }, + }, + { + statementType: "letStatement", + name: { + value: "height", + span: { start: 1122, end: 1128, line: 28 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "Aheight", + span: { start: 1131, end: 1138, line: 28 }, + }, + rest: [], + }, + span: { start: 1118, end: 1139, line: 28 }, + }, + { + statementType: "letStatement", + name: { + value: "direction", + span: { start: 1152, end: 1161, line: 29 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 2 }, + rest: [], + }, + span: { start: 1148, end: 1166, line: 29 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "show", + span: { start: 1178, end: 1182, line: 30 }, + }, + parameters: [], + span: { start: 1178, end: 1184, line: 30 }, + }, + }, + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "this" }, + rest: [], + }, + span: { start: 1194, end: 1206, line: 31 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1269, end: 1274, line: 35 } }, + name: { value: "dispose", span: { start: 1274, end: 1281, line: 35 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Memory.deAlloc", + span: { start: 1297, end: 1311, line: 36 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "this" }, + rest: [], + }, + ], + span: { start: 1297, end: 1317, line: 36 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1327, end: 1334, line: 37 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1379, end: 1384, line: 41 } }, + name: { value: "show", span: { start: 1384, end: 1388, line: 41 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 1404, end: 1419, line: 42 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + ], + span: { start: 1404, end: 1425, line: 42 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "draw", + span: { start: 1438, end: 1442, line: 43 }, + }, + parameters: [], + span: { start: 1438, end: 1444, line: 43 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1454, end: 1461, line: 44 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1506, end: 1511, line: 48 } }, + name: { value: "hide", span: { start: 1511, end: 1515, line: 48 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 1531, end: 1546, line: 49 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + ], + span: { start: 1531, end: 1553, line: 49 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "draw", + span: { start: 1566, end: 1570, line: 50 }, + }, + parameters: [], + span: { start: 1566, end: 1572, line: 50 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1582, end: 1589, line: 51 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1634, end: 1639, line: 55 } }, + name: { value: "draw", span: { start: 1639, end: 1643, line: 55 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 1659, end: 1679, line: 56 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 1680, end: 1681, line: 56 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 1683, end: 1684, line: 56 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 1686, end: 1687, line: 56 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "width", + span: { start: 1690, end: 1695, line: 56 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 1697, end: 1698, line: 56 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "height", + span: { start: 1701, end: 1707, line: 56 }, + }, + }, + ], + }, + ], + span: { start: 1659, end: 1708, line: 56 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1718, end: 1725, line: 57 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1807, end: 1812, line: 61 } }, + name: { + value: "setDirection", + span: { start: 1812, end: 1824, line: 61 }, + }, + parameters: [ + { + type: { value: "int", span: { start: 1825, end: 1829, line: 61 } }, + name: "Adirection", + }, + ], + body: { + varDecs: [], + statements: [ + { + statementType: "letStatement", + name: { + value: "direction", + span: { start: 1855, end: 1864, line: 62 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "Adirection", + span: { start: 1867, end: 1877, line: 62 }, + }, + rest: [], + }, + span: { start: 1851, end: 1878, line: 62 }, + }, + { + statementType: "returnStatement", + span: { start: 1887, end: 1894, line: 63 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "int", span: { start: 1953, end: 1957, line: 67 } }, + name: { value: "getLeft", span: { start: 1957, end: 1964, line: 67 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 1984, end: 1985, line: 68 }, + }, + rest: [], + }, + span: { start: 1977, end: 1986, line: 68 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "int", span: { start: 2046, end: 2050, line: 72 } }, + name: { value: "getRight", span: { start: 2050, end: 2058, line: 72 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2078, end: 2079, line: 73 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "width", + span: { start: 2082, end: 2087, line: 73 }, + }, + }, + ], + }, + span: { start: 2071, end: 2088, line: 73 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 2140, end: 2145, line: 77 } }, + name: { value: "setWidth", span: { start: 2145, end: 2153, line: 77 } }, + parameters: [ + { + type: { value: "int", span: { start: 2154, end: 2158, line: 77 } }, + name: "Awidth", + }, + ], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "hide", + span: { start: 2179, end: 2183, line: 78 }, + }, + parameters: [], + span: { start: 2179, end: 2185, line: 78 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "width", + span: { start: 2199, end: 2204, line: 79 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "Awidth", + span: { start: 2207, end: 2213, line: 79 }, + }, + rest: [], + }, + span: { start: 2195, end: 2214, line: 79 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "show", + span: { start: 2226, end: 2230, line: 80 }, + }, + parameters: [], + span: { start: 2226, end: 2232, line: 80 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 2242, end: 2249, line: 81 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 2326, end: 2331, line: 85 } }, + name: { value: "move", span: { start: 2331, end: 2335, line: 85 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "direction", + span: { start: 2350, end: 2359, line: 86 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 1 } }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 2383, end: 2384, line: 87 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2387, end: 2388, line: 87 }, + }, + rest: [ + { op: "-", term: { termType: "numericLiteral", value: 4 } }, + ], + }, + span: { start: 2379, end: 2393, line: 87 }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2410, end: 2411, line: 88 }, + }, + rest: [ + { op: "<", term: { termType: "numericLiteral", value: 0 } }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 2423, end: 2424, line: 88 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 2419, end: 2429, line: 88 }, + }, + ], + else: [], + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 2447, end: 2462, line: 89 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + ], + span: { start: 2447, end: 2469, line: 89 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 2486, end: 2506, line: 90 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2508, end: 2509, line: 90 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "width", + span: { start: 2512, end: 2517, line: 90 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2524, end: 2525, line: 90 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2528, end: 2529, line: 90 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "width", + span: { start: 2532, end: 2537, line: 90 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 4 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2544, end: 2545, line: 90 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "height", + span: { start: 2548, end: 2554, line: 90 }, + }, + }, + ], + }, + ], + span: { start: 2486, end: 2555, line: 90 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 2572, end: 2587, line: 91 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + ], + span: { start: 2572, end: 2593, line: 91 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 2610, end: 2630, line: 92 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2631, end: 2632, line: 92 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2634, end: 2635, line: 92 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2637, end: 2638, line: 92 }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 3 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2644, end: 2645, line: 92 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "height", + span: { start: 2648, end: 2654, line: 92 }, + }, + }, + ], + }, + ], + span: { start: 2610, end: 2655, line: 92 }, + }, + }, + ], + else: [ + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 2698, end: 2699, line: 95 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2702, end: 2703, line: 95 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 4 } }, + ], + }, + span: { start: 2694, end: 2708, line: 95 }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2726, end: 2727, line: 96 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "width", + span: { start: 2730, end: 2735, line: 96 }, + }, + }, + ], + }, + }, + rest: [ + { + op: ">", + term: { termType: "numericLiteral", value: 511 }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 2750, end: 2751, line: 96 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 511 }, + rest: [ + { + op: "-", + term: { + termType: "variable", + name: "width", + span: { start: 2760, end: 2765, line: 96 }, + }, + }, + ], + }, + span: { start: 2746, end: 2766, line: 96 }, + }, + ], + else: [], + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 2784, end: 2799, line: 97 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + ], + span: { start: 2784, end: 2806, line: 97 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 2823, end: 2843, line: 98 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2844, end: 2845, line: 98 }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 4 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2851, end: 2852, line: 98 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2854, end: 2855, line: 98 }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2861, end: 2862, line: 98 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "height", + span: { start: 2865, end: 2871, line: 98 }, + }, + }, + ], + }, + ], + span: { start: 2823, end: 2872, line: 98 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 2889, end: 2904, line: 99 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + ], + span: { start: 2889, end: 2910, line: 99 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 2927, end: 2947, line: 100 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2949, end: 2950, line: 100 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "width", + span: { start: 2953, end: 2958, line: 100 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 3 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2965, end: 2966, line: 100 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2968, end: 2969, line: 100 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "width", + span: { start: 2972, end: 2977, line: 100 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2979, end: 2980, line: 100 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "height", + span: { start: 2983, end: 2989, line: 100 }, + }, + }, + ], + }, + ], + span: { start: 2927, end: 2990, line: 100 }, + }, + }, + ], + }, + { + statementType: "returnStatement", + span: { start: 3010, end: 3017, line: 102 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function Bat.new 0 + push constant 5 + call Memory.alloc 1 + pop pointer 0 + push argument 0 + pop this 0 + push argument 1 + pop this 1 + push argument 2 + pop this 2 + push argument 3 + pop this 3 + push constant 2 + pop this 4 + push pointer 0 + call Bat.show 1 + pop temp 0 + push pointer 0 + return +function Bat.dispose 0 + push argument 0 + pop pointer 0 + push pointer 0 + call Memory.deAlloc 1 + pop temp 0 + push constant 0 + return +function Bat.show 0 + push argument 0 + pop pointer 0 + push constant 1 + neg + call Screen.setColor 1 + pop temp 0 + push pointer 0 + call Bat.draw 1 + pop temp 0 + push constant 0 + return +function Bat.hide 0 + push argument 0 + pop pointer 0 + push constant 0 + call Screen.setColor 1 + pop temp 0 + push pointer 0 + call Bat.draw 1 + pop temp 0 + push constant 0 + return +function Bat.draw 0 + push argument 0 + pop pointer 0 + push this 0 + push this 1 + push this 0 + push this 2 + add + push this 1 + push this 3 + add + call Screen.drawRectangle 4 + pop temp 0 + push constant 0 + return +function Bat.setDirection 0 + push argument 0 + pop pointer 0 + push argument 1 + pop this 4 + push constant 0 + return +function Bat.getLeft 0 + push argument 0 + pop pointer 0 + push this 0 + return +function Bat.getRight 0 + push argument 0 + pop pointer 0 + push this 0 + push this 2 + add + return +function Bat.setWidth 0 + push argument 0 + pop pointer 0 + push pointer 0 + call Bat.hide 1 + pop temp 0 + push argument 1 + pop this 2 + push pointer 0 + call Bat.show 1 + pop temp 0 + push constant 0 + return +function Bat.move 0 + push argument 0 + pop pointer 0 + push this 4 + push constant 1 + eq + not + if-goto Bat_1 + push this 0 + push constant 4 + sub + pop this 0 + push this 0 + push constant 0 + lt + not + if-goto Bat_3 + push constant 0 + pop this 0 + goto Bat_2 +label Bat_3 +label Bat_2 + push constant 0 + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 2 + add + push constant 1 + add + push this 1 + push this 0 + push this 2 + add + push constant 4 + add + push this 1 + push this 3 + add + call Screen.drawRectangle 4 + pop temp 0 + push constant 1 + neg + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 1 + push this 0 + push constant 3 + add + push this 1 + push this 3 + add + call Screen.drawRectangle 4 + pop temp 0 + goto Bat_0 +label Bat_1 + push this 0 + push constant 4 + add + pop this 0 + push this 0 + push this 2 + add + push constant 511 + gt + not + if-goto Bat_5 + push constant 511 + push this 2 + sub + pop this 0 + goto Bat_4 +label Bat_5 +label Bat_4 + push constant 0 + call Screen.setColor 1 + pop temp 0 + push this 0 + push constant 4 + sub + push this 1 + push this 0 + push constant 1 + sub + push this 1 + push this 3 + add + call Screen.drawRectangle 4 + pop temp 0 + push constant 1 + neg + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 2 + add + push constant 3 + sub + push this 1 + push this 0 + push this 2 + add + push this 1 + push this 3 + add + call Screen.drawRectangle 4 + pop temp 0 +label Bat_0 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/project_11/pong/main.ts b/web-ide-main/projects/src/samples/project_11/pong/main.ts new file mode 100644 index 0000000..8492b5a --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/pong/main.ts @@ -0,0 +1,118 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Pong/Main.jack +// (Same as projects/9/Pong/Main.jack) +/** + * Main class of the Pong game. + */ +class Main { + + /** Initializes a Pong game and starts running it. */ + function void main() { + var PongGame game; + do PongGame.newInstance(); + let game = PongGame.getInstance(); + do game.run(); + do game.dispose(); + return; + } +}`; + +export const parsed = { + name: { value: "Main", span: { start: 259, end: 263, line: 9 } }, + varDecs: [], + subroutines: [ + { + type: "function", + returnType: { value: "void", span: { start: 338, end: 343, line: 12 } }, + name: { value: "main", span: { start: 343, end: 347, line: 12 } }, + parameters: [], + body: { + varDecs: [ + { + type: { + value: "PongGame", + span: { start: 364, end: 373, line: 13 }, + }, + names: ["game"], + }, + ], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "PongGame.newInstance", + span: { start: 390, end: 410, line: 14 }, + }, + parameters: [], + span: { start: 390, end: 412, line: 14 }, + }, + }, + { + statementType: "letStatement", + name: { value: "game", span: { start: 426, end: 430, line: 15 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "PongGame.getInstance", + span: { start: 433, end: 453, line: 15 }, + }, + parameters: [], + span: { start: 433, end: 455, line: 15 }, + }, + rest: [], + }, + span: { start: 422, end: 456, line: 15 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "game.run", + span: { start: 468, end: 476, line: 16 }, + }, + parameters: [], + span: { start: 468, end: 478, line: 16 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "game.dispose", + span: { start: 491, end: 503, line: 17 }, + }, + parameters: [], + span: { start: 491, end: 505, line: 17 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 515, end: 522, line: 18 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function Main.main 1 + call PongGame.newInstance 0 + pop temp 0 + call PongGame.getInstance 0 + pop local 0 + push local 0 + call PongGame.run 1 + pop temp 0 + push local 0 + call PongGame.dispose 1 + pop temp 0 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/project_11/pong/pong_game.ts b/web-ide-main/projects/src/samples/project_11/pong/pong_game.ts new file mode 100644 index 0000000..ad45e37 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/pong/pong_game.ts @@ -0,0 +1,1920 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Pong/PongGame.jack +// (Same as projects/9/Pong/PongGame.jack) +/** + * Represents a Pong game. + */ +class PongGame { + + static PongGame instance; // A Pong game + field Bat bat; // bat + field Ball ball; // ball + field int wall; // current wall that the ball is bouncing off of + field boolean exit; // true when the game is over + field int score; // current score + field int lastWall; // last wall that the ball bounced off of + + // The current width of the bat + field int batWidth; + + /** Constructs a new Pong game. */ + constructor PongGame new() { + do Screen.clearScreen(); + let batWidth = 50; // initial bat size + let bat = Bat.new(230, 229, batWidth, 7); + let ball = Ball.new(253, 222, 0, 511, 0, 229); + do ball.setDestination(400,0); + do Screen.drawRectangle(0, 238, 511, 240); + do Output.moveCursor(22,0); + do Output.printString("Score: 0"); + + let exit = false; + let score = 0; + let wall = 0; + let lastWall = 0; + + return this; + } + + /** Deallocates the object's memory. */ + method void dispose() { + do bat.dispose(); + do ball.dispose(); + do Memory.deAlloc(this); + return; + } + + /** Creates an instance of a Pong game. */ + function void newInstance() { + let instance = PongGame.new(); + return; + } + + /** Returns this Pong game. */ + function PongGame getInstance() { + return instance; + } + + /** Starts the game, and handles inputs from the user that control + * the bat's movement direction. */ + method void run() { + var char key; + + while (~exit) { + // waits for a key to be pressed. + while ((key = 0) & (~exit)) { + let key = Keyboard.keyPressed(); + do bat.move(); + do moveBall(); + do Sys.wait(50); + } + + if (key = 130) { do bat.setDirection(1); } + else { + if (key = 132) { do bat.setDirection(2); } + else { + if (key = 140) { let exit = true; } + } + } + + // Waits for the key to be released. + while ((~(key = 0)) & (~exit)) { + let key = Keyboard.keyPressed(); + do bat.move(); + do moveBall(); + do Sys.wait(50); + } + } + + if (exit) { + do Output.moveCursor(10,27); + do Output.printString("Game Over"); + } + + return; + } + + /** + * Handles ball movement, including bouncing. + * If the ball bounces off a wall, finds its new direction. + * If the ball bounces off the bat, increases the score by one + * and shrinks the bat's size, to make the game more challenging. + */ + method void moveBall() { + var int bouncingDirection, batLeft, batRight, ballLeft, ballRight; + + let wall = ball.move(); + + if ((wall > 0) & (~(wall = lastWall))) { + let lastWall = wall; + let bouncingDirection = 0; + let batLeft = bat.getLeft(); + let batRight = bat.getRight(); + let ballLeft = ball.getLeft(); + let ballRight = ball.getRight(); + + if (wall = 4) { + let exit = (batLeft > ballRight) | (batRight < ballLeft); + if (~exit) { + if (ballRight < (batLeft + 10)) { let bouncingDirection = -1; } + else { + if (ballLeft > (batRight - 10)) { let bouncingDirection = 1; } + } + + let batWidth = batWidth - 2; + do bat.setWidth(batWidth); + let score = score + 1; + do Output.moveCursor(22,7); + do Output.printInt(score); + } + } + do ball.bounce(bouncingDirection); + } + return; + } +}`; + +export const parsed = { + name: { value: "PongGame", span: { start: 262, end: 270, line: 9 } }, + varDecs: [ + { + varType: "static", + type: { value: "PongGame", span: { start: 285, end: 294, line: 11 } }, + names: ["instance"], + }, + { + varType: "field", + type: { value: "Bat", span: { start: 334, end: 338, line: 12 } }, + names: ["bat"], + }, + { + varType: "field", + type: { value: "Ball", span: { start: 371, end: 376, line: 13 } }, + names: ["ball"], + }, + { + varType: "field", + type: { value: "int", span: { start: 409, end: 413, line: 14 } }, + names: ["wall"], + }, + { + varType: "field", + type: { value: "boolean", span: { start: 488, end: 496, line: 15 } }, + names: ["exit"], + }, + { + varType: "field", + type: { value: "int", span: { start: 548, end: 552, line: 16 } }, + names: ["score"], + }, + { + varType: "field", + type: { value: "int", span: { start: 595, end: 599, line: 17 } }, + names: ["lastWall"], + }, + { + varType: "field", + type: { value: "int", span: { start: 704, end: 708, line: 20 } }, + names: ["batWidth"], + }, + ], + subroutines: [ + { + type: "constructor", + returnType: { + value: "PongGame", + span: { start: 774, end: 783, line: 23 }, + }, + name: { value: "new", span: { start: 783, end: 786, line: 23 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.clearScreen", + span: { start: 800, end: 818, line: 24 }, + }, + parameters: [], + span: { start: 800, end: 820, line: 24 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "batWidth", + span: { start: 834, end: 842, line: 25 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 50 }, + rest: [], + }, + span: { start: 830, end: 848, line: 25 }, + }, + { + statementType: "letStatement", + name: { value: "bat", span: { start: 882, end: 885, line: 26 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Bat.new", + span: { start: 888, end: 895, line: 26 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 230 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 229 }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "batWidth", + span: { start: 906, end: 914, line: 26 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 7 }, + rest: [], + }, + ], + span: { start: 888, end: 918, line: 26 }, + }, + rest: [], + }, + span: { start: 878, end: 919, line: 26 }, + }, + { + statementType: "letStatement", + name: { value: "ball", span: { start: 932, end: 936, line: 27 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Ball.new", + span: { start: 939, end: 947, line: 27 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 253 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 222 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 511 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 229 }, + rest: [], + }, + ], + span: { start: 939, end: 973, line: 27 }, + }, + rest: [], + }, + span: { start: 928, end: 974, line: 27 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "ball.setDestination", + span: { start: 986, end: 1005, line: 28 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 400 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + ], + span: { start: 986, end: 1012, line: 28 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 1025, end: 1045, line: 29 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 238 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 511 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 240 }, + rest: [], + }, + ], + span: { start: 1025, end: 1063, line: 29 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.moveCursor", + span: { start: 1074, end: 1091, line: 30 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 22 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + ], + span: { start: 1074, end: 1097, line: 30 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printString", + span: { start: 1108, end: 1126, line: 31 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "stringLiteral", value: "Score: 0" }, + rest: [], + }, + ], + span: { start: 1108, end: 1138, line: 31 }, + }, + }, + { + statementType: "letStatement", + name: { value: "exit", span: { start: 1153, end: 1157, line: 33 } }, + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + span: { start: 1149, end: 1166, line: 33 }, + }, + { + statementType: "letStatement", + name: { + value: "score", + span: { start: 1177, end: 1182, line: 34 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 1173, end: 1187, line: 34 }, + }, + { + statementType: "letStatement", + name: { value: "wall", span: { start: 1198, end: 1202, line: 35 } }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 1194, end: 1207, line: 35 }, + }, + { + statementType: "letStatement", + name: { + value: "lastWall", + span: { start: 1218, end: 1226, line: 36 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 1214, end: 1231, line: 36 }, + }, + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "this" }, + rest: [], + }, + span: { start: 1241, end: 1253, line: 38 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1316, end: 1321, line: 42 } }, + name: { value: "dispose", span: { start: 1321, end: 1328, line: 42 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "bat.dispose", + span: { start: 1344, end: 1355, line: 43 }, + }, + parameters: [], + span: { start: 1344, end: 1357, line: 43 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "ball.dispose", + span: { start: 1368, end: 1380, line: 44 }, + }, + parameters: [], + span: { start: 1368, end: 1382, line: 44 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Memory.deAlloc", + span: { start: 1395, end: 1409, line: 45 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "this" }, + rest: [], + }, + ], + span: { start: 1395, end: 1415, line: 45 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1425, end: 1432, line: 46 }, + }, + ], + }, + }, + { + type: "function", + returnType: { value: "void", span: { start: 1500, end: 1505, line: 50 } }, + name: { + value: "newInstance", + span: { start: 1505, end: 1516, line: 50 }, + }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "letStatement", + name: { + value: "instance", + span: { start: 1533, end: 1541, line: 51 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "PongGame.new", + span: { start: 1544, end: 1556, line: 51 }, + }, + parameters: [], + span: { start: 1544, end: 1558, line: 51 }, + }, + rest: [], + }, + span: { start: 1529, end: 1559, line: 51 }, + }, + { + statementType: "returnStatement", + span: { start: 1568, end: 1575, line: 52 }, + }, + ], + }, + }, + { + type: "function", + returnType: { + value: "PongGame", + span: { start: 1635, end: 1644, line: 56 }, + }, + name: { + value: "getInstance", + span: { start: 1644, end: 1655, line: 56 }, + }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "instance", + span: { start: 1675, end: 1683, line: 57 }, + }, + rest: [], + }, + span: { start: 1668, end: 1684, line: 57 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1815, end: 1820, line: 62 } }, + name: { value: "run", span: { start: 1820, end: 1823, line: 62 } }, + parameters: [], + body: { + varDecs: [ + { + type: { value: "char", span: { start: 1840, end: 1845, line: 63 } }, + names: ["key"], + }, + ], + statements: [ + { + statementType: "whileStatement", + condition: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "variable", + name: "exit", + span: { start: 1867, end: 1871, line: 65 }, + }, + }, + rest: [], + }, + body: [ + { + statementType: "whileStatement", + condition: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 1941, end: 1944, line: 67 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 0 }, + }, + ], + }, + }, + rest: [ + { + op: "&", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "variable", + name: "exit", + span: { start: 1954, end: 1958, line: 67 }, + }, + }, + rest: [], + }, + }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "key", + span: { start: 1983, end: 1986, line: 68 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Keyboard.keyPressed", + span: { start: 1989, end: 2008, line: 68 }, + }, + parameters: [], + span: { start: 1989, end: 2010, line: 68 }, + }, + rest: [], + }, + span: { start: 1979, end: 2011, line: 68 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "bat.move", + span: { start: 2031, end: 2039, line: 69 }, + }, + parameters: [], + span: { start: 2031, end: 2041, line: 69 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "moveBall", + span: { start: 2062, end: 2070, line: 70 }, + }, + parameters: [], + span: { start: 2062, end: 2072, line: 70 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Sys.wait", + span: { start: 2093, end: 2101, line: 71 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 50 }, + rest: [], + }, + ], + span: { start: 2093, end: 2105, line: 71 }, + }, + }, + ], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2138, end: 2141, line: 74 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 130 }, + }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "bat.setDirection", + span: { start: 2154, end: 2170, line: 74 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + ], + span: { start: 2154, end: 2173, line: 74 }, + }, + }, + ], + else: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2212, end: 2215, line: 76 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 132 }, + }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "bat.setDirection", + span: { start: 2228, end: 2244, line: 76 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 2 }, + rest: [], + }, + ], + span: { start: 2228, end: 2247, line: 76 }, + }, + }, + ], + else: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2294, end: 2297, line: 78 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 140 }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "exit", + span: { start: 2311, end: 2315, line: 78 }, + }, + value: { + nodeType: "expression", + term: { + termType: "keywordLiteral", + value: "true", + }, + rest: [], + }, + span: { start: 2307, end: 2323, line: 78 }, + }, + ], + else: [], + }, + ], + }, + ], + }, + { + statementType: "whileStatement", + condition: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2426, end: 2429, line: 83 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 0 }, + }, + ], + }, + }, + }, + rest: [], + }, + }, + rest: [ + { + op: "&", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "variable", + name: "exit", + span: { start: 2440, end: 2444, line: 83 }, + }, + }, + rest: [], + }, + }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "key", + span: { start: 2469, end: 2472, line: 84 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Keyboard.keyPressed", + span: { start: 2475, end: 2494, line: 84 }, + }, + parameters: [], + span: { start: 2475, end: 2496, line: 84 }, + }, + rest: [], + }, + span: { start: 2465, end: 2497, line: 84 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "bat.move", + span: { start: 2517, end: 2525, line: 85 }, + }, + parameters: [], + span: { start: 2517, end: 2527, line: 85 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "moveBall", + span: { start: 2548, end: 2556, line: 86 }, + }, + parameters: [], + span: { start: 2548, end: 2558, line: 86 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Sys.wait", + span: { start: 2579, end: 2587, line: 87 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 50 }, + rest: [], + }, + ], + span: { start: 2579, end: 2591, line: 87 }, + }, + }, + ], + }, + ], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "exit", + span: { start: 2628, end: 2632, line: 91 }, + }, + rest: [], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.moveCursor", + span: { start: 2651, end: 2668, line: 92 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 10 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 27 }, + rest: [], + }, + ], + span: { start: 2651, end: 2675, line: 92 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printString", + span: { start: 2690, end: 2708, line: 93 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "stringLiteral", value: "Game Over" }, + rest: [], + }, + ], + span: { start: 2690, end: 2721, line: 93 }, + }, + }, + ], + else: [], + }, + { + statementType: "returnStatement", + span: { start: 2752, end: 2759, line: 96 }, + }, + ], + }, + }, + { + type: "method", + returnType: { + value: "void", + span: { start: 3046, end: 3051, line: 105 }, + }, + name: { value: "moveBall", span: { start: 3051, end: 3059, line: 105 } }, + parameters: [], + body: { + varDecs: [ + { + type: { value: "int", span: { start: 3076, end: 3080, line: 106 } }, + names: [ + "bouncingDirection", + "batLeft", + "batRight", + "ballLeft", + "ballRight", + ], + }, + ], + statements: [ + { + statementType: "letStatement", + name: { + value: "wall", + span: { start: 3152, end: 3156, line: 108 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "ball.move", + span: { start: 3159, end: 3168, line: 108 }, + }, + parameters: [], + span: { start: 3159, end: 3170, line: 108 }, + }, + rest: [], + }, + span: { start: 3148, end: 3171, line: 108 }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "wall", + span: { start: 3186, end: 3190, line: 110 }, + }, + rest: [ + { op: ">", term: { termType: "numericLiteral", value: 0 } }, + ], + }, + }, + rest: [ + { + op: "&", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "wall", + span: { start: 3201, end: 3205, line: 110 }, + }, + rest: [ + { + op: "=", + term: { + termType: "variable", + name: "lastWall", + span: { start: 3208, end: 3216, line: 110 }, + }, + }, + ], + }, + }, + }, + rest: [], + }, + }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "lastWall", + span: { start: 3238, end: 3246, line: 111 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "wall", + span: { start: 3249, end: 3253, line: 111 }, + }, + rest: [], + }, + span: { start: 3234, end: 3254, line: 111 }, + }, + { + statementType: "letStatement", + name: { + value: "bouncingDirection", + span: { start: 3271, end: 3288, line: 112 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 3267, end: 3293, line: 112 }, + }, + { + statementType: "letStatement", + name: { + value: "batLeft", + span: { start: 3310, end: 3317, line: 113 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "bat.getLeft", + span: { start: 3320, end: 3331, line: 113 }, + }, + parameters: [], + span: { start: 3320, end: 3333, line: 113 }, + }, + rest: [], + }, + span: { start: 3306, end: 3334, line: 113 }, + }, + { + statementType: "letStatement", + name: { + value: "batRight", + span: { start: 3351, end: 3359, line: 114 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "bat.getRight", + span: { start: 3362, end: 3374, line: 114 }, + }, + parameters: [], + span: { start: 3362, end: 3376, line: 114 }, + }, + rest: [], + }, + span: { start: 3347, end: 3377, line: 114 }, + }, + { + statementType: "letStatement", + name: { + value: "ballLeft", + span: { start: 3394, end: 3402, line: 115 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "ball.getLeft", + span: { start: 3405, end: 3417, line: 115 }, + }, + parameters: [], + span: { start: 3405, end: 3419, line: 115 }, + }, + rest: [], + }, + span: { start: 3390, end: 3420, line: 115 }, + }, + { + statementType: "letStatement", + name: { + value: "ballRight", + span: { start: 3437, end: 3446, line: 116 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "ball.getRight", + span: { start: 3449, end: 3462, line: 116 }, + }, + parameters: [], + span: { start: 3449, end: 3464, line: 116 }, + }, + rest: [], + }, + span: { start: 3433, end: 3465, line: 116 }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "wall", + span: { start: 3485, end: 3489, line: 118 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 4 } }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "exit", + span: { start: 3517, end: 3521, line: 119 }, + }, + value: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "batLeft", + span: { start: 3525, end: 3532, line: 119 }, + }, + rest: [ + { + op: ">", + term: { + termType: "variable", + name: "ballRight", + span: { start: 3535, end: 3544, line: 119 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "|", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "batRight", + span: { start: 3549, end: 3557, line: 119 }, + }, + rest: [ + { + op: "<", + term: { + termType: "variable", + name: "ballLeft", + span: { start: 3560, end: 3568, line: 119 }, + }, + }, + ], + }, + }, + }, + ], + }, + span: { start: 3513, end: 3570, line: 119 }, + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "variable", + name: "exit", + span: { start: 3592, end: 3596, line: 120 }, + }, + }, + rest: [], + }, + body: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "ballRight", + span: { start: 3624, end: 3633, line: 121 }, + }, + rest: [ + { + op: "<", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "batLeft", + span: { start: 3637, end: 3644, line: 121 }, + }, + rest: [ + { + op: "+", + term: { + termType: "numericLiteral", + value: 10, + }, + }, + ], + }, + }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "bouncingDirection", + span: { start: 3658, end: 3675, line: 121 }, + }, + value: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "-", + term: { termType: "numericLiteral", value: 1 }, + }, + rest: [], + }, + span: { start: 3654, end: 3681, line: 121 }, + }, + ], + else: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "ballLeft", + span: { start: 3739, end: 3747, line: 123 }, + }, + rest: [ + { + op: ">", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "batRight", + span: { + start: 3751, + end: 3759, + line: 123, + }, + }, + rest: [ + { + op: "-", + term: { + termType: "numericLiteral", + value: 10, + }, + }, + ], + }, + }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "bouncingDirection", + span: { start: 3773, end: 3790, line: 123 }, + }, + value: { + nodeType: "expression", + term: { + termType: "numericLiteral", + value: 1, + }, + rest: [], + }, + span: { start: 3769, end: 3795, line: 123 }, + }, + ], + else: [], + }, + ], + }, + { + statementType: "letStatement", + name: { + value: "batWidth", + span: { start: 3845, end: 3853, line: 126 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "batWidth", + span: { start: 3856, end: 3864, line: 126 }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 2 }, + }, + ], + }, + span: { start: 3841, end: 3869, line: 126 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "bat.setWidth", + span: { start: 3893, end: 3905, line: 127 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "batWidth", + span: { start: 3906, end: 3914, line: 127 }, + }, + rest: [], + }, + ], + span: { start: 3893, end: 3915, line: 127 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "score", + span: { start: 3947, end: 3952, line: 128 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "score", + span: { start: 3955, end: 3960, line: 128 }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + span: { start: 3943, end: 3965, line: 128 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.moveCursor", + span: { start: 3989, end: 4006, line: 129 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 22 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 7 }, + rest: [], + }, + ], + span: { start: 3989, end: 4012, line: 129 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printInt", + span: { start: 4037, end: 4052, line: 130 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "score", + span: { start: 4053, end: 4058, line: 130 }, + }, + rest: [], + }, + ], + span: { start: 4037, end: 4059, line: 130 }, + }, + }, + ], + else: [], + }, + ], + else: [], + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "ball.bounce", + span: { start: 4108, end: 4119, line: 133 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "bouncingDirection", + span: { start: 4120, end: 4137, line: 133 }, + }, + rest: [], + }, + ], + span: { start: 4108, end: 4138, line: 133 }, + }, + }, + ], + else: [], + }, + { + statementType: "returnStatement", + span: { start: 4158, end: 4165, line: 135 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function PongGame.new 0 + push constant 7 + call Memory.alloc 1 + pop pointer 0 + call Screen.clearScreen 0 + pop temp 0 + push constant 50 + pop this 6 + push constant 230 + push constant 229 + push this 6 + push constant 7 + call Bat.new 4 + pop this 0 + push constant 253 + push constant 222 + push constant 0 + push constant 511 + push constant 0 + push constant 229 + call Ball.new 6 + pop this 1 + push this 1 + push constant 400 + push constant 0 + call Ball.setDestination 3 + pop temp 0 + push constant 0 + push constant 238 + push constant 511 + push constant 240 + call Screen.drawRectangle 4 + pop temp 0 + push constant 22 + push constant 0 + call Output.moveCursor 2 + pop temp 0 + push constant 8 + call String.new 1 + push constant 83 + call String.appendChar 2 + push constant 99 + call String.appendChar 2 + push constant 111 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 58 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 48 + call String.appendChar 2 + call Output.printString 1 + pop temp 0 + push constant 0 + pop this 3 + push constant 0 + pop this 4 + push constant 0 + pop this 2 + push constant 0 + pop this 5 + push pointer 0 + return +function PongGame.dispose 0 + push argument 0 + pop pointer 0 + push this 0 + call Bat.dispose 1 + pop temp 0 + push this 1 + call Ball.dispose 1 + pop temp 0 + push pointer 0 + call Memory.deAlloc 1 + pop temp 0 + push constant 0 + return +function PongGame.newInstance 0 + call PongGame.new 0 + pop static 0 + push constant 0 + return +function PongGame.getInstance 0 + push static 0 + return +function PongGame.run 1 + push argument 0 + pop pointer 0 +label PongGame_0 + push this 3 + not + not + if-goto PongGame_1 +label PongGame_2 + push local 0 + push constant 0 + eq + push this 3 + not + and + not + if-goto PongGame_3 + call Keyboard.keyPressed 0 + pop local 0 + push this 0 + call Bat.move 1 + pop temp 0 + push pointer 0 + call PongGame.moveBall 1 + pop temp 0 + push constant 50 + call Sys.wait 1 + pop temp 0 + goto PongGame_2 +label PongGame_3 + push local 0 + push constant 130 + eq + not + if-goto PongGame_5 + push this 0 + push constant 1 + call Bat.setDirection 2 + pop temp 0 + goto PongGame_4 +label PongGame_5 + push local 0 + push constant 132 + eq + not + if-goto PongGame_7 + push this 0 + push constant 2 + call Bat.setDirection 2 + pop temp 0 + goto PongGame_6 +label PongGame_7 + push local 0 + push constant 140 + eq + not + if-goto PongGame_9 + push constant 1 + neg + pop this 3 + goto PongGame_8 +label PongGame_9 +label PongGame_8 +label PongGame_6 +label PongGame_4 +label PongGame_10 + push local 0 + push constant 0 + eq + not + push this 3 + not + and + not + if-goto PongGame_11 + call Keyboard.keyPressed 0 + pop local 0 + push this 0 + call Bat.move 1 + pop temp 0 + push pointer 0 + call PongGame.moveBall 1 + pop temp 0 + push constant 50 + call Sys.wait 1 + pop temp 0 + goto PongGame_10 +label PongGame_11 + goto PongGame_0 +label PongGame_1 + push this 3 + not + if-goto PongGame_13 + push constant 10 + push constant 27 + call Output.moveCursor 2 + pop temp 0 + push constant 9 + call String.new 1 + push constant 71 + call String.appendChar 2 + push constant 97 + call String.appendChar 2 + push constant 109 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 32 + call String.appendChar 2 + push constant 79 + call String.appendChar 2 + push constant 118 + call String.appendChar 2 + push constant 101 + call String.appendChar 2 + push constant 114 + call String.appendChar 2 + call Output.printString 1 + pop temp 0 + goto PongGame_12 +label PongGame_13 +label PongGame_12 + push constant 0 + return +function PongGame.moveBall 5 + push argument 0 + pop pointer 0 + push this 1 + call Ball.move 1 + pop this 2 + push this 2 + push constant 0 + gt + push this 2 + push this 5 + eq + not + and + not + if-goto PongGame_15 + push this 2 + pop this 5 + push constant 0 + pop local 0 + push this 0 + call Bat.getLeft 1 + pop local 1 + push this 0 + call Bat.getRight 1 + pop local 2 + push this 1 + call Ball.getLeft 1 + pop local 3 + push this 1 + call Ball.getRight 1 + pop local 4 + push this 2 + push constant 4 + eq + not + if-goto PongGame_17 + push local 1 + push local 4 + gt + push local 2 + push local 3 + lt + or + pop this 3 + push this 3 + not + not + if-goto PongGame_19 + push local 4 + push local 1 + push constant 10 + add + lt + not + if-goto PongGame_21 + push constant 1 + neg + pop local 0 + goto PongGame_20 +label PongGame_21 + push local 3 + push local 2 + push constant 10 + sub + gt + not + if-goto PongGame_23 + push constant 1 + pop local 0 + goto PongGame_22 +label PongGame_23 +label PongGame_22 +label PongGame_20 + push this 6 + push constant 2 + sub + pop this 6 + push this 0 + push this 6 + call Bat.setWidth 2 + pop temp 0 + push this 4 + push constant 1 + add + pop this 4 + push constant 22 + push constant 7 + call Output.moveCursor 2 + pop temp 0 + push this 4 + call Output.printInt 1 + pop temp 0 + goto PongGame_18 +label PongGame_19 +label PongGame_18 + goto PongGame_16 +label PongGame_17 +label PongGame_16 + push this 1 + push local 0 + call Ball.bounce 2 + pop temp 0 + goto PongGame_14 +label PongGame_15 +label PongGame_14 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/project_11/seven.ts b/web-ide-main/projects/src/samples/project_11/seven.ts new file mode 100644 index 0000000..423a121 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/seven.ts @@ -0,0 +1,84 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Seven/Main.jack +/** + * Computes the value of 1 + (2 * 3) and prints the result + * at the top-left of the screen. + */ +class Main { + + function void main() { + do Output.printInt(1 + (2 * 3)); + return; + } + +}`; + +export const parsed = { + name: { value: "Main", span: { start: 284, end: 288, line: 9 } }, + varDecs: [], + subroutines: [ + { + type: "function", + returnType: { value: "void", span: { start: 304, end: 309, line: 11 } }, + name: { value: "main", span: { start: 309, end: 313, line: 11 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Output.printInt", + span: { start: 327, end: 342, line: 12 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [ + { + op: "+", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 2 }, + rest: [ + { + op: "*", + term: { termType: "numericLiteral", value: 3 }, + }, + ], + }, + }, + }, + ], + }, + ], + span: { start: 327, end: 355, line: 12 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 363, end: 370, line: 13 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function Main.main 0 + push constant 1 + push constant 2 + push constant 3 + call Math.multiply 2 + add + call Output.printInt 1 + pop temp 0 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/project_11/square/main.ts b/web-ide-main/projects/src/samples/project_11/square/main.ts new file mode 100644 index 0000000..8fe8042 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/square/main.ts @@ -0,0 +1,99 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Square/Main.jack + +/** Initializes a new Square game and starts running it. */ +class Main { + function void main() { + var SquareGame game; + let game = SquareGame.new(); + do game.run(); + do game.dispose(); + return; + } +}`; + +export const parsed = { + name: { value: "Main", span: { start: 243, end: 247, line: 7 } }, + varDecs: [], + subroutines: [ + { + type: "function", + returnType: { value: "void", span: { start: 263, end: 268, line: 8 } }, + name: { value: "main", span: { start: 268, end: 272, line: 8 } }, + parameters: [], + body: { + varDecs: [ + { + type: { + value: "SquareGame", + span: { start: 289, end: 300, line: 9 }, + }, + names: ["game"], + }, + ], + statements: [ + { + statementType: "letStatement", + name: { value: "game", span: { start: 318, end: 322, line: 10 } }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "SquareGame.new", + span: { start: 325, end: 339, line: 10 }, + }, + parameters: [], + span: { start: 325, end: 341, line: 10 }, + }, + rest: [], + }, + span: { start: 314, end: 342, line: 10 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "game.run", + span: { start: 354, end: 362, line: 11 }, + }, + parameters: [], + span: { start: 354, end: 364, line: 11 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "game.dispose", + span: { start: 377, end: 389, line: 12 }, + }, + parameters: [], + span: { start: 377, end: 391, line: 12 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 401, end: 408, line: 13 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function Main.main 1 + call SquareGame.new 0 + pop local 0 + push local 0 + call SquareGame.run 1 + pop temp 0 + push local 0 + call SquareGame.dispose 1 + pop temp 0 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/project_11/square/square.ts b/web-ide-main/projects/src/samples/project_11/square/square.ts new file mode 100644 index 0000000..454bc34 --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/square/square.ts @@ -0,0 +1,1959 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Square/Square.jack + +/** Implements a graphical square. + The square has top-left x and y coordinates, and a size. */ +class Square { + + field int x, y; // screen location of the top-left corner of this square + field int size; // length of this square, in pixels + + /** Constructs and draws a new square with a given location and size. */ + constructor Square new(int ax, int ay, int asize) { + let x = ax; + let y = ay; + let size = asize; + do draw(); + return this; + } + + /** Disposes this square. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Draws this square in its current (x,y) location */ + method void draw() { + // Draws the square using the color black + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + size, y + size); + return; + } + + /** Erases this square. */ + method void erase() { + // Draws the square using the color white (background color) + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + size, y + size); + return; + } + + /** Increments the square size by 2 pixels (if possible). */ + method void incSize() { + if (((y + size) < 254) & ((x + size) < 510)) { + do erase(); + let size = size + 2; + do draw(); + } + return; + } + + /** Decrements the square size by 2 pixels (if possible). */ + method void decSize() { + if (size > 2) { + do erase(); + let size = size - 2; + do draw(); + } + return; + } + + /** Moves this square up by 2 pixels (if possible). */ + method void moveUp() { + if (y > 1) { + // Erases the bottom two rows of this square in its current location + do Screen.setColor(false); + do Screen.drawRectangle(x, (y + size) - 1, x + size, y + size); + let y = y - 2; + // Draws the top two rows of this square in its new location + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + size, y + 1); + } + return; + } + + /** Moves the square down by 2 pixels (if possible). */ + method void moveDown() { + if ((y + size) < 254) { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + size, y + 1); + let y = y + 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, (y + size) - 1, x + size, y + size); + } + return; + } + + /** Moves the square left by 2 pixels (if possible). */ + method void moveLeft() { + if (x > 1) { + do Screen.setColor(false); + do Screen.drawRectangle((x + size) - 1, y, x + size, y + size); + let x = x - 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + 1, y + size); + } + return; + } + + /** Moves the square right by 2 pixels (if possible). */ + method void moveRight() { + if ((x + size) < 510) { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + 1, y + size); + let x = x + 2; + do Screen.setColor(true); + do Screen.drawRectangle((x + size) - 1, y, x + size, y + size); + } + return; + } +}`; + +export const parsed = { + name: { value: "Square", span: { start: 284, end: 290, line: 8 } }, + varDecs: [ + { + varType: "field", + type: { value: "int", span: { start: 303, end: 307, line: 10 } }, + names: ["x", "y"], + }, + { + varType: "field", + type: { value: "int", span: { start: 379, end: 383, line: 11 } }, + names: ["size"], + }, + ], + subroutines: [ + { + type: "constructor", + returnType: { value: "Square", span: { start: 517, end: 524, line: 14 } }, + name: { value: "new", span: { start: 524, end: 527, line: 14 } }, + parameters: [ + { + type: { value: "int", span: { start: 528, end: 532, line: 14 } }, + name: "ax", + }, + { + type: { value: "int", span: { start: 536, end: 540, line: 14 } }, + name: "ay", + }, + { + type: { value: "int", span: { start: 544, end: 548, line: 14 } }, + name: "asize", + }, + ], + body: { + varDecs: [], + statements: [ + { + statementType: "letStatement", + name: { value: "x", span: { start: 567, end: 568, line: 15 } }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "ax", + span: { start: 571, end: 573, line: 15 }, + }, + rest: [], + }, + span: { start: 563, end: 574, line: 15 }, + }, + { + statementType: "letStatement", + name: { value: "y", span: { start: 585, end: 586, line: 16 } }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "ay", + span: { start: 589, end: 591, line: 16 }, + }, + rest: [], + }, + span: { start: 581, end: 592, line: 16 }, + }, + { + statementType: "letStatement", + name: { value: "size", span: { start: 603, end: 607, line: 17 } }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "asize", + span: { start: 610, end: 615, line: 17 }, + }, + rest: [], + }, + span: { start: 599, end: 616, line: 17 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { value: "draw", span: { start: 626, end: 630, line: 18 } }, + parameters: [], + span: { start: 626, end: 632, line: 18 }, + }, + }, + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "this" }, + rest: [], + }, + span: { start: 640, end: 652, line: 19 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 701, end: 706, line: 23 } }, + name: { value: "dispose", span: { start: 706, end: 713, line: 23 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Memory.deAlloc", + span: { start: 727, end: 741, line: 24 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "this" }, + rest: [], + }, + ], + span: { start: 727, end: 747, line: 24 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 755, end: 762, line: 25 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 837, end: 842, line: 29 } }, + name: { value: "draw", span: { start: 842, end: 846, line: 29 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 908, end: 923, line: 31 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + ], + span: { start: 908, end: 929, line: 31 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 940, end: 960, line: 32 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 961, end: 962, line: 32 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 964, end: 965, line: 32 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 967, end: 968, line: 32 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 971, end: 975, line: 32 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 977, end: 978, line: 32 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 981, end: 985, line: 32 }, + }, + }, + ], + }, + ], + span: { start: 940, end: 986, line: 32 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 994, end: 1001, line: 33 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1048, end: 1053, line: 37 } }, + name: { value: "erase", span: { start: 1053, end: 1058, line: 37 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 1139, end: 1154, line: 39 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + ], + span: { start: 1139, end: 1161, line: 39 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 1172, end: 1192, line: 40 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 1193, end: 1194, line: 40 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 1196, end: 1197, line: 40 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 1199, end: 1200, line: 40 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 1203, end: 1207, line: 40 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 1209, end: 1210, line: 40 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 1213, end: 1217, line: 40 }, + }, + }, + ], + }, + ], + span: { start: 1172, end: 1218, line: 40 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1226, end: 1233, line: 41 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1315, end: 1320, line: 45 } }, + name: { value: "incSize", span: { start: 1320, end: 1327, line: 45 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 1344, end: 1345, line: 46 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 1348, end: 1352, line: 46 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "<", + term: { termType: "numericLiteral", value: 254 }, + }, + ], + }, + }, + rest: [ + { + op: "&", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 1365, end: 1366, line: 46 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 1369, end: 1373, line: 46 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "<", + term: { termType: "numericLiteral", value: 510 }, + }, + ], + }, + }, + }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "erase", + span: { start: 1397, end: 1402, line: 47 }, + }, + parameters: [], + span: { start: 1397, end: 1404, line: 47 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "size", + span: { start: 1419, end: 1423, line: 48 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "size", + span: { start: 1426, end: 1430, line: 48 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + span: { start: 1415, end: 1435, line: 48 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "draw", + span: { start: 1448, end: 1452, line: 49 }, + }, + parameters: [], + span: { start: 1448, end: 1454, line: 49 }, + }, + }, + ], + else: [], + }, + { + statementType: "returnStatement", + span: { start: 1470, end: 1477, line: 51 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1558, end: 1563, line: 55 } }, + name: { value: "decSize", span: { start: 1563, end: 1570, line: 55 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "size", + span: { start: 1585, end: 1589, line: 56 }, + }, + rest: [ + { op: ">", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "erase", + span: { start: 1609, end: 1614, line: 57 }, + }, + parameters: [], + span: { start: 1609, end: 1616, line: 57 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "size", + span: { start: 1631, end: 1635, line: 58 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "size", + span: { start: 1638, end: 1642, line: 58 }, + }, + rest: [ + { op: "-", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + span: { start: 1627, end: 1647, line: 58 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "draw", + span: { start: 1660, end: 1664, line: 59 }, + }, + parameters: [], + span: { start: 1660, end: 1666, line: 59 }, + }, + }, + ], + else: [], + }, + { + statementType: "returnStatement", + span: { start: 1682, end: 1689, line: 61 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1764, end: 1769, line: 65 } }, + name: { value: "moveUp", span: { start: 1769, end: 1775, line: 65 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 1790, end: 1791, line: 66 }, + }, + rest: [ + { op: ">", term: { termType: "numericLiteral", value: 1 } }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 1889, end: 1904, line: 68 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + ], + span: { start: 1889, end: 1911, line: 68 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 1925, end: 1945, line: 69 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 1946, end: 1947, line: 69 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 1950, end: 1951, line: 69 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 1954, end: 1958, line: 69 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 1965, end: 1966, line: 69 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 1969, end: 1973, line: 69 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 1975, end: 1976, line: 69 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 1979, end: 1983, line: 69 }, + }, + }, + ], + }, + ], + span: { start: 1925, end: 1984, line: 69 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "y", + span: { start: 1999, end: 2000, line: 70 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2003, end: 2004, line: 70 }, + }, + rest: [ + { op: "-", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + span: { start: 1995, end: 2009, line: 70 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 2092, end: 2107, line: 72 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + ], + span: { start: 2092, end: 2113, line: 72 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 2127, end: 2147, line: 73 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2148, end: 2149, line: 73 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2151, end: 2152, line: 73 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2154, end: 2155, line: 73 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 2158, end: 2162, line: 73 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2164, end: 2165, line: 73 }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + ], + span: { start: 2127, end: 2170, line: 73 }, + }, + }, + ], + else: [], + }, + { + statementType: "returnStatement", + span: { start: 2186, end: 2193, line: 75 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 2269, end: 2274, line: 79 } }, + name: { value: "moveDown", span: { start: 2274, end: 2282, line: 79 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2298, end: 2299, line: 80 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 2302, end: 2306, line: 80 }, + }, + }, + ], + }, + }, + rest: [ + { op: "<", term: { termType: "numericLiteral", value: 254 } }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 2329, end: 2344, line: 81 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + ], + span: { start: 2329, end: 2351, line: 81 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 2365, end: 2385, line: 82 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2386, end: 2387, line: 82 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2389, end: 2390, line: 82 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2392, end: 2393, line: 82 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 2396, end: 2400, line: 82 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2402, end: 2403, line: 82 }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + ], + span: { start: 2365, end: 2408, line: 82 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "y", + span: { start: 2423, end: 2424, line: 83 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2427, end: 2428, line: 83 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + span: { start: 2419, end: 2433, line: 83 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 2446, end: 2461, line: 84 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + ], + span: { start: 2446, end: 2467, line: 84 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 2481, end: 2501, line: 85 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2502, end: 2503, line: 85 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2506, end: 2507, line: 85 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 2510, end: 2514, line: 85 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2521, end: 2522, line: 85 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 2525, end: 2529, line: 85 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2531, end: 2532, line: 85 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 2535, end: 2539, line: 85 }, + }, + }, + ], + }, + ], + span: { start: 2481, end: 2540, line: 85 }, + }, + }, + ], + else: [], + }, + { + statementType: "returnStatement", + span: { start: 2556, end: 2563, line: 87 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 2639, end: 2644, line: 91 } }, + name: { value: "moveLeft", span: { start: 2644, end: 2652, line: 91 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2667, end: 2668, line: 92 }, + }, + rest: [ + { op: ">", term: { termType: "numericLiteral", value: 1 } }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 2688, end: 2703, line: 93 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + ], + span: { start: 2688, end: 2710, line: 93 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 2724, end: 2744, line: 94 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2746, end: 2747, line: 94 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 2750, end: 2754, line: 94 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2761, end: 2762, line: 94 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2764, end: 2765, line: 94 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 2768, end: 2772, line: 94 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2774, end: 2775, line: 94 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 2778, end: 2782, line: 94 }, + }, + }, + ], + }, + ], + span: { start: 2724, end: 2783, line: 94 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 2798, end: 2799, line: 95 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2802, end: 2803, line: 95 }, + }, + rest: [ + { op: "-", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + span: { start: 2794, end: 2808, line: 95 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 2821, end: 2836, line: 96 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + ], + span: { start: 2821, end: 2842, line: 96 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 2856, end: 2876, line: 97 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2877, end: 2878, line: 97 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2880, end: 2881, line: 97 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 2883, end: 2884, line: 97 }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 2890, end: 2891, line: 97 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 2894, end: 2898, line: 97 }, + }, + }, + ], + }, + ], + span: { start: 2856, end: 2899, line: 97 }, + }, + }, + ], + else: [], + }, + { + statementType: "returnStatement", + span: { start: 2915, end: 2922, line: 99 }, + }, + ], + }, + }, + { + type: "method", + returnType: { + value: "void", + span: { start: 2999, end: 3004, line: 103 }, + }, + name: { value: "moveRight", span: { start: 3004, end: 3013, line: 103 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3029, end: 3030, line: 104 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 3033, end: 3037, line: 104 }, + }, + }, + ], + }, + }, + rest: [ + { op: "<", term: { termType: "numericLiteral", value: 510 } }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 3060, end: 3075, line: 105 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + ], + span: { start: 3060, end: 3082, line: 105 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 3096, end: 3116, line: 106 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3117, end: 3118, line: 106 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 3120, end: 3121, line: 106 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3123, end: 3124, line: 106 }, + }, + rest: [ + { + op: "+", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 3130, end: 3131, line: 106 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 3134, end: 3138, line: 106 }, + }, + }, + ], + }, + ], + span: { start: 3096, end: 3139, line: 106 }, + }, + }, + { + statementType: "letStatement", + name: { + value: "x", + span: { start: 3154, end: 3155, line: 107 }, + }, + value: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3158, end: 3159, line: 107 }, + }, + rest: [ + { op: "+", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + span: { start: 3150, end: 3164, line: 107 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.setColor", + span: { start: 3177, end: 3192, line: 108 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + ], + span: { start: 3177, end: 3198, line: 108 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Screen.drawRectangle", + span: { start: 3212, end: 3232, line: 109 }, + }, + parameters: [ + { + nodeType: "expression", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3234, end: 3235, line: 109 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 3238, end: 3242, line: 109 }, + }, + }, + ], + }, + }, + rest: [ + { + op: "-", + term: { termType: "numericLiteral", value: 1 }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 3249, end: 3250, line: 109 }, + }, + rest: [], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "x", + span: { start: 3252, end: 3253, line: 109 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 3256, end: 3260, line: 109 }, + }, + }, + ], + }, + { + nodeType: "expression", + term: { + termType: "variable", + name: "y", + span: { start: 3262, end: 3263, line: 109 }, + }, + rest: [ + { + op: "+", + term: { + termType: "variable", + name: "size", + span: { start: 3266, end: 3270, line: 109 }, + }, + }, + ], + }, + ], + span: { start: 3212, end: 3271, line: 109 }, + }, + }, + ], + else: [], + }, + { + statementType: "returnStatement", + span: { start: 3287, end: 3294, line: 111 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function Square.new 0 + push constant 3 + call Memory.alloc 1 + pop pointer 0 + push argument 0 + pop this 0 + push argument 1 + pop this 1 + push argument 2 + pop this 2 + push pointer 0 + call Square.draw 1 + pop temp 0 + push pointer 0 + return +function Square.dispose 0 + push argument 0 + pop pointer 0 + push pointer 0 + call Memory.deAlloc 1 + pop temp 0 + push constant 0 + return +function Square.draw 0 + push argument 0 + pop pointer 0 + push constant 1 + neg + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 1 + push this 0 + push this 2 + add + push this 1 + push this 2 + add + call Screen.drawRectangle 4 + pop temp 0 + push constant 0 + return +function Square.erase 0 + push argument 0 + pop pointer 0 + push constant 0 + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 1 + push this 0 + push this 2 + add + push this 1 + push this 2 + add + call Screen.drawRectangle 4 + pop temp 0 + push constant 0 + return +function Square.incSize 0 + push argument 0 + pop pointer 0 + push this 1 + push this 2 + add + push constant 254 + lt + push this 0 + push this 2 + add + push constant 510 + lt + and + not + if-goto Square_1 + push pointer 0 + call Square.erase 1 + pop temp 0 + push this 2 + push constant 2 + add + pop this 2 + push pointer 0 + call Square.draw 1 + pop temp 0 + goto Square_0 +label Square_1 +label Square_0 + push constant 0 + return +function Square.decSize 0 + push argument 0 + pop pointer 0 + push this 2 + push constant 2 + gt + not + if-goto Square_3 + push pointer 0 + call Square.erase 1 + pop temp 0 + push this 2 + push constant 2 + sub + pop this 2 + push pointer 0 + call Square.draw 1 + pop temp 0 + goto Square_2 +label Square_3 +label Square_2 + push constant 0 + return +function Square.moveUp 0 + push argument 0 + pop pointer 0 + push this 1 + push constant 1 + gt + not + if-goto Square_5 + push constant 0 + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 1 + push this 2 + add + push constant 1 + sub + push this 0 + push this 2 + add + push this 1 + push this 2 + add + call Screen.drawRectangle 4 + pop temp 0 + push this 1 + push constant 2 + sub + pop this 1 + push constant 1 + neg + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 1 + push this 0 + push this 2 + add + push this 1 + push constant 1 + add + call Screen.drawRectangle 4 + pop temp 0 + goto Square_4 +label Square_5 +label Square_4 + push constant 0 + return +function Square.moveDown 0 + push argument 0 + pop pointer 0 + push this 1 + push this 2 + add + push constant 254 + lt + not + if-goto Square_7 + push constant 0 + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 1 + push this 0 + push this 2 + add + push this 1 + push constant 1 + add + call Screen.drawRectangle 4 + pop temp 0 + push this 1 + push constant 2 + add + pop this 1 + push constant 1 + neg + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 1 + push this 2 + add + push constant 1 + sub + push this 0 + push this 2 + add + push this 1 + push this 2 + add + call Screen.drawRectangle 4 + pop temp 0 + goto Square_6 +label Square_7 +label Square_6 + push constant 0 + return +function Square.moveLeft 0 + push argument 0 + pop pointer 0 + push this 0 + push constant 1 + gt + not + if-goto Square_9 + push constant 0 + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 2 + add + push constant 1 + sub + push this 1 + push this 0 + push this 2 + add + push this 1 + push this 2 + add + call Screen.drawRectangle 4 + pop temp 0 + push this 0 + push constant 2 + sub + pop this 0 + push constant 1 + neg + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 1 + push this 0 + push constant 1 + add + push this 1 + push this 2 + add + call Screen.drawRectangle 4 + pop temp 0 + goto Square_8 +label Square_9 +label Square_8 + push constant 0 + return +function Square.moveRight 0 + push argument 0 + pop pointer 0 + push this 0 + push this 2 + add + push constant 510 + lt + not + if-goto Square_11 + push constant 0 + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 1 + push this 0 + push constant 1 + add + push this 1 + push this 2 + add + call Screen.drawRectangle 4 + pop temp 0 + push this 0 + push constant 2 + add + pop this 0 + push constant 1 + neg + call Screen.setColor 1 + pop temp 0 + push this 0 + push this 2 + add + push constant 1 + sub + push this 1 + push this 0 + push this 2 + add + push this 1 + push this 2 + add + call Screen.drawRectangle 4 + pop temp 0 + goto Square_10 +label Square_11 +label Square_10 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/project_11/square/square_game.ts b/web-ide-main/projects/src/samples/project_11/square/square_game.ts new file mode 100644 index 0000000..99a130e --- /dev/null +++ b/web-ide-main/projects/src/samples/project_11/square/square_game.ts @@ -0,0 +1,948 @@ +export const jack = `// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Square/SquareGame.jack +/** + * Implements the Square game. + * This simple game allows the user to move a black square around + * the screen, and change the square's size during the movement. + * When the game starts, a square of 30 by 30 pixels is shown at the + * top-left corner of the screen. The user controls the square as follows. + * The 4 arrow keys are used to move the square up, down, left, and right. + * The 'z' and 'x' keys are used, respectively, to decrement and increment + * the square's size. The 'q' key is used to quit the game. + */ +class SquareGame { + field Square square; // the square of this game + field int direction; // the square's current direction: + // 0=none, 1=up, 2=down, 3=left, 4=right + + /** Constructs a new square game. */ + constructor SquareGame new() { + // The initial square is located in (0,0), has size 30, and is not moving. + let square = Square.new(0, 0, 30); + let direction = 0; + return this; + } + + /** Disposes this game. */ + method void dispose() { + do square.dispose(); + do Memory.deAlloc(this); + return; + } + + /** Moves the square in the current direction. */ + method void moveSquare() { + if (direction = 1) { do square.moveUp(); } + if (direction = 2) { do square.moveDown(); } + if (direction = 3) { do square.moveLeft(); } + if (direction = 4) { do square.moveRight(); } + do Sys.wait(5); // delays the next movement + return; + } + + /** Runs the game: handles the user's inputs and moves the square accordingly */ + method void run() { + var char key; // the key currently pressed by the user + var boolean exit; + let exit = false; + + while (~exit) { + // waits for a key to be pressed + while (key = 0) { + let key = Keyboard.keyPressed(); + do moveSquare(); + } + if (key = 81) { let exit = true; } // q key + if (key = 90) { do square.decSize(); } // z key + if (key = 88) { do square.incSize(); } // x key + if (key = 131) { let direction = 1; } // up arrow + if (key = 133) { let direction = 2; } // down arrow + if (key = 130) { let direction = 3; } // left arrow + if (key = 132) { let direction = 4; } // right arrow + + // waits for the key to be released + while (~(key = 0)) { + let key = Keyboard.keyPressed(); + do moveSquare(); + } + } // while + return; + } +} + + +`; + +export const parsed = { + name: { value: "SquareGame", span: { start: 712, end: 722, line: 15 } }, + varDecs: [ + { + varType: "field", + type: { value: "Square", span: { start: 734, end: 741, line: 16 } }, + names: ["square"], + }, + { + varType: "field", + type: { value: "int", span: { start: 785, end: 789, line: 17 } }, + names: ["direction"], + }, + ], + subroutines: [ + { + type: "constructor", + returnType: { + value: "SquareGame", + span: { start: 957, end: 968, line: 21 }, + }, + name: { value: "new", span: { start: 968, end: 971, line: 21 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "letStatement", + name: { + value: "square", + span: { start: 1067, end: 1073, line: 23 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Square.new", + span: { start: 1076, end: 1086, line: 23 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 30 }, + rest: [], + }, + ], + span: { start: 1076, end: 1096, line: 23 }, + }, + rest: [], + }, + span: { start: 1063, end: 1097, line: 23 }, + }, + { + statementType: "letStatement", + name: { + value: "direction", + span: { start: 1108, end: 1117, line: 24 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 0 }, + rest: [], + }, + span: { start: 1104, end: 1122, line: 24 }, + }, + { + statementType: "returnStatement", + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "this" }, + rest: [], + }, + span: { start: 1129, end: 1141, line: 25 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1188, end: 1193, line: 29 } }, + name: { value: "dispose", span: { start: 1193, end: 1200, line: 29 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "square.dispose", + span: { start: 1214, end: 1228, line: 30 }, + }, + parameters: [], + span: { start: 1214, end: 1230, line: 30 }, + }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Memory.deAlloc", + span: { start: 1241, end: 1255, line: 31 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "this" }, + rest: [], + }, + ], + span: { start: 1241, end: 1261, line: 31 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1269, end: 1276, line: 32 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1346, end: 1351, line: 36 } }, + name: { value: "moveSquare", span: { start: 1351, end: 1361, line: 36 } }, + parameters: [], + body: { + varDecs: [], + statements: [ + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "direction", + span: { start: 1376, end: 1385, line: 37 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 1 } }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "square.moveUp", + span: { start: 1396, end: 1409, line: 37 }, + }, + parameters: [], + span: { start: 1396, end: 1411, line: 37 }, + }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "direction", + span: { start: 1425, end: 1434, line: 38 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 2 } }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "square.moveDown", + span: { start: 1445, end: 1460, line: 38 }, + }, + parameters: [], + span: { start: 1445, end: 1462, line: 38 }, + }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "direction", + span: { start: 1476, end: 1485, line: 39 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 3 } }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "square.moveLeft", + span: { start: 1496, end: 1511, line: 39 }, + }, + parameters: [], + span: { start: 1496, end: 1513, line: 39 }, + }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "direction", + span: { start: 1527, end: 1536, line: 40 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 4 } }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "square.moveRight", + span: { start: 1547, end: 1563, line: 40 }, + }, + parameters: [], + span: { start: 1547, end: 1565, line: 40 }, + }, + }, + ], + else: [], + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "Sys.wait", + span: { start: 1578, end: 1586, line: 41 }, + }, + parameters: [ + { + nodeType: "expression", + term: { termType: "numericLiteral", value: 5 }, + rest: [], + }, + ], + span: { start: 1578, end: 1589, line: 41 }, + }, + }, + { + statementType: "returnStatement", + span: { start: 1626, end: 1633, line: 42 }, + }, + ], + }, + }, + { + type: "method", + returnType: { value: "void", span: { start: 1734, end: 1739, line: 46 } }, + name: { value: "run", span: { start: 1739, end: 1742, line: 46 } }, + parameters: [], + body: { + varDecs: [ + { + type: { value: "char", span: { start: 1757, end: 1762, line: 47 } }, + names: ["key"], + }, + { + type: { + value: "boolean", + span: { start: 1819, end: 1827, line: 48 }, + }, + names: ["exit"], + }, + ], + statements: [ + { + statementType: "letStatement", + name: { value: "exit", span: { start: 1843, end: 1847, line: 49 } }, + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "false" }, + rest: [], + }, + span: { start: 1839, end: 1856, line: 49 }, + }, + { + statementType: "whileStatement", + condition: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "variable", + name: "exit", + span: { start: 1878, end: 1882, line: 51 }, + }, + }, + rest: [], + }, + body: [ + { + statementType: "whileStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 1944, end: 1947, line: 53 }, + }, + rest: [ + { op: "=", term: { termType: "numericLiteral", value: 0 } }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "key", + span: { start: 1971, end: 1974, line: 54 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Keyboard.keyPressed", + span: { start: 1977, end: 1996, line: 54 }, + }, + parameters: [], + span: { start: 1977, end: 1998, line: 54 }, + }, + rest: [], + }, + span: { start: 1967, end: 1999, line: 54 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "moveSquare", + span: { start: 2015, end: 2025, line: 55 }, + }, + parameters: [], + span: { start: 2015, end: 2027, line: 55 }, + }, + }, + ], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2053, end: 2056, line: 57 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 81 }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "exit", + span: { start: 2070, end: 2074, line: 57 }, + }, + value: { + nodeType: "expression", + term: { termType: "keywordLiteral", value: "true" }, + rest: [], + }, + span: { start: 2066, end: 2082, line: 57 }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2111, end: 2114, line: 58 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 90 }, + }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "square.decSize", + span: { start: 2127, end: 2141, line: 58 }, + }, + parameters: [], + span: { start: 2127, end: 2143, line: 58 }, + }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2169, end: 2172, line: 59 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 88 }, + }, + ], + }, + body: [ + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "square.incSize", + span: { start: 2185, end: 2199, line: 59 }, + }, + parameters: [], + span: { start: 2185, end: 2201, line: 59 }, + }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2227, end: 2230, line: 60 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 131 }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "direction", + span: { start: 2244, end: 2253, line: 60 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 1 }, + rest: [], + }, + span: { start: 2240, end: 2258, line: 60 }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2288, end: 2291, line: 61 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 133 }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "direction", + span: { start: 2305, end: 2314, line: 61 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 2 }, + rest: [], + }, + span: { start: 2301, end: 2319, line: 61 }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2351, end: 2354, line: 62 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 130 }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "direction", + span: { start: 2368, end: 2377, line: 62 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 3 }, + rest: [], + }, + span: { start: 2364, end: 2382, line: 62 }, + }, + ], + else: [], + }, + { + statementType: "ifStatement", + condition: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2414, end: 2417, line: 63 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 132 }, + }, + ], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "direction", + span: { start: 2431, end: 2440, line: 63 }, + }, + value: { + nodeType: "expression", + term: { termType: "numericLiteral", value: 4 }, + rest: [], + }, + span: { start: 2427, end: 2445, line: 63 }, + }, + ], + else: [], + }, + { + statementType: "whileStatement", + condition: { + nodeType: "expression", + term: { + termType: "unaryExpression", + op: "~", + term: { + termType: "groupedExpression", + expression: { + nodeType: "expression", + term: { + termType: "variable", + name: "key", + span: { start: 2529, end: 2532, line: 66 }, + }, + rest: [ + { + op: "=", + term: { termType: "numericLiteral", value: 0 }, + }, + ], + }, + }, + }, + rest: [], + }, + body: [ + { + statementType: "letStatement", + name: { + value: "key", + span: { start: 2557, end: 2560, line: 67 }, + }, + value: { + nodeType: "expression", + term: { + termType: "subroutineCall", + name: { + value: "Keyboard.keyPressed", + span: { start: 2563, end: 2582, line: 67 }, + }, + parameters: [], + span: { start: 2563, end: 2584, line: 67 }, + }, + rest: [], + }, + span: { start: 2553, end: 2585, line: 67 }, + }, + { + statementType: "doStatement", + call: { + termType: "subroutineCall", + name: { + value: "moveSquare", + span: { start: 2601, end: 2611, line: 68 }, + }, + parameters: [], + span: { start: 2601, end: 2613, line: 68 }, + }, + }, + ], + }, + ], + }, + { + statementType: "returnStatement", + span: { start: 2647, end: 2654, line: 71 }, + }, + ], + }, + }, + ], +}; + +export const compiled = `function SquareGame.new 0 + push constant 2 + call Memory.alloc 1 + pop pointer 0 + push constant 0 + push constant 0 + push constant 30 + call Square.new 3 + pop this 0 + push constant 0 + pop this 1 + push pointer 0 + return +function SquareGame.dispose 0 + push argument 0 + pop pointer 0 + push this 0 + call Square.dispose 1 + pop temp 0 + push pointer 0 + call Memory.deAlloc 1 + pop temp 0 + push constant 0 + return +function SquareGame.moveSquare 0 + push argument 0 + pop pointer 0 + push this 1 + push constant 1 + eq + not + if-goto SquareGame_1 + push this 0 + call Square.moveUp 1 + pop temp 0 + goto SquareGame_0 +label SquareGame_1 +label SquareGame_0 + push this 1 + push constant 2 + eq + not + if-goto SquareGame_3 + push this 0 + call Square.moveDown 1 + pop temp 0 + goto SquareGame_2 +label SquareGame_3 +label SquareGame_2 + push this 1 + push constant 3 + eq + not + if-goto SquareGame_5 + push this 0 + call Square.moveLeft 1 + pop temp 0 + goto SquareGame_4 +label SquareGame_5 +label SquareGame_4 + push this 1 + push constant 4 + eq + not + if-goto SquareGame_7 + push this 0 + call Square.moveRight 1 + pop temp 0 + goto SquareGame_6 +label SquareGame_7 +label SquareGame_6 + push constant 5 + call Sys.wait 1 + pop temp 0 + push constant 0 + return +function SquareGame.run 2 + push argument 0 + pop pointer 0 + push constant 0 + pop local 1 +label SquareGame_8 + push local 1 + not + not + if-goto SquareGame_9 +label SquareGame_10 + push local 0 + push constant 0 + eq + not + if-goto SquareGame_11 + call Keyboard.keyPressed 0 + pop local 0 + push pointer 0 + call SquareGame.moveSquare 1 + pop temp 0 + goto SquareGame_10 +label SquareGame_11 + push local 0 + push constant 81 + eq + not + if-goto SquareGame_13 + push constant 1 + neg + pop local 1 + goto SquareGame_12 +label SquareGame_13 +label SquareGame_12 + push local 0 + push constant 90 + eq + not + if-goto SquareGame_15 + push this 0 + call Square.decSize 1 + pop temp 0 + goto SquareGame_14 +label SquareGame_15 +label SquareGame_14 + push local 0 + push constant 88 + eq + not + if-goto SquareGame_17 + push this 0 + call Square.incSize 1 + pop temp 0 + goto SquareGame_16 +label SquareGame_17 +label SquareGame_16 + push local 0 + push constant 131 + eq + not + if-goto SquareGame_19 + push constant 1 + pop this 1 + goto SquareGame_18 +label SquareGame_19 +label SquareGame_18 + push local 0 + push constant 133 + eq + not + if-goto SquareGame_21 + push constant 2 + pop this 1 + goto SquareGame_20 +label SquareGame_21 +label SquareGame_20 + push local 0 + push constant 130 + eq + not + if-goto SquareGame_23 + push constant 3 + pop this 1 + goto SquareGame_22 +label SquareGame_23 +label SquareGame_22 + push local 0 + push constant 132 + eq + not + if-goto SquareGame_25 + push constant 4 + pop this 1 + goto SquareGame_24 +label SquareGame_25 +label SquareGame_24 +label SquareGame_26 + push local 0 + push constant 0 + eq + not + not + if-goto SquareGame_27 + call Keyboard.keyPressed 0 + pop local 0 + push pointer 0 + call SquareGame.moveSquare 1 + pop temp 0 + goto SquareGame_26 +label SquareGame_27 + goto SquareGame_8 +label SquareGame_9 + push constant 0 + return`; diff --git a/web-ide-main/projects/src/samples/tst.ts b/web-ide-main/projects/src/samples/tst.ts new file mode 100644 index 0000000..b9a64c8 --- /dev/null +++ b/web-ide-main/projects/src/samples/tst.ts @@ -0,0 +1,12 @@ +export const TickTock = `// TickTock forever + +// Uncomment for a sample progam. Can use any program name in /samples +// ROM32K load Max.hack; + +// Uncomment to manually write a program. +// set ROM32K[0] %X4000; +// set ROM32K[1] %XF3C8; // M=-1 + +repeat { + tick, tock; +}`; diff --git a/web-ide-main/projects/src/samples/vm/fibonnaci.ts b/web-ide-main/projects/src/samples/vm/fibonnaci.ts new file mode 100644 index 0000000..9f7b440 --- /dev/null +++ b/web-ide-main/projects/src/samples/vm/fibonnaci.ts @@ -0,0 +1,30 @@ +export const FIB_MAIN = `function Main.fibonacci 0 + push argument 0 + push constant 2 + lt // checks if n<2 + if-goto IF_TRUE + goto IF_FALSE + label IF_TRUE // if n<2, return n + push argument 0 + return + label IF_FALSE // if n>=2, returns fib(n-2)+fib(n-1) + push argument 0 + push constant 2 + sub + call Main.fibonacci 1 // computes fib(n-2) + push argument 0 + push constant 1 + sub + call Main.fibonacci 1 // computes fib(n-1) + add // returns fib(n-1) + fib(n-2) + return`; + +export const FIB_SYS = ` +function Sys.init 0 + push constant 4 + call Main.fibonacci 1 // computes the 4'th fibonacci element +label WHILE + goto WHILE // loops infinitely +`; + +export const FIBONACCI = FIB_MAIN + FIB_SYS; diff --git a/web-ide-main/projects/src/samples/vm/vm.ts b/web-ide-main/projects/src/samples/vm/vm.ts new file mode 100644 index 0000000..32cf84a --- /dev/null +++ b/web-ide-main/projects/src/samples/vm/vm.ts @@ -0,0 +1,145 @@ +export const BRANCHING_FUNCTION = ` +// __implicit + push constant 3 + push constant 4 + call mult 2 + +// returns x * y as sum i = 0 to y x +// x = arg 0 +// y = arg 1 +// sum = local 0 +// i = local 1 +function mult 2 +label WHILE_LOOP + push local 1 + push argument 1 + lt + not + if-goto WHILE_END + push local 0 + push argument 0 + add + pop local 0 + push local 1 + push constant 1 + add + pop local 1 + goto WHILE_LOOP +label WHILE_END + push local 0 + return +`; + +export const NESTED_FUNCTION = ` +// Sys.vm for NestedCall test. + +// Sys.init() +// +// Calls Sys.main() and stores return value in temp 1. +// Does not return. (Enters infinite loop.) + +function Sys.init 0 +push constant 4000 // test THIS and THAT context save +pop pointer 0 +push constant 5000 +pop pointer 1 +call Sys.main 0 +pop temp 1 +label LOOP +goto LOOP + +// Sys.main() +// +// Sets locals 1, 2 and 3, leaving locals 0 and 4 unchanged to test +// default local initialization to 0. (RAM set to -1 by test setup.) +// Calls Sys.add12(123) and stores return value (135) in temp 0. +// Returns local 0 + local 1 + local 2 + local 3 + local 4 (456) to confirm +// that locals were not mangled by function call. + +function Sys.main 5 +push constant 4001 +pop pointer 0 +push constant 5001 +pop pointer 1 +push constant 200 +pop local 1 +push constant 40 +pop local 2 +push constant 6 +pop local 3 +push constant 123 +call Sys.add12 1 +pop temp 0 +push local 0 +push local 1 +push local 2 +push local 3 +push local 4 +add +add +add +add +return + +// Sys.add12(int n) +// +// Returns n+12. + +function Sys.add12 0 +push constant 4002 +pop pointer 0 +push constant 5002 +pop pointer 1 +push argument 0 +push constant 12 +add +return +`; + +export const STATIC_CLASS_1 = `function Class1.set 0 +push argument 0 +pop static 0 +push argument 1 +pop static 1 +push constant 0 +return + +// Returns static[0] - static[1]. +function Class1.get 0 +push static 0 +push static 1 +sub +return +`; +export const STATIC_CLASS_2 = `function Class2.set 0 +push argument 0 +pop static 0 +push argument 1 +pop static 1 +push constant 0 +return + +// Returns static[0] - static[1]. +function Class2.get 0 +push static 0 +push static 1 +sub +return +`; + +export const STATIC_SYS = `function Sys.init 0 +push constant 6 +push constant 8 +call Class1.set 2 +pop temp 0 // Dumps the return value +push constant 23 +push constant 15 +call Class2.set 2 +pop temp 0 // Dumps the return value +call Class1.get 0 +call Class2.get 0 +label WHILE +goto WHILE +`; + +export const STATIC = STATIC_CLASS_1 + STATIC_CLASS_2 + STATIC_SYS; diff --git a/web-ide-main/projects/src/testing/index.ts b/web-ide-main/projects/src/testing/index.ts new file mode 100644 index 0000000..992c5bc --- /dev/null +++ b/web-ide-main/projects/src/testing/index.ts @@ -0,0 +1,30 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; + +import * as project_01 from "./project_01/index.js"; +import * as project_02 from "./project_02/index.js"; +import * as project_03 from "./project_03/index.js"; +import * as project_05 from "./project_05/index.js"; + +export const ChipProjects = { + "01": project_01, + "02": project_02, + "03": project_03, + "05": project_05, +}; + +let reset = false; +export const loadSolutions = async (fs: FileSystem) => { + if (reset) return; // React will double-render a call to resetFiles in useEffect. + reset = true; + await project_01.loadSolutions(fs); + await project_02.loadSolutions(fs); + await project_03.loadSolutions(fs); + await project_05.loadSolutions(fs); + reset = false; +}; + +export const loaders = { + loadSolutions, +}; + +export default loaders; diff --git a/web-ide-main/projects/src/testing/project_01/01_not.ts b/web-ide-main/projects/src/testing/project_01/01_not.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/01_not.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/02_and.ts b/web-ide-main/projects/src/testing/project_01/02_and.ts new file mode 100644 index 0000000..6e48377 --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/02_and.ts @@ -0,0 +1,8 @@ +export const sol = `CHIP And { + IN a, b; + OUT out; + + PARTS: + Nand(a=a, b=b, out=x); + Not(in=x, out=out); +}`; diff --git a/web-ide-main/projects/src/testing/project_01/03_or.ts b/web-ide-main/projects/src/testing/project_01/03_or.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/03_or.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/04_xor.ts b/web-ide-main/projects/src/testing/project_01/04_xor.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/04_xor.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/05_mux.ts b/web-ide-main/projects/src/testing/project_01/05_mux.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/05_mux.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/06_dmux.ts b/web-ide-main/projects/src/testing/project_01/06_dmux.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/06_dmux.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/07_not16.ts b/web-ide-main/projects/src/testing/project_01/07_not16.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/07_not16.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/08_and16.ts b/web-ide-main/projects/src/testing/project_01/08_and16.ts new file mode 100644 index 0000000..731b49f --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/08_and16.ts @@ -0,0 +1,22 @@ +export const sol = `CHIP And16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + And (a=a[0], b=b[0], out=out[0]); + And (a=a[1], b=b[1], out=out[1]); + And (a=a[2], b=b[2], out=out[2]); + And (a=a[3], b=b[3], out=out[3]); + And (a=a[4], b=b[4], out=out[4]); + And (a=a[5], b=b[5], out=out[5]); + And (a=a[6], b=b[6], out=out[6]); + And (a=a[7], b=b[7], out=out[7]); + And (a=a[8], b=b[8], out=out[8]); + And (a=a[9], b=b[9], out=out[9]); + And (a=a[10], b=b[10], out=out[10]); + And (a=a[11], b=b[11], out=out[11]); + And (a=a[12], b=b[12], out=out[12]); + And (a=a[13], b=b[13], out=out[13]); + And (a=a[14], b=b[14], out=out[14]); + And (a=a[15], b=b[15], out=out[15]); +}`; diff --git a/web-ide-main/projects/src/testing/project_01/09_or16.ts b/web-ide-main/projects/src/testing/project_01/09_or16.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/09_or16.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/10_mux16.ts b/web-ide-main/projects/src/testing/project_01/10_mux16.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/10_mux16.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/11_mux4way16.ts b/web-ide-main/projects/src/testing/project_01/11_mux4way16.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/11_mux4way16.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/12_mux8way16.ts b/web-ide-main/projects/src/testing/project_01/12_mux8way16.ts new file mode 100644 index 0000000..0a8de9d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/12_mux8way16.ts @@ -0,0 +1,31 @@ +export const sol = `CHIP Mux8Way16 { + IN a[16], b[16], c[16], d[16], + e[16], f[16], g[16], h[16], + sel[3]; + OUT out[16]; + + PARTS: + // Binary tree of 2-way multiplexors + Mux16 (a=a, b=b, sel=sel[0], out=ab); + Mux16 (a=c, b=d, sel=sel[0], out=cd); + Mux16 (a=e, b=f, sel=sel[0], out=ef); + Mux16 (a=g, b=h, sel=sel[0], out=gh); + Mux16 (a=ab, b=cd, sel=sel[1], out=abcd); + Mux16 (a=ef, b=gh, sel=sel[1], out=efgh); + Mux16 (a=abcd, b=efgh, sel=sel[2], out=out); + + +// Alternate implementation +// +// This implementation replaces the upper two layers of the +// tree with 4-way multiplexors. +/* + Mux4Way16 (a=a, b=b, c=c, d=d, sel=sel[0..1], out=abcd); + Mux4Way16 (a=e, b=f, c=g, d=h, sel=sel[0..1], out=efgh); + Mux16 (a=abcd, b=efgh, sel=sel[2], out=out); +*/ + +// Alternate implementation +// +// Some students make a Mux8Way chip and apply it 16 times as in Not16. +}`; diff --git a/web-ide-main/projects/src/testing/project_01/13_dmux4way.ts b/web-ide-main/projects/src/testing/project_01/13_dmux4way.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/13_dmux4way.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/14_dmux8way.ts b/web-ide-main/projects/src/testing/project_01/14_dmux8way.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/14_dmux8way.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/15_or8way.ts b/web-ide-main/projects/src/testing/project_01/15_or8way.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/15_or8way.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_01/index.ts b/web-ide-main/projects/src/testing/project_01/index.ts new file mode 100644 index 0000000..1e3d84e --- /dev/null +++ b/web-ide-main/projects/src/testing/project_01/index.ts @@ -0,0 +1,71 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; + +import * as Not from "./01_not.js"; +import * as And from "./02_and.js"; +import * as Or from "./03_or.js"; +import * as Xor from "./04_xor.js"; +import * as Mux from "./05_mux.js"; +import * as DMux from "./06_dmux.js"; +import * as Not16 from "./07_not16.js"; +import * as And16 from "./08_and16.js"; +import * as Or16 from "./09_or16.js"; +import * as Mux16 from "./10_mux16.js"; +import * as Mux4Way16 from "./11_mux4way16.js"; +import * as Mux8Way16 from "./12_mux8way16.js"; +import * as DMux4Way from "./13_dmux4way.js"; +import * as DMux8Way from "./14_dmux8way.js"; +import * as Or8Way from "./15_or8way.js"; + +export const SOLS = { + Not: { + "Not.hdl": Not.sol, + }, + And: { + "And.hdl": And.sol, + }, + Or: { + "Or.hdl": Or.sol, + }, + XOr: { + "XOr.hdl": Xor.sol, + }, + Mux: { + "Mux.hdl": Mux.sol, + }, + DMux: { + "DMux.hdl": DMux.sol, + }, + Not16: { + "Not16.hdl": Not16.sol, + }, + And16: { + "And16.hdl": And16.sol, + }, + Or16: { + "Or16.hdl": Or16.sol, + }, + Mux16: { + "Mux16.hdl": Mux16.sol, + }, + Mux4Way16: { + "Mux4Way16.hdl": Mux4Way16.sol, + }, + Mux8Way16: { + "Mux8Way16.hdl": Mux8Way16.sol, + }, + DMux4Way: { + "DMux4Way.hdl": DMux4Way.sol, + }, + DMux8Way: { + "DMux8Way.hdl": DMux8Way.sol, + }, + Or8Way: { + "Or8Way.hdl": Or8Way.sol, + }, +}; + +export async function loadSolutions(fs: FileSystem): Promise { + await fs.pushd("/projects/01"); + await reset(fs, SOLS); + await fs.popd(); +} diff --git a/web-ide-main/projects/src/testing/project_02/01_half_adder.ts b/web-ide-main/projects/src/testing/project_02/01_half_adder.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_02/01_half_adder.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_02/02_full_adder.ts b/web-ide-main/projects/src/testing/project_02/02_full_adder.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_02/02_full_adder.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_02/03_add16.ts b/web-ide-main/projects/src/testing/project_02/03_add16.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_02/03_add16.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_02/04_inc16.ts b/web-ide-main/projects/src/testing/project_02/04_inc16.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_02/04_inc16.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_02/05_alu_no_stat.ts b/web-ide-main/projects/src/testing/project_02/05_alu_no_stat.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_02/05_alu_no_stat.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_02/06_alu.ts b/web-ide-main/projects/src/testing/project_02/06_alu.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_02/06_alu.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_02/index.ts b/web-ide-main/projects/src/testing/project_02/index.ts new file mode 100644 index 0000000..7f35eaa --- /dev/null +++ b/web-ide-main/projects/src/testing/project_02/index.ts @@ -0,0 +1,35 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; + +import * as HalfAdder from "./01_half_adder.js"; +import * as FullAdder from "./02_full_adder.js"; +import * as Add16 from "./03_add16.js"; +import * as Inc16 from "./04_inc16.js"; +import * as Alu from "./05_alu_no_stat.js"; +import * as AluStatus from "./06_alu.js"; + +export const SOLS = { + HalfAdder: { + "HalfAdder.hdl": HalfAdder.sol, + }, + FullAdder: { + "FullAdder.hdl": FullAdder.sol, + }, + Add16: { + "Add16.hdl": Add16.sol, + }, + Inc16: { + "Inc16.hdl": Inc16.sol, + }, + AluNoStat: { + "AluNoStat.hdl": Alu.sol, + }, + ALU: { + "ALU.hdl": AluStatus.sol, + }, +}; + +export async function loadSolutions(fs: FileSystem): Promise { + await fs.pushd("/projects/02"); + await reset(fs, SOLS); + await fs.popd(); +} diff --git a/web-ide-main/projects/src/testing/project_03/01_bit.ts b/web-ide-main/projects/src/testing/project_03/01_bit.ts new file mode 100644 index 0000000..b12f0f1 --- /dev/null +++ b/web-ide-main/projects/src/testing/project_03/01_bit.ts @@ -0,0 +1,9 @@ +export const sol = `CHIP Bit { + IN in, load; + OUT out; + + PARTS: + + Mux (a=dffOut, b=in, sel=load, out=muxOut); + DFF (in=muxOut, out=dffOut, out=out); +}`; diff --git a/web-ide-main/projects/src/testing/project_03/02_register.ts b/web-ide-main/projects/src/testing/project_03/02_register.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_03/02_register.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_03/03_pc.ts b/web-ide-main/projects/src/testing/project_03/03_pc.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_03/03_pc.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_03/04_ram8.ts b/web-ide-main/projects/src/testing/project_03/04_ram8.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_03/04_ram8.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_03/05_ram64.ts b/web-ide-main/projects/src/testing/project_03/05_ram64.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_03/05_ram64.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_03/06_ram512.ts b/web-ide-main/projects/src/testing/project_03/06_ram512.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_03/06_ram512.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_03/07_ram4k.ts b/web-ide-main/projects/src/testing/project_03/07_ram4k.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_03/07_ram4k.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_03/08_ram16k.ts b/web-ide-main/projects/src/testing/project_03/08_ram16k.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_03/08_ram16k.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_03/index.ts b/web-ide-main/projects/src/testing/project_03/index.ts new file mode 100644 index 0000000..34a3444 --- /dev/null +++ b/web-ide-main/projects/src/testing/project_03/index.ts @@ -0,0 +1,43 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; + +import * as Bit from "./01_bit.js"; +import * as Register from "./02_register.js"; +import * as PC from "./03_pc.js"; +import * as RAM8 from "./04_ram8.js"; +import * as RAM64 from "./05_ram64.js"; +import * as RAM512 from "./06_ram512.js"; +import * as RAM4k from "./07_ram4k.js"; +import * as RAM16k from "./08_ram16k.js"; + +export const SOLS = { + Bit: { + "Bit.hdl": Bit.sol, + }, + Register: { + "Register.hdl": Register.sol, + }, + PC: { + "PC.hdl": PC.sol, + }, + RAM8: { + "RAM8.hdl": RAM8.sol, + }, + RAM64: { + "RAM64.hdl": RAM64.sol, + }, + RAM512: { + "RAM512.hdl": RAM512.sol, + }, + RAM4k: { + "RAM4k.hdl": RAM4k.sol, + }, + RAM16k: { + "RAM16k.hdl": RAM16k.sol, + }, +}; + +export async function loadSolutions(fs: FileSystem): Promise { + await fs.pushd("/projects/03"); + await reset(fs, SOLS); + await fs.popd(); +} diff --git a/web-ide-main/projects/src/testing/project_05/01_memory.ts b/web-ide-main/projects/src/testing/project_05/01_memory.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_05/01_memory.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_05/02_cpu.ts b/web-ide-main/projects/src/testing/project_05/02_cpu.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_05/02_cpu.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_05/03_computer.ts b/web-ide-main/projects/src/testing/project_05/03_computer.ts new file mode 100644 index 0000000..3b7d47d --- /dev/null +++ b/web-ide-main/projects/src/testing/project_05/03_computer.ts @@ -0,0 +1 @@ +export const sol = `// REDACTED`; diff --git a/web-ide-main/projects/src/testing/project_05/index.ts b/web-ide-main/projects/src/testing/project_05/index.ts new file mode 100644 index 0000000..a4a0231 --- /dev/null +++ b/web-ide-main/projects/src/testing/project_05/index.ts @@ -0,0 +1,23 @@ +import { FileSystem, reset } from "@davidsouther/jiffies/lib/esm/fs.js"; + +import * as Memory from "./01_memory.js"; +import * as CPU from "./02_cpu.js"; +import * as Computer from "./03_computer.js"; + +export const SOLS = { + Memory: { + "Memory.hdl": Memory.sol, + }, + CPU: { + "CPU.hdl": CPU.sol, + }, + Computer: { + "Computer.hdl": Computer.sol, + }, +}; + +export async function loadSolutions(fs: FileSystem): Promise { + await fs.pushd("/projects/05"); + await reset(fs, SOLS); + await fs.popd(); +} diff --git a/web-ide-main/projects/tsconfig.json b/web-ide-main/projects/tsconfig.json new file mode 100644 index 0000000..1f131e8 --- /dev/null +++ b/web-ide-main/projects/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "build", + "rootDir": "src", + "tsBuildInfoFile": "build/.tsbuildinfo" + }, + "include": ["src"] +} diff --git a/web-ide-main/runner/data/Not.cmp b/web-ide-main/runner/data/Not.cmp new file mode 100644 index 0000000..7b64092 --- /dev/null +++ b/web-ide-main/runner/data/Not.cmp @@ -0,0 +1,3 @@ +| in | out | +| 0 | 1 | +| 1 | 0 | diff --git a/web-ide-main/runner/data/Not.out b/web-ide-main/runner/data/Not.out new file mode 100644 index 0000000..7b64092 --- /dev/null +++ b/web-ide-main/runner/data/Not.out @@ -0,0 +1,3 @@ +| in | out | +| 0 | 1 | +| 1 | 0 | diff --git a/web-ide-main/runner/data/Not.tst b/web-ide-main/runner/data/Not.tst new file mode 100644 index 0000000..4052f25 --- /dev/null +++ b/web-ide-main/runner/data/Not.tst @@ -0,0 +1,3 @@ +output-list in%B3.1.3 out%B3.1.3; +set in 0, eval, output; +set in 1, eval, output; diff --git a/web-ide-main/runner/package.json b/web-ide-main/runner/package.json new file mode 100644 index 0000000..5bfa763 --- /dev/null +++ b/web-ide-main/runner/package.json @@ -0,0 +1,28 @@ +{ + "name": "@nand2tetris/runner", + "version": "0.0.0", + "private": true, + "description": "", + "author": "David Souther ", + "license": "ISC", + "homepage": "https://davidsouther.github.io/nand2tetris", + "type": "module", + "exports": { + "./*": "./build/*" + }, + "typesVersions": { + "*": { + "*": [ + "build/*" + ] + } + }, + "dependencies": { + "@davidsouther/jiffies": "^2.2.5", + "@nand2tetris/projects": "file:../projects", + "@types/node": "^20.14.2" + }, + "scripts": { + "build": "tsc" + } +} diff --git a/web-ide-main/runner/src/index.ts b/web-ide-main/runner/src/index.ts new file mode 100644 index 0000000..b5b1cb8 --- /dev/null +++ b/web-ide-main/runner/src/index.ts @@ -0,0 +1,54 @@ +import { ExecException, ExecOptions, exec } from "node:child_process"; +import { dirname, join, parse } from "node:path"; +import type { Assignment } from "@nand2tetris/projects/base.js"; +import { Runner, RunResult } from "./types"; + +// Wrapper around `exec`, providing nand2tetris specific options and wrapping the result in a Promise. */ +export function run(cmd: string, options: ExecOptions = {}) { + return new Promise((resolve, reject) => { + exec(cmd, { windowsHide: true, ...options }, (error, stdout, stderr) => { + if (error !== null || stderr.length > 0) { + reject({ error, stderr }); + } else { + resolve(`${stdout}`); + } + }); + }); +} + +const NAND2TetrisPackage = "org.nand2tetris.hack.main"; +type NAND2TetrisMain = "HardwareSimulatorMain"; +const __dirname = dirname(new URL(import.meta.url).pathname); + +/** + * Runner to manage calling the provided nand2tetris.jar with appropriate args and mains. + */ +export class JavaRunner implements Runner { + /** When creating a runner, run the HDL test against the data file to ensure everything works. */ + static async try_init(installPath: string): Promise { + const runner = new JavaRunner(installPath); + const file = join(__dirname, "..", "..", "data", "Not.hdl"); + const { code } = await runner.hdl(parse(file)); + return code === 0 ? runner : undefined; + } + + private constructor(private readonly installPath: string) {} + + /** Run a .tst file for the given chip. */ + async hdl({ dir, name }: Assignment): Promise { + return this.exec("HardwareSimulatorMain", join(dir, `${name}.tst`)); + } + + /** Run a nand2tetris Java main, in command line mode, given a certain file. */ + async exec(main: NAND2TetrisMain, filePath: string): Promise { + try { + const fullMain = `${NAND2TetrisPackage}.${main}`; + const command = `java -classpath nand2tetris.jar ${fullMain} ${filePath}`; + const stdout = await run(command, { cwd: this.installPath }); + return { code: 0, stdout, stderr: "" }; + } catch (e: unknown) { + const { error, stderr } = e as { error?: ExecException; stderr: string }; + return { code: error?.code ?? 255, stderr, stdout: "" }; + } + } +} diff --git a/web-ide-main/runner/src/types.ts b/web-ide-main/runner/src/types.ts new file mode 100644 index 0000000..c88212d --- /dev/null +++ b/web-ide-main/runner/src/types.ts @@ -0,0 +1,11 @@ +import type { Assignment } from "@nand2tetris/projects/base.js"; + +export interface RunResult { + code: number; + stdout: string; + stderr: string; +} + +export interface Runner { + hdl({ dir, name }: Assignment): Promise; +} diff --git a/web-ide-main/runner/tsconfig.json b/web-ide-main/runner/tsconfig.json new file mode 100644 index 0000000..1f131e8 --- /dev/null +++ b/web-ide-main/runner/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "build", + "rootDir": "src", + "tsBuildInfoFile": "build/.tsbuildinfo" + }, + "include": ["src"] +} diff --git a/web-ide-main/simulator/babel.config.cjs b/web-ide-main/simulator/babel.config.cjs new file mode 100644 index 0000000..dd242dc --- /dev/null +++ b/web-ide-main/simulator/babel.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + ["@babel/preset-env", { targets: { node: "current" } }], + "@babel/preset-typescript", + ], +}; diff --git a/web-ide-main/simulator/jest.config.mjs b/web-ide-main/simulator/jest.config.mjs new file mode 100644 index 0000000..ccf0c4a --- /dev/null +++ b/web-ide-main/simulator/jest.config.mjs @@ -0,0 +1,11 @@ +/* + * For a detailed explanation regarding each configuration property, visit: + * https://jestjs.io/docs/configuration + */ + +export default { + moduleNameMapper: { "(.+)(?/src/setupTests.ts"], + transformIgnorePatterns: ["/node_modules/(?!@davidsouther/.*)"], +}; diff --git a/web-ide-main/simulator/package.json b/web-ide-main/simulator/package.json new file mode 100644 index 0000000..3d3aaaf --- /dev/null +++ b/web-ide-main/simulator/package.json @@ -0,0 +1,39 @@ +{ + "name": "@nand2tetris/simulator", + "version": "0.0.0", + "private": true, + "description": "", + "author": "David Souther ", + "license": "ISC", + "homepage": "https://davidsouther.github.io/nand2tetris", + "type": "module", + "exports": { + "./*": "./build/*" + }, + "typesVersions": { + "*": { + "*": [ + "build/*" + ] + } + }, + "dependencies": { + "@davidsouther/jiffies": "^2.2.5", + "@nand2tetris/projects": "file:../projects", + "@nand2tetris/runner": "file:../runner", + "@types/node": "^20.14.2", + "ohm-js": "^17.1.0", + "rxjs": "^7.8.1" + }, + "devDependencies": { + "@babel/preset-typescript": "^7.24.7", + "@types/jest": "^29.5.12", + "babel-jest": "^29.7.0", + "jest": "^29.7.0", + "jest-ts-webcompat-resolver": "^1.0.0" + }, + "scripts": { + "build": "tsc", + "test": "jest --verbose" + } +} diff --git a/web-ide-main/simulator/src/.gitignore b/web-ide-main/simulator/src/.gitignore new file mode 100644 index 0000000..a306801 --- /dev/null +++ b/web-ide-main/simulator/src/.gitignore @@ -0,0 +1 @@ +locales diff --git a/web-ide-main/simulator/src/chip/builder.test.ts b/web-ide-main/simulator/src/chip/builder.test.ts new file mode 100644 index 0000000..95fde94 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builder.test.ts @@ -0,0 +1,243 @@ +import { display } from "@davidsouther/jiffies/lib/esm/display.js"; +import { + FileSystem, + ObjectFileSystemAdapter, +} from "@davidsouther/jiffies/lib/esm/fs.js"; +import { unwrap } from "@davidsouther/jiffies/lib/esm/result.js"; +import { HDL } from "../languages/hdl.js"; +import { bin } from "../util/twos.js"; +import { build, parse } from "./builder.js"; +import { Chip, HIGH, LOW } from "./chip.js"; + +function asDisplay(e: unknown): string { + return display( + (e as { message: string }).message ?? + (e as { shortMessage: string }).shortMessage ?? + e, + ); +} + +describe("Chip Builder", () => { + it("builds a chip from a string", async () => { + const nand = unwrap( + await parse( + `CHIP Not { IN in; OUT out; PARTS: Nand(a=in, b=in, out=out); }`, + ), + ); + + nand.in().pull(LOW); + nand.eval(); + expect(nand.out().voltage()).toBe(HIGH); + + nand.in().pull(HIGH); + nand.eval(); + expect(nand.out().voltage()).toBe(LOW); + }); + + it("builds and evals a chip with subbus components", async () => { + let foo: Chip; + try { + foo = unwrap( + await parse( + `CHIP Foo { + IN six[3]; + OUT out; + PARTS: Not16( + in[0..1] = true, + in[3..5] = six, + in[7] = true, + ); + }`, + ), + ); + } catch (e) { + throw new Error(asDisplay(e)); + } + const six = foo.in("six"); + six.busVoltage = 6; + foo.eval(); + const inVoltage = [...foo.parts][0].in().busVoltage; + expect(bin(inVoltage)).toBe(bin(0b10110011)); + + // const outVoltage = foo.pin("out1").busVoltage; + // expect(outVoltage).toBe(0b01001); + // expect(outVoltage).toBe(0b11001); + }); + + it("builds and evals a chip with subpins", async () => { + let foo: Chip; + try { + foo = unwrap( + await parse(` + CHIP Not2 { + IN in[2]; + OUT out[2]; + PARTS: + Not(in=in[0], out=out[0]); + Not(in=in[1], out=out[1]); + } + `), + ); + } catch (e) { + throw new Error(asDisplay(e)); + } + + foo.in().busVoltage = 0b00; + foo.eval(); + expect(foo.out().busVoltage).toBe(0b11); + + foo.in().busVoltage = 0b11; + foo.eval(); + expect(foo.out().busVoltage).toBe(0b00); + }); + + it("builds and evals a chip with subbus components on the right", async () => { + let foo: Chip; + try { + foo = unwrap( + await parse( + `CHIP Foo { + IN in[16]; + OUT out[5]; + PARTS: Not16( + in[0..7] = in[4..11], + // in[8..15] = false, + out[3..5] = out[1..3], + ); + }`, + ), + ); + } catch (e) { + throw new Error(asDisplay(e)); + } + + foo.in().busVoltage = 0b1010_1100_0011_0101; + foo.eval(); + const inVoltage = [...foo.parts][0].in().busVoltage; + const outVoltage = foo.out().busVoltage; + expect(bin(inVoltage)).toBe(bin(0b11000011)); + expect(bin(outVoltage)).toBe(bin(0b01110)); + }); + + it("looks up unknown chips in fs", async () => { + const fs = new FileSystem( + new ObjectFileSystemAdapter({ "Copy.hdl": COPY_HDL }), + ); + + let foo: Chip; + + try { + const chip = unwrap(await HDL.parse(USE_COPY_HDL)); + foo = unwrap(await build({ parts: chip, dir: ".", fs })); + } catch (e) { + throw new Error(asDisplay(e)); + } + + foo.in("a").pull(HIGH); + foo.eval(); + expect(foo.out("b").busVoltage).toBe(1); + + foo.in("a").pull(LOW); + foo.eval(); + expect(foo.out("b").busVoltage).toBe(0); + }); + + it("returns error for mismatching input width", async () => { + try { + const chip = unwrap( + HDL.parse(`CHIP Foo { + IN in[3]; OUT out; + PARTS: Or8Way(in=in, out=out); + }`), + ); + const foo = await build({ parts: chip }); + expect(foo).toBeErr(); + } catch (e) { + throw new Error(asDisplay(e)); + } + }); + + it("returns error for mismatching output width", async () => { + try { + const chip = unwrap( + HDL.parse(`CHIP Foo { + IN in; OUT out[5]; + PARTS: Not(in=in, out=out); + }`), + ); + const foo = await build({ parts: chip }); + expect(foo).toBeErr(); + } catch (e) { + throw new Error(asDisplay(e)); + } + }); + + it("returns error for wire loop", async () => { + try { + const chip = unwrap( + HDL.parse(`CHIP Not { + IN in; + OUT out; + PARTS: + Nand(a=in, b=myNand, out=myNand); + }`), + ); + const foo = await build({ parts: chip }); + expect(foo).toBeErr(); + } catch (e) { + throw new Error(asDisplay(e)); + } + }); + + it("returns error for part loop", async () => { + try { + const chip = unwrap( + HDL.parse(`CHIP Not { + IN in; + OUT out; + PARTS: + Nand(a=in, b=b, out=c); + Nand(a=in, b=c, out=b); + }`), + ); + const foo = await build({ parts: chip }); + expect(foo).toBeErr(); + } catch (e) { + throw new Error(asDisplay(e)); + } + }); + + it("sorts after wiring", async () => { + try { + const chip = unwrap( + HDL.parse(`CHIP Or { IN a, b; OUT out; + PARTS: + Not(in =b , out = net2); + Nand(a = net, b =net2 , out =out ); + Not(in =a , out = net); +}`), + ); + const orA = await build({ parts: chip }); + expect(orA).toBeOk(); + + const ora = unwrap(orA); + + ora.in("a").pull(HIGH); + ora.in("b").pull(LOW); + ora.eval(); + expect(ora.out("out").busVoltage).toBe(HIGH); + } catch (e) { + throw new Error(asDisplay(e)); + } + }); +}); + +const USE_COPY_HDL = `CHIP UseCopy { + IN a; OUT b; + PARTS: Copy(in=a, out=b); +}`; + +const COPY_HDL = `CHIP Copy { + IN in; OUT out; + PARTS: Or(a=in, b=in, out=out); +}`; diff --git a/web-ide-main/simulator/src/chip/builder.ts b/web-ide-main/simulator/src/chip/builder.ts new file mode 100644 index 0000000..bb17fae --- /dev/null +++ b/web-ide-main/simulator/src/chip/builder.ts @@ -0,0 +1,532 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { + Err, + isErr, + isOk, + Ok, + Result, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import { CompilationError, createError, Span } from "../languages/base.js"; +import { HDL, HdlParse, Part, PinParts } from "../languages/hdl.js"; +import { getBuiltinChip, hasBuiltinChip } from "./builtins/index.js"; +import { Chip, Connection, isConstantPin } from "./chip.js"; + +function pinWidth(pin: PinParts): Result { + const start = pin.start ?? 0; + if (pin.end === undefined) { + return Ok(undefined); + } + if (pin.end >= start) { + return Ok(pin.end - start + 1); + } + return Err( + createError( + `Bus start index should be less than or equal to bus end index`, + pin.span, + ), + ); +} + +export async function parse( + code: string, + dir?: string, + name?: string, + fs?: FileSystem, +): Promise> { + const parsed = HDL.parse(code.toString()); + if (isErr(parsed)) { + return parsed; + } + return build({ parts: Ok(parsed), dir, name, fs }); +} + +export async function loadChip( + name: string, + dir?: string, + fs?: FileSystem, +): Promise> { + if (hasBuiltinChip(name) || fs === undefined) { + return await getBuiltinChip(name); + } + try { + const file = await fs.readFile(`${dir}/${name}.hdl`); + const maybeParsedHDL = HDL.parse(file); + + let maybeChip: Result; + if (isOk(maybeParsedHDL)) { + const maybeBuilt = await build({ + parts: Ok(maybeParsedHDL), + dir, + name, + fs, + }); + if (isErr(maybeBuilt)) { + maybeChip = Err(new Error(Err(maybeBuilt).message)); + } else { + maybeChip = maybeBuilt; + } + } else { + maybeChip = Err(new Error("HDL Was not parsed")); + } + + return maybeChip; + } catch (_e) { + return Err(new Error(`Could not load chip ${name}.hdl` /*, { cause: e }*/)); + } +} + +export async function build( + ...args: Parameters +): Promise> { + return await ChipBuilder.build(...args); +} + +interface InternalPin { + isDefined: boolean; + firstUse: Span; + width?: number; +} + +interface WireData { + partChip: Chip; + lhs: PinParts; + rhs: PinParts; +} + +function getSubBusWidth(pin: PinParts): number | undefined { + if (pin.start != undefined && pin.end != undefined) { + return pin.end - pin.start + 1; + } + return undefined; +} + +function display(pin: PinParts): string { + if (pin.start != undefined && pin.end != undefined) { + return `${pin.pin}[${pin.start}..${pin.end}]`; + } + return pin.pin; +} + +function createConnection( + lhs: PinParts, + rhs: PinParts, +): Result { + const lhsWidth = pinWidth(lhs); + const rhsWidth = pinWidth(rhs); + if (isErr(lhsWidth)) { + return lhsWidth; + } + if (isErr(rhsWidth)) { + return rhsWidth; + } + + return Ok({ + to: { + name: lhs.pin.toString(), + start: lhs.start ?? 0, + width: Ok(lhsWidth), + }, + from: { + name: rhs.pin.toString(), + start: rhs.start ?? 0, + width: Ok(rhsWidth), + }, + }); +} + +function getIndices(pin: PinParts): number[] { + if (pin.start != undefined && pin.end != undefined) { + const indices = []; + for (let i = pin.start; i <= pin.end; i++) { + indices.push(i); + } + return indices; + } + return [-1]; +} + +function checkMultipleAssignments( + pin: PinParts, + assignedIndexes: Map>, +): Result { + let errorIndex: number | undefined = undefined; // -1 stands for the whole bus width + const indices = assignedIndexes.get(pin.pin); + if (!indices) { + assignedIndexes.set(pin.pin, new Set(getIndices(pin))); + } else { + if (indices.has(-1)) { + errorIndex = pin.start ?? -1; + } else if (pin.start !== undefined && pin.end !== undefined) { + for (const i of getIndices(pin)) { + if (indices.has(i)) { + errorIndex = i; + } + indices.add(i); + } + } else { + indices.add(-1); + } + } + if (errorIndex != undefined) { + return Err( + createError( + `Cannot write to pin ${pin.pin}${ + errorIndex != -1 ? `[${errorIndex}]` : "" + } multiple times`, + pin.span, + ), + ); + } + return Ok(); +} + +class ChipBuilder { + private parts: HdlParse; + private fs?: FileSystem; + private dir?: string; + private expectedName?: string; + + private chip: Chip; + private internalPins: Map = new Map(); + private inPins: Map> = new Map(); + private outPins: Map> = new Map(); + private wires: WireData[] = []; + + static build(options: { + parts: HdlParse; + fs?: FileSystem; + dir?: string; + name?: string; + }) { + return new ChipBuilder(options).build(); + } + + private constructor({ + parts, + fs, + dir, + name, + }: { + parts: HdlParse; + fs?: FileSystem; + dir?: string; + name?: string; + }) { + this.parts = parts; + this.expectedName = name; + this.dir = dir; + this.fs = fs; + this.chip = new Chip( + parts.ins.map(({ pin, width }) => ({ pin: pin.toString(), width })), + parts.outs.map(({ pin, width }) => ({ pin: pin.toString(), width })), + parts.name.value, + [], + parts.clocked, + ); + } + + async build(): Promise> { + if (this.expectedName && this.parts.name.value != this.expectedName) { + return Err(createError(`Wrong chip name`, this.parts.name.span)); + } + + if (this.parts.parts === "BUILTIN") { + return await getBuiltinChip(this.parts.name.value); + } + + const result = await this.wireParts(); + if (isErr(result)) { + return result; + } + + this.chip.clockedPins = new Set( + [...this.chip.ins.entries(), ...this.chip.outs.entries()] + .map((pin) => pin.name) + .filter((pin) => this.chip.isClockedPin(pin)), + ); + + // Reset clock order after wiring sub-pins + for (const part of this.chip.parts) { + part.subscribeToClock(); + } + + return Ok(this.chip); + } + + private async wireParts(): Promise> { + if (this.parts.parts === "BUILTIN") { + return Ok(); + } + + for (const part of this.parts.parts) { + const builtin = await loadChip(part.name, this.dir, this.fs); + if (isErr(builtin)) { + return Err(createError(`Undefined chip name: ${part.name}`, part.span)); + } + const partChip = Ok(builtin); + if (partChip.name == this.chip.name) { + return Err( + createError( + `Cannot use chip ${partChip.name} to implement itself`, + part.span, + ), + ); + } + const result = this.wirePart(part, partChip); + if (isErr(result)) { + return result; + } + } + let result = this.validateInternalPins(); + if (isErr(result)) { + return result; + } + // We need to check this at the end because during wiring we might not know the width of some internal pins + result = this.validateWireWidths(); + if (isErr(result)) { + return result; + } + return Ok(); + } + + private checkLoops( + part: Part, + partChip: Chip, + ): Result { + const ins = new Set(); + const outs = new Set(); + + let loop: string | undefined = undefined; + for (const { lhs, rhs } of part.wires) { + if (partChip.isInPin(lhs.pin)) { + if (outs.has(rhs.pin)) { + loop = rhs.pin; + break; + } else { + ins.add(rhs.pin); + } + } else if (partChip.isOutPin(lhs.pin)) { + if (ins.has(rhs.pin)) { + loop = rhs.pin; + break; + } else { + outs.add(rhs.pin); + } + } + } + if (loop) { + return Err(createError(`Looping wire ${loop}`, part.span)); + } + return Ok(); + } + + private wirePart(part: Part, partChip: Chip): Result { + const result = this.checkLoops(part, partChip); + if (isErr(result)) { + return result; + } + + const connections: Connection[] = []; + this.inPins.clear(); + for (const { lhs, rhs } of part.wires) { + const result = this.validateWire(partChip, lhs, rhs); + if (isErr(result)) { + return result; + } + const connection = createConnection(lhs, rhs); + if (isErr(connection)) { + return connection; + } + connections.push(Ok(connection)); + } + + try { + const result = this.chip.wire(partChip, connections); + if (isErr(result)) { + const error = Err(result); + return Err( + createError( + error.message, + error.lhs + ? part.wires[error.wireIndex].lhs.span + : part.wires[error.wireIndex].rhs.span, + ), + ); + } + this.chip.sortParts(); + return Ok(); + } catch (e) { + return Err(createError((e as Error).message, part.span)); + } + } + + private validateWire( + partChip: Chip, + lhs: PinParts, + rhs: PinParts, + ): Result { + if (partChip.isInPin(lhs.pin)) { + const result = this.validateInputWire(lhs, rhs); + if (isErr(result)) { + return result; + } + } else if (partChip.isOutPin(lhs.pin)) { + const result = this.validateOutputWire(partChip, lhs, rhs); + if (isErr(result)) { + return result; + } + } else { + return Err(createError(`Undefined pin name: ${lhs.pin}`, lhs.span)); + } + if (!isConstantPin(rhs.pin)) { + this.wires.push({ partChip: partChip, lhs, rhs }); + } + return Ok(); + } + + private validateInputWire( + lhs: PinParts, + rhs: PinParts, + ): Result { + let result = this.validateInputSource(rhs); + if (isErr(result)) { + return result; + } + result = checkMultipleAssignments(lhs, this.inPins); + if (isErr(result)) { + return result; + } + + // track internal pin use to detect undefined pins + if (this.chip.isInternalPin(rhs.pin)) { + const pinData = this.internalPins.get(rhs.pin); + if (pinData == undefined) { + this.internalPins.set(rhs.pin, { + isDefined: false, + firstUse: rhs.span, + }); + } else { + pinData.firstUse = + pinData.firstUse.start < rhs.span.start ? pinData.firstUse : rhs.span; + } + } + return Ok(); + } + + private validateOutputWire( + partChip: Chip, + lhs: PinParts, + rhs: PinParts, + ): Result { + let result = this.validateWriteTarget(rhs); + if (isErr(result)) { + return result; + } + + if (this.chip.isOutPin(rhs.pin)) { + result = checkMultipleAssignments(rhs, this.outPins); + if (isErr(result)) { + return result; + } + } else { + // rhs is necessarily an internal pin + if (rhs.start !== undefined || rhs.end !== undefined) { + return Err( + createError( + `Internal pins (in this case: ${rhs.pin}) cannot be subscripted or indexed`, + rhs.span, + ), + ); + } + // track internal pin creation to detect undefined pins + const pinData = this.internalPins.get(rhs.pin); + const width = getSubBusWidth(lhs) ?? partChip.get(lhs.pin)?.width; + if (pinData == undefined) { + this.internalPins.set(rhs.pin, { + isDefined: true, + firstUse: rhs.span, + width, + }); + } else { + if (pinData.isDefined) { + return Err( + createError(`Internal pin ${rhs.pin} already defined`, rhs.span), + ); + } + pinData.isDefined = true; + pinData.width = width; + } + } + return Ok(); + } + + private validateWriteTarget(rhs: PinParts): Result { + if (this.chip.isInPin(rhs.pin)) { + return Err(createError(`Cannot write to input pin ${rhs.pin}`, rhs.span)); + } + if (isConstantPin(rhs.pin)) { + return Err( + createError(`Internal pin name cannot be "true" or "false"`, rhs.span), + ); + } + return Ok(); + } + + private validateInputSource(rhs: PinParts): Result { + if (this.chip.isOutPin(rhs.pin)) { + return Err(createError(`Cannot use output pin as input`, rhs.span)); + } else if (!this.chip.isInPin(rhs.pin) && rhs.start != undefined) { + return Err( + createError( + isConstantPin(rhs.pin) + ? `Constant bus cannot be subscripted or indexed` + : `Internal pins (in this case: ${rhs.pin}) cannot be subscripted or indexed`, + rhs.span, + ), + ); + } + return Ok(); + } + + private validateInternalPins(): Result { + for (const [name, pinData] of this.internalPins) { + if (!pinData.isDefined) { + return Err( + createError( + name.toLowerCase() == "true" || name.toLowerCase() == "false" + ? `The constant bus ${name.toLowerCase()} must be in lower-case` + : `Undefined internal pin name: ${name}`, + pinData.firstUse, + ), + ); + } + } + return Ok(); + } + + private validateWireWidths(): Result { + for (const wire of this.wires) { + const lhsWidth = + getSubBusWidth(wire.lhs) ?? wire.partChip.get(wire.lhs.pin)?.width; + const rhsWidth = + getSubBusWidth(wire.rhs) ?? + this.chip.get(wire.rhs.pin)?.width ?? + this.internalPins.get(wire.rhs.pin)?.width; + if (lhsWidth != rhsWidth) { + return Err( + createError( + `Different bus widths: ${display( + wire.lhs, + )}(${lhsWidth}) and ${display(wire.rhs)}(${rhsWidth})`, + { + start: wire.lhs.span.start, + end: wire.rhs.span.end, + line: wire.lhs.span.line, + }, + ), + ); + } + } + return Ok(); + } +} diff --git a/web-ide-main/simulator/src/chip/builtin.ts b/web-ide-main/simulator/src/chip/builtin.ts new file mode 100644 index 0000000..fd7bd49 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtin.ts @@ -0,0 +1,30 @@ +import { Memory } from "./builtins/computer/computer.js"; +import { RAM } from "./builtins/sequential/ram.js"; +import { Chip, Pin } from "./chip.js"; + +export function getBuiltinValue( + chip: string, + part: Chip, + idx: number, +): Pin | undefined { + switch (chip) { + case "Register": + case "ARegister": + case "DRegister": + case "PC": + case "KEYBOARD": + return part.out(); + case "RAM8": + case "RAM64": + case "RAM512": + case "RAM4K": + case "RAM16K": + case "ROM32K": + case "Screen": + return (part as RAM).at(idx); + case "Memory": + return (part as Memory).at(idx); + default: + return undefined; + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/all.test.ts b/web-ide-main/simulator/src/chip/builtins/all.test.ts new file mode 100644 index 0000000..ac6f5a4 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/all.test.ts @@ -0,0 +1,72 @@ +import { + FileSystem, + ObjectFileSystemAdapter, +} from "@davidsouther/jiffies/lib/esm/fs.js"; +import { Ok, unwrap } from "@davidsouther/jiffies/lib/esm/result.js"; +import { CHIP_PROJECTS } from "@nand2tetris/projects/base.js"; +import { ChipProjects } from "@nand2tetris/projects/full.js"; +import { Max } from "@nand2tetris/projects/samples/hack.js"; +import { compare } from "../../compare.js"; +import { CMP, Cmp } from "../../languages/cmp.js"; +import { HDL, HdlParse } from "../../languages/hdl.js"; +import { TST, Tst } from "../../languages/tst.js"; +import { ChipTest } from "../../test/chiptst.js"; +import { build } from "../builder.js"; +import { Chip } from "../chip.js"; + +const SKIP = new Set(["Computer", "Memory"]); + +describe("All Projects", () => { + describe.each(Object.keys(CHIP_PROJECTS))("project %s", (project) => { + it.each( + CHIP_PROJECTS[project as keyof typeof CHIP_PROJECTS].filter( + (k) => !SKIP.has(k), + ), + )("Builtin %s", async (chipName) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const ChipProject = ChipProjects[project].CHIPS; + let hdlFile: string = ChipProject[`${chipName}.hdl`]; + const tstFile: string = ChipProject[`${chipName}.tst`]; + const cmpFile: string = ChipProject[`${chipName}.cmp`]; + + expect(hdlFile).toBeDefined(); + expect(tstFile).toBeDefined(); + expect(cmpFile).toBeDefined(); + + const partsIdx = hdlFile.indexOf("PARTS:"); + expect(partsIdx).toBeGreaterThan(0); + hdlFile = hdlFile.substring(0, partsIdx) + "BUILTIN; }"; + const hdl = HDL.parse(hdlFile); + expect(hdl).toBeOk(); + const tst = TST.parse(tstFile); + expect(tst).toBeOk(); + + const chip = await build({ parts: Ok(hdl as Ok) }); + expect(chip).toBeOk(); + const test = unwrap(ChipTest.from(Ok(tst as Ok))).with( + Ok(chip as Ok), + ); + + if (project === "05") { + test.setFileSystem( + new FileSystem( + new ObjectFileSystemAdapter({ "/samples/Max.hack": Max }), + ), + ); + } + + await test.run(); + + const outFile = test.log(); + + const cmp = CMP.parse(cmpFile); + expect(cmp).toBeOk(); + const out = CMP.parse(outFile); + expect(out).toBeOk(); + + const diffs = compare(Ok(cmp as Ok), Ok(out as Ok)); + expect(diffs).toHaveNoDiff(); + }); + }); +}); diff --git a/web-ide-main/simulator/src/chip/builtins/arithmetic/add_16.ts b/web-ide-main/simulator/src/chip/builtins/arithmetic/add_16.ts new file mode 100644 index 0000000..d66d6ff --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/arithmetic/add_16.ts @@ -0,0 +1,18 @@ +import { Chip } from "../../chip.js"; + +export function add16(a: number, b: number): [number] { + return [(a + b) & 0xffff]; +} + +export class Add16 extends Chip { + constructor() { + super(["a[16]", "b[16]"], ["out[16]"], "Add16"); + } + + override eval() { + const a = this.in("a").busVoltage; + const b = this.in("b").busVoltage; + const [out] = add16(a, b); + this.out().busVoltage = out; + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/arithmetic/alu.tsx b/web-ide-main/simulator/src/chip/builtins/arithmetic/alu.tsx new file mode 100644 index 0000000..782fe21 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/arithmetic/alu.tsx @@ -0,0 +1,147 @@ +import { alu, alua, COMMANDS_OP, Flags } from "../../../cpu/alu.js"; +import { Chip, HIGH, LOW } from "../../chip.js"; + +export class ALUNoStat extends Chip { + constructor() { + super( + [ + "x[16]", + "y[16]", // 16-bit inputs + "zx", // zero the x input? + "nx", // negate the x input? + "zy", // zero the y input? + "ny", // negate the y input? + "f", // compute out = x + y (if 1) or x & y (if 0) + "no", // negate the out output? + ], + [ + "out[16]", // 16-bit output + ], + "ALU", + ); + } + + override eval() { + const x = this.in("x").busVoltage; + const y = this.in("y").busVoltage; + const zx = this.in("zx").busVoltage << 5; + const nx = this.in("nx").busVoltage << 4; + const zy = this.in("zy").busVoltage << 3; + const ny = this.in("ny").busVoltage << 2; + const f = this.in("f").busVoltage << 1; + const no = this.in("no").busVoltage << 0; + const op = zx + nx + zy + ny + f + no; + + const [out] = alu(op, x, y); + + this.out().busVoltage = out; + } +} + +export class ALU extends Chip { + constructor() { + super( + [ + "x[16]", + "y[16]", // 16-bit inputs + "zx", // zero the x input? + "nx", // negate the x input? + "zy", // zero the y input? + "ny", // negate the y input? + "f", // compute out = x + y (if 1) or x & y (if 0) + "no", // negate the out output? + ], + [ + "out[16]", // 16-bit output + "zr", // 1 if (out === 0), 0 otherwise + "ng", // 1 if (out < 0), 0 otherwise + ], + "ALU", + ); + } + + override eval() { + const x = this.in("x").busVoltage; + const y = this.in("y").busVoltage; + const zx = this.in("zx").busVoltage << 5; + const nx = this.in("nx").busVoltage << 4; + const zy = this.in("zy").busVoltage << 3; + const ny = this.in("ny").busVoltage << 2; + const f = this.in("f").busVoltage << 1; + const no = this.in("no").busVoltage << 0; + const op = zx + nx + zy + ny + f + no; + + const [out, flags] = alu(op, x, y); + + const ng = flags === Flags.Negative ? HIGH : LOW; + const zr = flags === Flags.Zero ? HIGH : LOW; + this.out("out").busVoltage = out; + this.out("ng").pull(ng); + this.out("zr").pull(zr); + } + + op(): COMMANDS_OP { + const zx = this.in("zx").busVoltage << 5; + const nx = this.in("nx").busVoltage << 4; + const zy = this.in("zy").busVoltage << 3; + const ny = this.in("ny").busVoltage << 2; + const f = this.in("f").busVoltage << 1; + const no = this.in("no").busVoltage << 0; + const op = zx + nx + zy + ny + f + no; + return op as COMMANDS_OP; + } +} + +export class ALUAll extends Chip { + constructor() { + super( + [ + "x[16]", + "y[16]", // 16-bit inputs + "zx", // zero the x input? + "nx", // negate the x input? + "zy", // zero the y input? + "ny", // negate the y input? + "f", // compute out = x + y (if 1) or x & y (if 0) + "no", // negate the out output? + ], + [ + "out[16]", // 16-bit output + "zr", // 1 if (out === 0), 0 otherwise + "ng", // 1 if (out < 0), 0 otherwise + ], + "ALU", + ); + } + + override eval() { + const x = this.in("x").busVoltage; + const y = this.in("y").busVoltage; + const zx = this.in("zx").busVoltage << 5; + const nx = this.in("nx").busVoltage << 4; + const zy = this.in("zy").busVoltage << 3; + const ny = this.in("ny").busVoltage << 2; + const f = this.in("f").busVoltage << 1; + const no = this.in("no").busVoltage << 0; + const op = zx + nx + zy + ny + f + no; + + const [out, flags] = alua(op, x, y); + + const ng = flags === Flags.Negative ? HIGH : LOW; + const zr = flags === Flags.Zero ? HIGH : LOW; + this.out("out").busVoltage = out; + this.out("ng").pull(ng); + this.out("zr").pull(zr); + } + + op(): COMMANDS_OP { + const zx = this.in("zx").busVoltage << 5; + const nx = this.in("nx").busVoltage << 4; + const zy = this.in("zy").busVoltage << 3; + const ny = this.in("ny").busVoltage << 2; + const f = this.in("f").busVoltage << 1; + const no = this.in("no").busVoltage << 0; + const op = zx + nx + zy + ny + f + no; + return op as COMMANDS_OP; + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/arithmetic/full_adder.ts b/web-ide-main/simulator/src/chip/builtins/arithmetic/full_adder.ts new file mode 100644 index 0000000..fe8dece --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/arithmetic/full_adder.ts @@ -0,0 +1,30 @@ +import { Chip, Voltage } from "../../chip.js"; +import { or } from "../logic/or.js"; +import { halfAdder } from "./half_adder.js"; + +export function fullAdder( + a: Voltage, + b: Voltage, + c: Voltage, +): [Voltage, Voltage] { + const [s, ca] = halfAdder(a, b); + const [sum, cb] = halfAdder(s, c); + const [carry] = or(ca, cb); + + return [sum, carry]; +} + +export class FullAdder extends Chip { + constructor() { + super(["a", "b", "c"], ["sum", "carry"]); + } + + override eval() { + const a = this.in("a").voltage(); + const b = this.in("b").voltage(); + const c = this.in("c").voltage(); + const [sum, carry] = fullAdder(a, b, c); + this.out("sum").pull(sum); + this.out("carry").pull(carry); + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/arithmetic/half_adder.ts b/web-ide-main/simulator/src/chip/builtins/arithmetic/half_adder.ts new file mode 100644 index 0000000..eb87767 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/arithmetic/half_adder.ts @@ -0,0 +1,22 @@ +import { Chip, HIGH, LOW, Voltage } from "../../chip.js"; + +export function halfAdder(a: Voltage, b: Voltage): [Voltage, Voltage] { + const sum = (a === 1 && b === 0) || (a === 0 && b === 1) ? HIGH : LOW; + const car = a === 1 && b === 1 ? HIGH : LOW; + + return [sum, car]; +} + +export class HalfAdder extends Chip { + constructor() { + super(["a", "b"], ["sum", "carry"]); + } + + override eval() { + const a = this.in("a").voltage(); + const b = this.in("b").voltage(); + const [sum, carry] = halfAdder(a, b); + this.out("sum").pull(sum); + this.out("carry").pull(carry); + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/arithmetic/inc16.ts b/web-ide-main/simulator/src/chip/builtins/arithmetic/inc16.ts new file mode 100644 index 0000000..3f1dd71 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/arithmetic/inc16.ts @@ -0,0 +1,18 @@ +import { Chip } from "../../chip.js"; +import { add16 } from "./add_16.js"; + +export function inc16(n: number): [number] { + return add16(n, 1); +} + +export class Inc16 extends Chip { + constructor() { + super(["in[16]"], ["out[16]"], "Inc16"); + } + + override eval() { + const a = this.in().busVoltage; + const [out] = inc16(a); + this.out().busVoltage = out; + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/builtinOverrides.ts b/web-ide-main/simulator/src/chip/builtins/builtinOverrides.ts new file mode 100644 index 0000000..c2e699d --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/builtinOverrides.ts @@ -0,0 +1,46 @@ +export const builtinOverrides: Record = { + CPU: `CHIP CPU { + + IN inM[16], // M value input (M = contents of RAM[A]) + instruction[16], // Instruction for execution + reset; // Signals whether to re-start the current + // program (reset==1) or continue executing + // the current program (reset==0). + + OUT outM[16], // M value output + writeM, // Write to M? + addressM[15], // Address in data memory (of M) + pc[15]; // address of next instruction + + PARTS: + Mux16(a=instruction, b=ALUoutput, sel=instruction[15], out=Ainput); + Not(in=instruction[15], out=Ainstruction); + Or(a=Ainstruction, b=instruction[5], out=loadA); + ARegister(in=Ainput, load=loadA, out=Aoutput, out[0..14]=addressM); + + And(a=instruction[15], b=instruction[4], out=loadD); + DRegister(in=ALUoutput, load=loadD, out=Doutput); + + Mux16(a=Aoutput, b=inM, sel=instruction[12], out=ALUsecondInput); + + ALU(x=Doutput, y=ALUsecondInput, + zx=instruction[11], nx=instruction[10], + zy=instruction[9], ny=instruction[8], + f=instruction[7], no=instruction[6], + out=ALUoutput, out=outM, ng=negative, zr=zero); + + And(a=instruction[15], b=instruction[3], out=writeM); + + Or(a=negative, b=zero, out=notPositive); + Not(in=notPositive, out=positive); + + And(a=positive, b=instruction[0], out=j1); + And(a=zero, b=instruction[1], out=j2); + And(a=negative, b=instruction[2], out=j3); + Or(a=j1, b=j2, out=jTemp); + Or(a=jTemp, b=j3, out=jumpIfC); + And(a=jumpIfC, b=instruction[15], out=jump); + + PC(reset=reset, inc=true, load=jump, in=Aoutput, out[0..14]=pc); +}`, +}; diff --git a/web-ide-main/simulator/src/chip/builtins/computer/README.md b/web-ide-main/simulator/src/chip/builtins/computer/README.md new file mode 100644 index 0000000..71a954e --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/computer/README.md @@ -0,0 +1,5 @@ +# Computer Builtins + +## CPU + + diff --git a/web-ide-main/simulator/src/chip/builtins/computer/computer.test.ts b/web-ide-main/simulator/src/chip/builtins/computer/computer.test.ts new file mode 100644 index 0000000..986fcc7 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/computer/computer.test.ts @@ -0,0 +1,67 @@ +import { + FileSystem, + ObjectFileSystemAdapter, +} from "@davidsouther/jiffies/lib/esm/fs.js"; +import { Max } from "@nand2tetris/projects/samples/hack.js"; +import { HIGH } from "../../chip.js"; +import { CPU, Memory, ROM32K } from "./computer.js"; + +describe("Computer Chip Builtins", () => { + describe("ROM Builtin", () => { + it("can load a file", async () => { + const fs = new FileSystem( + new ObjectFileSystemAdapter({ "Max.hack": Max }), + ); + const rom = new ROM32K(); + + await rom.load(fs, "Max.hack"); + + expect(rom.at(4).busVoltage).toBe(10); + }); + }); + + describe("CPU Chip Builtin", () => { + it("updates PC on tock", () => { + const cpu = new CPU(); + + cpu.in("instruction").busVoltage = 12345; + + cpu.tick(); + + expect(cpu.out("pc").busVoltage).toBe(0); + + cpu.tock(); + + expect(cpu.out("pc").busVoltage).toBe(1); + }); + + it("updtates writeM on tick", () => { + const cpu = new CPU(); + + cpu.in("instruction").busVoltage = 0b1110_1111_1100_1000; + + cpu.tick(); + + expect(cpu.out("writeM").voltage()).toBe(HIGH); + expect(cpu.out("outM").busVoltage).toBe(1); + }); + }); + + describe("memory", () => { + it("maps addresses greater than KBD as 0", () => { + const memory = new Memory(); + memory.in("address").busVoltage = 24577; + memory.in("in").busVoltage = 47; + + memory.eval(); + + expect(memory.out().busVoltage).toBe(0); + + memory.in("load").busVoltage = HIGH; + + memory.eval(); + + expect(memory.out().busVoltage).toBe(0); + }); + }); +}); diff --git a/web-ide-main/simulator/src/chip/builtins/computer/computer.tsx b/web-ide-main/simulator/src/chip/builtins/computer/computer.tsx new file mode 100644 index 0000000..7007ff3 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/computer/computer.tsx @@ -0,0 +1,375 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { + CPUInput, + CPUState, + cpuTick, + cpuTock, + emptyState, +} from "../../../cpu/cpu.js"; +import { + KEYBOARD_OFFSET, + KeyboardAdapter, + SCREEN_OFFSET, + SCREEN_SIZE, +} from "../../../cpu/memory.js"; +import { load } from "../../../fs.js"; +import { int10 } from "../../../util/twos.js"; +import { + Bus, + Chip, + ClockedChip, + ConstantBus, + FALSE_BUS, + HIGH, + LOW, + Pin, +} from "../../chip.js"; +import { RAM, RAM16K } from "../sequential/ram.js"; + +export class ROM32K extends RAM { + constructor() { + super(15, "ROM"); + } + + override async load(fs: FileSystem, path: string) { + try { + (await load(fs, path)).map((v, i) => (this.at(i).busVoltage = v)); + } catch (cause) { + // throw new Error(`ROM32K Failed to load file ${path}`, { cause }); + throw new Error(`ROM32K Failed to load file ${path}`); + } + } +} + +export class Screen extends RAM { + static readonly SIZE = SCREEN_SIZE; + static readonly OFFSET = SCREEN_OFFSET; + + constructor() { + super(13, "Screen"); + } +} + +export class Keyboard extends Chip implements KeyboardAdapter { + static readonly OFFSET = KEYBOARD_OFFSET; + + constructor() { + super([], ["out[16]"], "Keyboard"); + } + + getKey() { + return this.out().busVoltage; + } + + setKey(key: number) { + this.out().busVoltage = key & 0xffff; + } + + clearKey() { + this.out().busVoltage = 0; + } + + override get(name: string) { + return name === this.name + ? new ConstantBus(this.name, this.getKey()) // readonly + : super.get(name); + } +} + +export class Memory extends ClockedChip { + readonly ram = new RAM16K(); + readonly screen = new Screen(); + private keyboard = new Keyboard(); + private address = 0; + + constructor() { + super( + ["in[16]", "load", "address[15])"], + ["out[16]"], + "Memory", + [], + ["in", "load"] + ); + this.parts.push(this.keyboard); + this.parts.push(this.screen); + this.parts.push(this.ram); + } + + override tick() { + const load = this.in("load").voltage(); + this.address = this.in("address").busVoltage; + if (load) { + const inn = this.in().busVoltage; + if (this.address > Keyboard.OFFSET) { + // out of "physical" bounds, should result in some kind of issue... + } + if (this.address == Keyboard.OFFSET) { + // Keyboard, do nothing + } else if (this.address >= Screen.OFFSET) { + this.screen.at(this.address - Screen.OFFSET).busVoltage = inn; + } else { + this.ram.at(this.address).busVoltage = inn; + } + } + } + + override tock() { + this.eval(); + } + + override eval() { + if (!this.ram) return; + this.address = this.in("address").busVoltage; + let out = 0; + if (this.address > Keyboard.OFFSET) { + // out of "physical" bounds, should result in some kind of issue... + } else if (this.address == Keyboard.OFFSET) { + out = this.keyboard?.out().busVoltage ?? 0; + } else if (this.address >= Screen.OFFSET) { + out = this.screen?.at(this.address - Screen.OFFSET).busVoltage ?? 0; + } else { + out = this.ram?.at(this.address).busVoltage ?? 0; + } + this.out().busVoltage = out; + } + + override in(pin?: string): Pin { + if (pin?.startsWith("RAM16K")) { + const idx = int10(pin.match(/\[(?\d+)]/)?.groups?.idx ?? "0"); + return this.ram.at(idx); + } + if (pin?.startsWith("Screen")) { + const idx = int10(pin.match(/\[(?\d+)]/)?.groups?.idx ?? "0"); + return this.screen.at(idx); + } + if (pin?.startsWith("Keyboard")) { + return this.keyboard.out(); + } + return super.in(pin); + } + + override get(name: string, offset = 0): Pin | undefined { + if (name.startsWith("RAM16K")) { + return this.at(offset & 0x3fff); + } + if (name.startsWith("Screen")) { + return this.at(offset & (0x1fff + Screen.OFFSET)); + } + if (name.startsWith("Keyboard")) { + return this.at(Keyboard.OFFSET); + } + if (name.startsWith("Memory")) { + return this.at(offset); + } + return super.get(name, offset); + } + + at(offset: number): Pin { + if (offset > Keyboard.OFFSET) { + return FALSE_BUS; + } + if (offset == Keyboard.OFFSET) { + return this.keyboard.out(); + } + if (offset >= Screen.OFFSET) { + return this.screen.at(offset - Screen.OFFSET); + } + return this.ram.at(offset); + } + + override reset(): void { + this.address = 0; + this.ram.reset(); + this.screen.reset(); + super.reset(); + } +} + +class DRegisterBus extends Bus { + constructor( + name: string, + private cpu: CPUState, + ) { + super(name); + } + + override get busVoltage(): number { + return this.cpu.D; + } + + override set busVoltage(num: number) { + this.cpu.D = num; + } +} + +class ARegisterBus extends Bus { + constructor( + name: string, + private cpu: CPUState, + ) { + super(name); + } + + override get busVoltage(): number { + return this.cpu.A; + } + + override set busVoltage(num: number) { + this.cpu.A = num; + } +} + +class PCBus extends Bus { + constructor( + name: string, + private cpu: CPUState, + ) { + super(name); + } + + override get busVoltage(): number { + return this.cpu.PC; + } + + override set busVoltage(num: number) { + this.cpu.PC = num; + } +} + +export class CPU extends ClockedChip { + private _state: CPUState = emptyState(); + + get state(): CPUState { + return this._state; + } + + constructor() { + super( + ["inM[16]", "instruction[16]", "reset"], + ["outM[16]", "writeM", "addressM[15]", "pc[15]"], + "CPU", + [], + ["pc", "addressM", "reset"], + ); + } + + override tick(): void { + const [state, writeM] = cpuTick(this.cpuInput(), this._state); + this._state = state; + this.out("writeM").pull(writeM ? HIGH : LOW); + this.out("outM").busVoltage = this._state.ALU ?? 0; + } + + override tock(): void { + if (!this._state) return; // Skip initial tock + const [output, state] = cpuTock(this.cpuInput(), this._state); + this._state = state; + + this.out("addressM").busVoltage = output.addressM ?? 0; + this.out("outM").busVoltage = output.outM ?? 0; + this.out("writeM").pull(output.writeM ? HIGH : LOW); + this.out("pc").busVoltage = this._state?.PC ?? 0; + } + + private cpuInput(): CPUInput { + const inM = this.in("inM").busVoltage; + const instruction = this.in("instruction").busVoltage; + const reset = this.in("reset").busVoltage === 1; + return { inM, instruction, reset }; + } + + override get(pin: string, offset?: number): Pin | undefined { + if (pin?.startsWith("ARegister")) { + return new ARegisterBus("ARegister", this._state); + } + if (pin?.startsWith("DRegister")) { + return new DRegisterBus("DRegister", this._state); + } + if (pin?.startsWith("PC")) { + return new PCBus("PC", this._state); + } + return super.get(pin, offset); + } + + override reset() { + this._state = emptyState(); + + // This is a bit of a hack, but because super.reset() does ticktock, + // we need to set PC to -1, so that it will be 0 after the reset + this._state.PC = -1; + + super.reset(); + } +} + +export class Computer extends Chip { + readonly cpu = new CPU(); + readonly ram = new Memory(); + readonly rom = new ROM32K(); + + constructor() { + super(["reset"], []); + + this.wire(this.cpu, [ + { from: { name: "reset", start: 0 }, to: { name: "reset", start: 0 } }, + { + from: { name: "instruction", start: 0 }, + to: { name: "instruction", start: 0 }, + }, + { from: { name: "oldOutM", start: 0 }, to: { name: "inM", start: 0 } }, + { from: { name: "writeM", start: 0 }, to: { name: "writeM", start: 0 } }, + { + from: { name: "addressM", start: 0 }, + to: { name: "addressM", start: 0 }, + }, + { from: { name: "newInM", start: 0 }, to: { name: "outM", start: 0 } }, + { from: { name: "pc", start: 0 }, to: { name: "pc", start: 0 } }, + ]); + + this.wire(this.rom, [ + { from: { name: "pc", start: 0 }, to: { name: "address", start: 0 } }, + { + from: { name: "instruction", start: 0 }, + to: { name: "out", start: 0 }, + }, + ]); + + this.wire(this.ram, [ + { from: { name: "newInM", start: 0 }, to: { name: "in", start: 0 } }, + { from: { name: "writeM", start: 0 }, to: { name: "load", start: 0 } }, + { + from: { name: "addressM", start: 0 }, + to: { name: "address", start: 0 }, + }, + { from: { name: "oldOutM", start: 0 }, to: { name: "out", start: 0 } }, + ]); + + for (const pin of [...this.ins.entries(), ...this.outs.entries()]) { + if (this.isClockedPin(pin.name)) { + this.clockedPins.add(pin.name); + } + } + } + + override eval() { + super.eval(); + } + + override get(name: string, offset?: number): Pin | undefined { + if ( + name.startsWith("PC") || + name.startsWith("ARegister") || + name.startsWith("DRegister") + ) { + return this.cpu.get(name); + } + if (name.startsWith("RAM16K")) { + return this.ram.get(name, offset); + } + return super.get(name, offset); + } + + override async load(fs: FileSystem, path: string): Promise { + return await this.rom.load(fs, path); + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/index.ts b/web-ide-main/simulator/src/chip/builtins/index.ts new file mode 100644 index 0000000..be46c5a --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/index.ts @@ -0,0 +1,143 @@ +import { + Err, + isErr, + Ok, + Result, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import { parse } from "../builder.js"; +import { Chip } from "../chip.js"; +import { Add16 } from "./arithmetic/add_16.js"; +import { ALU, ALUNoStat } from "./arithmetic/alu.js"; +import { FullAdder } from "./arithmetic/full_adder.js"; +import { HalfAdder } from "./arithmetic/half_adder.js"; +import { Inc16 } from "./arithmetic/inc16.js"; +import { builtinOverrides } from "./builtinOverrides.js"; +import { + Computer, + CPU, + Keyboard, + Memory, + ROM32K, + Screen, +} from "./computer/computer.js"; +import { And, And16 } from "./logic/and.js"; +import { DMux, DMux4Way, DMux8Way } from "./logic/dmux.js"; +import { Mux, Mux4Way16, Mux8Way16, Mux16 } from "./logic/mux.js"; +import { Nand, Nand16 } from "./logic/nand.js"; +import { Not, Not16 } from "./logic/not.js"; +import { Or, Or8way, Or16 } from "./logic/or.js"; +import { Xor, Xor16 } from "./logic/xor.js"; +import { Bit, PC, Register, VRegister } from "./sequential/bit.js"; +import { DFF } from "./sequential/dff.js"; +import { RAM4K, RAM8, RAM16K, RAM64, RAM512 } from "./sequential/ram.js"; + +export { + Add16, + ALU, + And, + And16, + VRegister as ARegister, + Bit, + DFF, + DMux, + VRegister as DRegister, + FullAdder, + HalfAdder, + Inc16, + Mux, + Mux16, + Mux4Way16, + Mux8Way16, + Nand, + Nand16, + Not, + Not16, + Or, + Or16, + Or8way, + RAM16K, + RAM4K, + RAM512, + RAM64, + RAM8, + Register, + Xor, + Xor16, +}; + +export const REGISTRY = new Map Chip>( + ( + [ + ["Nand", Nand], + ["Nand16", Nand16], + ["Not", Not], + ["Not16", Not16], + ["And", And], + ["And16", And16], + ["Or", Or], + ["Or16", Or16], + ["Or8Way", Or8way], + ["XOr", Xor], + ["XOr16", Xor16], + ["Xor", Xor], + ["Xor16", Xor16], + ["Mux", Mux], + ["Mux16", Mux16], + ["Mux4Way16", Mux4Way16], + ["Mux8Way16", Mux8Way16], + ["DMux", DMux], + ["DMux4Way", DMux4Way], + ["DMux8Way", DMux8Way], + ["HalfAdder", HalfAdder], + ["FullAdder", FullAdder], + ["Add16", Add16], + ["Inc16", Inc16], + ["ALU", ALU], + ["ALUNoStat", ALUNoStat], + ["DFF", DFF], + ["Bit", Bit], + ["Register", Register], + ["ARegister", Register], + ["DRegister", Register], + ["PC", PC], + ["RAM8", RAM8], + ["RAM64", RAM64], + ["RAM512", RAM512], + ["RAM4K", RAM4K], + ["RAM16K", RAM16K], + ["ROM32K", ROM32K], + ["Screen", Screen], + ["Keyboard", Keyboard], + ["CPU", CPU], + ["Computer", Computer], + ["Memory", Memory], + ["ARegister", VRegister], + ["DRegister", VRegister], + ] as [string, { new (): Chip }][] + ).map(([name, ChipCtor]) => [ + name, + () => { + const chip = new ChipCtor(); + chip.name = name; + return chip; + }, + ]), +); + +export function hasBuiltinChip(name: string): boolean { + return REGISTRY.has(name); +} + +export async function getBuiltinChip(name: string): Promise> { + if (builtinOverrides[name]) { + const result = await parse(builtinOverrides[name], name); + if (isErr(result)) { + return Err(new Error(Err(result).message)); + } + return result; + } + const chip = REGISTRY.get(name); + return chip + ? Ok(chip()) + : Err(new Error(`Chip ${name} not in builtin registry`)); +} diff --git a/web-ide-main/simulator/src/chip/builtins/logic/and.ts b/web-ide-main/simulator/src/chip/builtins/logic/and.ts new file mode 100644 index 0000000..7dd5777 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/logic/and.ts @@ -0,0 +1,35 @@ +import { Chip, HIGH, LOW, Voltage } from "../../chip.js"; + +export function and(a: Voltage, b: Voltage): [Voltage] { + return [a === 1 && b === 1 ? HIGH : LOW]; +} + +export function and16(a: number, b: number): [number] { + return [a & b & 0xffff]; +} + +export class And extends Chip { + constructor() { + super(["a", "b"], ["out"]); + } + + override eval() { + const a = this.in("a").voltage(); + const b = this.in("b").voltage(); + const [n] = and(a, b); + this.out().pull(n); + } +} + +export class And16 extends Chip { + constructor() { + super(["a[16]", "b[16]"], ["out[16]"]); + } + + override eval() { + const a = this.in("a").busVoltage; + const b = this.in("b").busVoltage; + const [n] = and16(a, b); + this.out().busVoltage = n; + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/logic/dmux.ts b/web-ide-main/simulator/src/chip/builtins/logic/dmux.ts new file mode 100644 index 0000000..ab56c2a --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/logic/dmux.ts @@ -0,0 +1,86 @@ +import { Chip, HIGH, LOW, Voltage } from "../../chip.js"; + +export function dmux(inn: Voltage, sel: Voltage): [Voltage, Voltage] { + const a = sel === LOW && inn === HIGH ? HIGH : LOW; + const b = sel === HIGH && inn === HIGH ? HIGH : LOW; + return [a, b]; +} + +export function dmux4way( + inn: Voltage, + sel: number, +): [Voltage, Voltage, Voltage, Voltage] { + const a = sel === 0b00 && inn === HIGH ? HIGH : LOW; + const b = sel === 0b01 && inn === HIGH ? HIGH : LOW; + const c = sel === 0b10 && inn === HIGH ? HIGH : LOW; + const d = sel === 0b11 && inn === HIGH ? HIGH : LOW; + return [a, b, c, d]; +} + +export function dmux8way( + inn: Voltage, + sel: number, +): [Voltage, Voltage, Voltage, Voltage, Voltage, Voltage, Voltage, Voltage] { + const a = sel === 0b000 && inn === HIGH ? HIGH : LOW; + const b = sel === 0b001 && inn === HIGH ? HIGH : LOW; + const c = sel === 0b010 && inn === HIGH ? HIGH : LOW; + const d = sel === 0b011 && inn === HIGH ? HIGH : LOW; + const e = sel === 0b100 && inn === HIGH ? HIGH : LOW; + const f = sel === 0b101 && inn === HIGH ? HIGH : LOW; + const g = sel === 0b110 && inn === HIGH ? HIGH : LOW; + const h = sel === 0b111 && inn === HIGH ? HIGH : LOW; + return [a, b, c, d, e, f, g, h]; +} + +export class DMux extends Chip { + constructor() { + super(["in", "sel"], ["a", "b"]); + } + + override eval() { + const inn = this.in("in").voltage(); + const sel = this.in("sel").voltage(); + + const [a, b] = dmux(inn, sel); + this.out("a").pull(a); + this.out("b").pull(b); + } +} + +export class DMux4Way extends Chip { + constructor() { + super(["in", "sel[2]"], ["a", "b", "c", "d"]); + } + + override eval() { + const inn = this.in("in").voltage(); + const sel = this.in("sel").busVoltage; + + const [a, b, c, d] = dmux4way(inn, sel); + this.out("a").pull(a); + this.out("b").pull(b); + this.out("c").pull(c); + this.out("d").pull(d); + } +} + +export class DMux8Way extends Chip { + constructor() { + super(["in", "sel[3]"], ["a", "b", "c", "d", "e", "f", "g", "h"]); + } + + override eval() { + const inn = this.in("in").voltage(); + const sel = this.in("sel").busVoltage; + + const [a, b, c, d, e, f, g, h] = dmux8way(inn, sel); + this.out("a").pull(a); + this.out("b").pull(b); + this.out("c").pull(c); + this.out("d").pull(d); + this.out("e").pull(e); + this.out("f").pull(f); + this.out("g").pull(g); + this.out("h").pull(h); + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/logic/mux.ts b/web-ide-main/simulator/src/chip/builtins/logic/mux.ts new file mode 100644 index 0000000..1a8ad15 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/logic/mux.ts @@ -0,0 +1,117 @@ +import { Chip, LOW, Voltage } from "../../chip.js"; + +export function mux(a: Voltage, b: Voltage, sel: Voltage): [Voltage] { + return [sel === LOW ? a : b]; +} + +export function mux16(a: number, b: number, sel: Voltage): [number] { + return [sel === LOW ? a : b]; +} + +export function mux16_4( + a: number, + b: number, + c: number, + d: number, + sel: number, +): [number] { + const s2 = (sel & 0b01) as Voltage; + return (sel & 0b10) === 0b00 ? mux16(a, b, s2) : mux16(c, d, s2); +} + +export function mux16_8( + a: number, + b: number, + c: number, + d: number, + e: number, + f: number, + g: number, + h: number, + sel: number, +): [number] { + const s2 = (sel & 0b11) as Voltage; + return (sel & 0b100) === 0b000 + ? mux16_4(a, b, c, d, s2) + : mux16_4(e, f, g, h, s2); +} + +export class Mux extends Chip { + constructor() { + super(["a", "b", "sel"], ["out"]); + } + + override eval() { + const a = this.in("a").voltage(); + const b = this.in("b").voltage(); + const sel = this.in("sel").voltage(); + + const [set] = mux(a, b, sel); + this.out().pull(set); + } +} + +export class Mux16 extends Chip { + constructor() { + super(["a[16]", "b[16]", "sel"], ["out[16]"]); + } + + override eval() { + const a = this.in("a").busVoltage; + const b = this.in("b").busVoltage; + const sel = this.in("sel").voltage(); + const [out] = mux16(a, b, sel); + this.out().busVoltage = out; + } +} + +export class Mux4Way16 extends Chip { + constructor() { + super(["a[16]", "b[16]", "c[16]", "d[16]", "sel[2]"], ["out[16]"]); + } + + override eval() { + const a = this.in("a").busVoltage; + const b = this.in("b").busVoltage; + const c = this.in("c").busVoltage; + const d = this.in("d").busVoltage; + const sel = this.in("sel").busVoltage; + const [out] = mux16_4(a, b, c, d, sel); + + this.out().busVoltage = out; + } +} + +export class Mux8Way16 extends Chip { + constructor() { + super( + [ + "a[16]", + "b[16]", + "c[16]", + "d[16]", + "e[16]", + "f[16]", + "g[16]", + "h[16]", + "sel[3]", + ], + ["out[16]"], + ); + } + + override eval() { + const a = this.in("a").busVoltage; + const b = this.in("b").busVoltage; + const c = this.in("c").busVoltage; + const d = this.in("d").busVoltage; + const e = this.in("e").busVoltage; + const f = this.in("f").busVoltage; + const g = this.in("g").busVoltage; + const h = this.in("h").busVoltage; + const sel = this.in("sel").busVoltage; + const [out] = mux16_8(a, b, c, d, e, f, g, h, sel); + + this.out().busVoltage = out; + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/logic/nand.ts b/web-ide-main/simulator/src/chip/builtins/logic/nand.ts new file mode 100644 index 0000000..1d2e124 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/logic/nand.ts @@ -0,0 +1,31 @@ +import { nand16 } from "../../../util/twos.js"; +import { Chip, HIGH, LOW, Voltage } from "../../chip.js"; + +export function nand(a: Voltage, b: Voltage): [Voltage] { + return [a === 1 && b === 1 ? LOW : HIGH]; +} + +export class Nand extends Chip { + constructor() { + super(["a", "b"], ["out"]); + } + + override eval() { + const a = this.in("a").voltage(); + const b = this.in("b").voltage(); + const [out] = nand(a, b); + this.out().pull(out); + } +} + +export class Nand16 extends Chip { + constructor() { + super(["a[16]", "b[16]"], ["out[16]"]); + } + + override eval() { + const a = this.in("a").busVoltage; + const b = this.in("b").busVoltage; + this.out().busVoltage = nand16(a, b); + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/logic/not.ts b/web-ide-main/simulator/src/chip/builtins/logic/not.ts new file mode 100644 index 0000000..0ca3fdf --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/logic/not.ts @@ -0,0 +1,32 @@ +import { Chip, HIGH, LOW, Voltage } from "../../chip.js"; + +export function not(inn: Voltage): [Voltage] { + return [inn === LOW ? HIGH : LOW]; +} + +export function not16(inn: number): [number] { + return [~inn & 0xffff]; +} + +export class Not extends Chip { + constructor() { + super(["in"], ["out"]); + } + + override eval() { + const a = this.in("in").voltage(); + const [out] = not(a); + this.out().pull(out); + } +} + +export class Not16 extends Chip { + constructor() { + super(["in[16]"], ["out[16]"]); + } + + override eval() { + const [n] = not16(this.in().busVoltage); + this.out().busVoltage = n; + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/logic/or.ts b/web-ide-main/simulator/src/chip/builtins/logic/or.ts new file mode 100644 index 0000000..046714b --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/logic/or.ts @@ -0,0 +1,51 @@ +import { Chip, HIGH, LOW, Voltage } from "../../chip.js"; + +export function or(a: Voltage, b: Voltage): [Voltage] { + return [a === 1 || b === 1 ? HIGH : LOW]; +} + +export function or16(a: number, b: number): [number] { + return [(a | b) & 0xffff]; +} + +export function or8way(a: number): [Voltage] { + return [(a & 0xff) === 0 ? LOW : HIGH]; +} + +export class Or extends Chip { + constructor() { + super(["a", "b"], ["out"]); + } + + override eval() { + const a = this.in("a").voltage(); + const b = this.in("b").voltage(); + const [out] = or(a, b); + this.out().pull(out); + } +} + +export class Or16 extends Chip { + constructor() { + super(["a[16]", "b[16]"], ["out[16]"]); + } + + override eval() { + const a = this.in("a").busVoltage; + const b = this.in("b").busVoltage; + const [out] = or16(a, b); + this.out().busVoltage = out; + } +} + +export class Or8way extends Chip { + constructor() { + super(["in[8]"], ["out"], "Or8way"); + } + + override eval() { + const inn = this.in().busVoltage; + const [out] = or8way(inn); + this.out().pull(out); + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/logic/xor.ts b/web-ide-main/simulator/src/chip/builtins/logic/xor.ts new file mode 100644 index 0000000..5c21048 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/logic/xor.ts @@ -0,0 +1,35 @@ +import { Chip, HIGH, LOW, Voltage } from "../../chip.js"; + +export function xor(a: Voltage, b: Voltage): [Voltage] { + return [(a === HIGH && b === LOW) || (a === LOW && b === HIGH) ? HIGH : LOW]; +} + +export function xor16(a: number, b: number): [number] { + return [(a ^ b) & 0xffff]; +} + +export class Xor extends Chip { + constructor() { + super(["a", "b"], ["out"]); + } + + override eval() { + const a = this.in("a").voltage(); + const b = this.in("b").voltage(); + const [out] = xor(a, b); + this.out().pull(out); + } +} + +export class Xor16 extends Chip { + constructor() { + super(["a[16]", "b[16]"], ["out[16]"]); + } + + override eval() { + const a = this.in("a").busVoltage; + const b = this.in("b").busVoltage; + const [out] = xor16(a, b); + this.out().busVoltage = out; + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/sequential/bit.tsx b/web-ide-main/simulator/src/chip/builtins/sequential/bit.tsx new file mode 100644 index 0000000..b80accd --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/sequential/bit.tsx @@ -0,0 +1,111 @@ +import { Bus, ClockedChip, HIGH, LOW, Pin, Voltage } from "../../chip.js"; + +export class Bit extends ClockedChip { + bit: Voltage = LOW; + + constructor(name?: string) { + super(["in", "load"], ["out"], name, [], ["in", "load"]); + } + + override tick() { + if (this.in("load").voltage() === HIGH) { + this.bit = this.in().voltage(); + } + } + + override tock() { + this.out().pull(this.bit ?? 0); + } + + override reset() { + this.bit = LOW; + super.reset(); + } +} + +class RegisterBus extends Bus { + constructor( + name: string, + private register: { bits: number }, + ) { + super(name); + } + + override get busVoltage(): number { + return this.register.bits & 0xffff; + } + + override set busVoltage(num: number) { + this.register.bits = num & 0xffff; + } +} + +export class Register extends ClockedChip { + bits = 0x00; + + constructor(name?: string) { + super(["in[16]", "load"], ["out[16]"], name, [], ["in", "load"]); + } + + override tick() { + if (this.in("load").voltage() === HIGH) { + this.bits = this.in().busVoltage & 0xffff; + } + } + + override tock() { + this.out().busVoltage = this.bits & 0xffff; + } + + override get(name: string, offset?: number): Pin | undefined { + return name === this.name + ? new RegisterBus(this.name, this) + : super.get(name, offset); + } + + override reset() { + this.bits = 0x00; + super.reset(); + } +} + +export class VRegister extends Register {} + +export class PC extends ClockedChip { + bits = 0x00; + + constructor(name?: string) { + super( + ["in[16]", "reset", "load", "inc"], + ["out[16]"], + name, + [], + ["in", "reset", "load", "inc"], + ); + } + + override tick() { + if (this.in("reset").voltage() === HIGH) { + this.bits = 0; + } else if (this.in("load").voltage() === HIGH) { + this.bits = this.in().busVoltage & 0xffff; + } else if (this.in("inc").voltage() === HIGH) { + this.bits += 1; + } + } + + override tock() { + this.out().busVoltage = this.bits & 0xffff; + } + + override get(name: string, offset?: number): Pin | undefined { + return name === this.name + ? new RegisterBus(this.name, this) + : super.get(name, offset); + } + + override reset() { + this.bits = 0x00; + super.reset(); + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/sequential/dff.ts b/web-ide-main/simulator/src/chip/builtins/sequential/dff.ts new file mode 100644 index 0000000..853a87d --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/sequential/dff.ts @@ -0,0 +1,19 @@ +import { ClockedChip } from "../../chip.js"; + +export class DFF extends ClockedChip { + constructor(name?: string) { + super(["in"], ["out"], name, ["t"], ["in"]); + } + + override tick() { + // Read in into t + const t = this.in().voltage(); + this.pin("t").pull(t); + } + + override tock() { + // write t into out + const t = this.pin("t").voltage(); + this.out().pull(t); + } +} diff --git a/web-ide-main/simulator/src/chip/builtins/sequential/ram.tsx b/web-ide-main/simulator/src/chip/builtins/sequential/ram.tsx new file mode 100644 index 0000000..19e2346 --- /dev/null +++ b/web-ide-main/simulator/src/chip/builtins/sequential/ram.tsx @@ -0,0 +1,113 @@ +import { assert } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { Memory, Memory as MemoryChip } from "../../../cpu/memory.js"; +import { Bus, ClockedChip, Pin } from "../../chip.js"; + +export class RAM extends ClockedChip { + protected _memory: MemoryChip; + private _nextData = 0; + private _address = 0; + + get memory() { + return this._memory; + } + get address() { + return this._address; + } + + constructor( + readonly width: number, + name?: string, + ) { + super( + ["in[16]", "load", `address[${width}]`], + [`out[16]`], + name, + [], + ["in", "load"], + ); + this._memory = new MemoryChip(Math.pow(2, this.width)); + } + + override tick() { + const load = this.in("load").voltage(); + this._address = this.in("address").busVoltage; + if (load) { + this._nextData = this.in().busVoltage; + this._memory.set(this._address, this._nextData); + } + } + + override tock() { + this.out().busVoltage = this._memory?.get(this._address) ?? 0; + } + + override eval() { + const address = this.in("address").busVoltage; + this.out().busVoltage = this._memory?.get(address) ?? 0; + } + + at(idx: number): Pin { + assert( + idx < this._memory.size, + () => `Request out of bounds (${idx} >= ${this._memory.size})`, + ); + return new RamBus(`${this.name}[${idx}]`, idx, this._memory); + } + + override get(name: string, offset?: number) { + return name === this.name ? this.at(offset ?? 0) : super.get(name); + } + + override reset(): void { + this._memory.reset(); + super.reset(); + } +} + +export class RamBus extends Bus { + constructor( + name: string, + private readonly index: number, + private ram: Memory, + ) { + super(name); + } + + override get busVoltage(): number { + return this.ram.get(this.index); + } + + override set busVoltage(num: number) { + this.ram.set(this.index, num); + } +} + +export class RAM8 extends RAM { + constructor() { + super(3, "RAM8"); + } +} + +export class RAM64 extends RAM { + constructor() { + super(6, "RAM64"); + } +} + +export class RAM512 extends RAM { + constructor() { + super(9, "RAM512"); + } +} + +export class RAM4K extends RAM { + constructor() { + super(12, "RAM4K"); + } +} + +export class RAM16K extends RAM { + constructor() { + super(14, "RAM16K"); + } +} diff --git a/web-ide-main/simulator/src/chip/chip.test.ts b/web-ide-main/simulator/src/chip/chip.test.ts new file mode 100644 index 0000000..6e8f94d --- /dev/null +++ b/web-ide-main/simulator/src/chip/chip.test.ts @@ -0,0 +1,910 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { bin } from "../util/twos.js"; +import { And, Inc16, Mux16, Not, Not16, Or, Xor } from "./builtins/index.js"; +import { Nand } from "./builtins/logic/nand.js"; +import { Bit, PC, Register } from "./builtins/sequential/bit.js"; +import { DFF } from "./builtins/sequential/dff.js"; +import { + Bus, + Chip, + ConstantBus, + HIGH, + InSubBus, + LOW, + OutSubBus, + parseToPin, + printChip, + TRUE_BUS, +} from "./chip.js"; +import { Clock } from "./clock.js"; + +describe("Chip", () => { + it("parses toPin", () => { + expect(parseToPin("a")).toMatchObject({ pin: "a" }); + expect(parseToPin("a[2]")).toMatchObject({ pin: "a", start: 2 }); + expect(parseToPin("a[2..4]")).toMatchObject({ + pin: "a", + start: 2, + end: 4, + }); + }); + + describe("combinatorial", () => { + describe("nand", () => { + it("can eval a nand gate", () => { + const nand = new Nand(); + nand.eval(); + expect(nand.out().voltage()).toBe(HIGH); + + nand.in("a")?.pull(HIGH); + nand.eval(); + expect(nand.out().voltage()).toBe(HIGH); + + nand.in("b")?.pull(HIGH); + nand.eval(); + expect(nand.out().voltage()).toBe(LOW); + + nand.in("a")?.pull(LOW); + nand.eval(); + expect(nand.out().voltage()).toBe(HIGH); + }); + }); + + describe("not", () => { + it("evaluates a not gate", () => { + const notChip = new Not(); + + notChip.eval(); + expect(notChip.out().voltage()).toBe(HIGH); + + notChip.in().pull(HIGH); + notChip.eval(); + expect(notChip.out().voltage()).toBe(LOW); + }); + }); + + describe("and", () => { + it("evaluates an and gate", () => { + const andChip = new And(); + + const a = assertExists(andChip.in("a")); + const b = assertExists(andChip.in("b")); + + andChip.eval(); + expect(andChip.out().voltage()).toBe(LOW); + + a.pull(HIGH); + andChip.eval(); + expect(andChip.out().voltage()).toBe(LOW); + + b.pull(HIGH); + andChip.eval(); + expect(andChip.out().voltage()).toBe(HIGH); + + a.pull(LOW); + andChip.eval(); + expect(andChip.out().voltage()).toBe(LOW); + }); + }); + + describe("or", () => { + it("evaluates an or gate", () => { + const orChip = new Or(); + + const a = assertExists(orChip.in("a")); + const b = assertExists(orChip.in("b")); + + orChip.eval(); + expect(orChip.out().voltage()).toBe(LOW); + + a.pull(HIGH); + orChip.eval(); + printChip(orChip); + expect(orChip.out().voltage()).toBe(HIGH); + + b.pull(HIGH); + orChip.eval(); + expect(orChip.out().voltage()).toBe(HIGH); + + a.pull(LOW); + orChip.eval(); + expect(orChip.out().voltage()).toBe(HIGH); + }); + }); + + describe("xor", () => { + it("evaluates an xor gate", () => { + const xorChip = new Xor(); + + const a = assertExists(xorChip.in("a")); + const b = assertExists(xorChip.in("b")); + + xorChip.eval(); + expect(xorChip.out().voltage()).toBe(LOW); + + a.pull(HIGH); + xorChip.eval(); + expect(xorChip.out().voltage()).toBe(HIGH); + + b.pull(HIGH); + xorChip.eval(); + expect(xorChip.out().voltage()).toBe(LOW); + + a.pull(LOW); + xorChip.eval(); + expect(xorChip.out().voltage()).toBe(HIGH); + }); + }); + }); + + describe("wide", () => { + describe("Not16", () => { + it("evaluates a not16 gate", () => { + const not16 = new Not16(); + + const inn = not16.in(); + + inn.busVoltage = 0x0; + not16.eval(); + expect(not16.out().busVoltage).toBe(0xffff); + + inn.busVoltage = 0xf00f; + not16.eval(); + expect(not16.out().busVoltage).toBe(0x0ff0); + }); + }); + + describe("bus voltage", () => { + it("sets and returns wide busses", () => { + const pin = new Bus("wide", 16); + pin.busVoltage = 0xf00f; + expect(pin.voltage(0)).toBe(1); + expect(pin.voltage(8)).toBe(0); + expect(pin.voltage(9)).toBe(0); + expect(pin.voltage(15)).toBe(1); + expect(pin.busVoltage).toBe(0xf00f); + }); + + it("creates wide busses internally", () => { + const chip = new Chip([], [], "WithWide"); + + chip.wire(new Not16(), [ + { + to: { name: "out", start: 0, width: 16 }, + from: { name: "a", start: 0, width: 16 }, + }, + ]); + + const width = chip.pins.get("a")?.width; + expect(width).toBe(16); + }); + }); + + describe("and16", () => undefined); + }); + + describe("SubBus", () => { + class Not3 extends Chip { + constructor() { + super(["in[3]"], ["out[3]"]); + } + + override eval() { + const inn = this.in().busVoltage; + const out = ~inn & 0b111; + this.out().busVoltage = out; + } + } + + it("drives OutSubBus", () => { + const notChip = new Not(); + const inPin = new Bus("in", 3); + const outSubBus = new OutSubBus(notChip.in(), 1, 1); + inPin.connect(outSubBus); + + inPin.busVoltage = 0b0; + expect(notChip.in().busVoltage).toBe(0b0); + inPin.busVoltage = 0b111; + expect(notChip.in().busVoltage).toBe(0b1); + }); + + it("wires SubBus in=in[1]", () => { + const not3Chip = new Not3(); + const notPart = new Not(); + const inPin = not3Chip.in(); + + not3Chip.wire(notPart, [ + { + from: { name: "in", start: 1, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + ]); + + inPin.busVoltage = 0b0; + not3Chip.eval(); + expect(notPart.in().busVoltage).toBe(0b0); + inPin.busVoltage = 0b111; + not3Chip.eval(); + expect(notPart.in().busVoltage).toBe(0b1); + }); + + it("wires SubBus in[0]=a", () => { + const chip = new Chip(["a", "b"], ["out[3]"]); + const not3 = new Not3(); + + // Not3(in[0]=a, in[1]=b, in[2]=b, out=out) + chip.wire(not3, [ + { + from: { name: "a", start: 0, width: undefined }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "b", start: 0, width: undefined }, + to: { name: "in", start: 1, width: 1 }, + }, + { + from: { name: "b", start: 0, width: undefined }, + to: { name: "in", start: 2, width: 1 }, + }, + { + from: { name: "out", start: 0, width: undefined }, + to: { name: "out", start: 0, width: undefined }, + }, + ]); + + assertExists(chip.in("b")).busVoltage = 1; + assertExists(chip.in("a")).busVoltage = 0; + chip.eval(); + expect(chip.out().busVoltage).toBe(0b001); + }); + + it("wires SubBus out=out[1]", () => { + const threeChip = new (class ThreeChip extends Chip { + constructor() { + super([], ["out[3]"]); + } + })(); + + const notPart = new Not(); + threeChip.wire(notPart, [ + { + from: { name: "out", start: 1, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + const outPin = notPart.out(); + + outPin.busVoltage = 0b0; + expect(threeChip.out().busVoltage).toBe(0b0); + outPin.busVoltage = 0b1; + expect(threeChip.out().busVoltage).toBe(0b010); + }); + + it("widens output busses if necessary", () => { + const mux4way16 = new Chip( + ["in[16]", "b[16]", "c[16]", "d[16]", "sel[2]"], + ["out[16]"], + ); + + mux4way16.wire(new Mux16(), [ + { + from: { name: "a", start: 0 }, + to: { name: "a", start: 0 }, + }, + { + from: { name: "b", start: 0 }, + to: { name: "b", start: 0 }, + }, + { + from: { name: "sel", start: 0, width: 1 }, + to: { name: "sel", start: 0 }, + }, + { + from: { name: "out1", start: 0 }, + to: { name: "out", start: 0 }, + }, + ]); + + mux4way16.wire(new Mux16(), [ + { + from: { name: "c", start: 0 }, + to: { name: "a", start: 0 }, + }, + { + from: { name: "d", start: 0 }, + to: { name: "b", start: 0 }, + }, + { + from: { name: "sel", start: 0, width: 1 }, + to: { name: "sel", start: 0 }, + }, + { + from: { name: "out2", start: 0 }, + to: { name: "out", start: 0 }, + }, + ]); + + mux4way16.wire(new Mux16(), [ + { + from: { name: "out1", start: 0 }, + to: { name: "a", start: 0 }, + }, + { + from: { name: "out2", start: 0 }, + to: { name: "b", start: 0 }, + }, + { + from: { name: "sel", start: 1, width: 1 }, + to: { name: "sel", start: 0, width: 1 }, + }, + { + from: { name: "out", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + }); + + it("widens internal busses if necessary", () => { + const chip = new Chip(["in"], [], "test", ["t"]); + + chip.wire(new Not(), [ + { + from: { name: "in", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "t", start: 1, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + + chip.in().busVoltage = 0b0; + chip.eval(); + expect(chip.pin("t").busVoltage).toBe(0b10); + }); + + class Not8 extends Chip { + constructor() { + super(["in[8]"], ["out[8]"]); + } + + override eval() { + const inn = this.in().busVoltage; + const out = ~inn & 0xff; + this.out().busVoltage = out; + } + } + + it("assigns input inside wide busses", () => { + class Foo extends Chip { + readonly not8 = new Not8(); + constructor() { + super([], []); + this.parts.push(this.not8); + this.pins.insert(new ConstantBus("pal", 0b1010_1100_0011_0101)); + this.pins.get("pal")?.connect(new OutSubBus(this.not8.in(), 4, 8)); + this.pins.emplace("out1", 5); + const out1Bus = new OutSubBus( + assertExists(this.pins.get("out1")), + 3, + 5, + ); + this.not8.out().connect(out1Bus); + } + } + + const foo = new Foo(); + foo.eval(); + expect(foo.not8.in().busVoltage).toEqual(0b1100_0011); + expect(foo.pin("out1")?.busVoltage).toEqual(0b00111); + }); + + it("assigns output inside wide busses", () => { + // From figure A2.2, page 287, 2nd edition + class Foo extends Chip { + readonly not8 = new Not8(); + constructor() { + super([], []); + this.parts.push(this.not8); + this.pins.insert(new ConstantBus("six", 0b110)); + // in[0..1] = true + TRUE_BUS.connect(new InSubBus(this.not8.in(), 0, 2)); + // in[3..5] = six, 110 + this.pins.get("six")?.connect(new InSubBus(this.not8.in(), 3, 3)); + // in[7] = true + TRUE_BUS.connect(new InSubBus(this.not8.in(), 7, 1)); + // out[3..7] = out1 + this.pins.emplace("out1", 5); + const out1Bus = new OutSubBus( + assertExists(this.pins.get("out1")), + 3, + 5, + ); + this.not8.out().connect(out1Bus); + } + } + + const foo = new Foo(); + foo.eval(); + expect(foo.not8.in().busVoltage).toBe(0b10110011); + expect(foo.pin("out1").busVoltage).toBe(0b01001); + }); + + it("pulls portions of true", () => { + class Foo extends Chip { + readonly chip = new Not3(); + constructor() { + super([], []); + this.wire(this.chip, [ + { + from: { name: "true", start: 0, width: 1 }, + to: { name: "in", start: 1, width: 2 }, + }, + ]); + } + } + + const foo = new Foo(); + + const inVoltage = foo.chip.in().busVoltage; + expect(bin(inVoltage)).toBe(bin(0b110)); + }); + + it("pulls start of true", () => { + class Foo extends Chip { + readonly chip = new Not3(); + constructor() { + super([], []); + this.wire(this.chip, [ + { + from: { name: "true", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 2 }, + }, + ]); + } + } + + const foo = new Foo(); + + const inVoltage = foo.chip.in().busVoltage; + expect(bin(inVoltage)).toBe(bin(0b11)); + }); + }); + + describe("sequential", () => { + const clock = Clock.get(); + beforeEach(() => { + clock.reset(); + }); + + describe("dff", () => { + it("flips and flops", () => { + clock.reset(); + const dff = new DFF(); + + clock.tick(); // Read input, low + expect(dff.out().voltage()).toBe(LOW); + clock.tock(); // Write t, low + expect(dff.out().voltage()).toBe(LOW); + + dff.in().pull(HIGH); + clock.tick(); // Read input, HIGH + expect(dff.out().voltage()).toBe(LOW); + clock.tock(); // Write t, HIGH + expect(dff.out().voltage()).toBe(HIGH); + + clock.tick(); + expect(dff.out().voltage()).toBe(HIGH); + clock.tock(); + expect(dff.out().voltage()).toBe(HIGH); + }); + }); + + describe("bit", () => { + it("does not update when load is low", () => { + clock.reset(); + const bit = new Bit(); + + const inn = bit.in(); + const load = bit.in("load"); + const out = bit.out(); + + load.pull(LOW); + inn.pull(HIGH); + expect(out.voltage()).toBe(LOW); + clock.tick(); + expect(out.voltage()).toBe(LOW); + clock.tock(); + expect(out.voltage()).toBe(LOW); + }); + + it("does updates when load is high", () => { + clock.reset(); + const bit = new Bit(); + + const inn = bit.in(); + const load = bit.in("load"); + const out = bit.out(); + + load.pull(HIGH); + inn.pull(HIGH); + expect(out.voltage()).toBe(LOW); + clock.tick(); + expect(out.voltage()).toBe(LOW); + clock.tock(); + expect(out.voltage()).toBe(HIGH); + }); + }); + + describe("PC", () => { + it("remains constant when not ticking", () => { + clock.reset(); + const pc = new PC(); + const out = pc.out(); + + expect(out.busVoltage).toBe(0); + clock.tick(); + expect(out.busVoltage).toBe(0); + clock.tock(); + expect(out.busVoltage).toBe(0); + clock.tick(); + expect(out.busVoltage).toBe(0); + clock.tock(); + expect(out.busVoltage).toBe(0); + }); + + it("increments when ticking", () => { + clock.reset(); + const pc = new PC(); + const out = pc.out(); + + pc.in("inc").pull(HIGH); + + clock.tick(); + expect(out.busVoltage).toBe(0); + clock.tock(); + expect(out.busVoltage).toBe(1); + + clock.tick(); + expect(out.busVoltage).toBe(1); + clock.tock(); + expect(out.busVoltage).toBe(2); + + for (let i = 0; i < 10; i++) { + clock.eval(); + expect(out.busVoltage).toBe(i + 3); + } + }); + + it("loads a jump value", () => { + clock.reset(); + const pc = new PC(); + const out = pc.out(); + + pc.in().busVoltage = 0x8286; + + expect(out.busVoltage).toBe(0); + clock.tick(); + expect(out.busVoltage).toBe(0); + clock.tock(); + expect(out.busVoltage).toBe(0); + + pc.in("load").pull(HIGH); + + expect(out.busVoltage).toBe(0); + clock.eval(); + expect(out.busVoltage).toBe(0x8286); + }); + + it("resets", () => { + clock.reset(); + const pc = new PC(); + const out = pc.out(); + pc.in("inc").pull(HIGH); + + expect(out.busVoltage).toBe(0); + + for (let i = 0; i < 10; i++) { + clock.eval(); + } + + expect(out.busVoltage).toBe(10); + + pc.in("reset").pull(HIGH); + + clock.eval(); + + expect(out.busVoltage).toBe(0); + }); + }); + }); + + it("sorts parts before eval", () => { + class FooA extends Chip { + readonly notA = new Not(); + readonly notB = new Not(); + constructor() { + super([], ["out"], "Foo", ["x"]); + this.wire(this.notA, [ + { + from: { name: "x", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "out", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + this.wire(this.notB, [ + { + from: { name: "true", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "x", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + } + } + + const fooA = new FooA(); + fooA.sortParts(); + expect(fooA.parts).toEqual([fooA.notB, fooA.notA]); + + class FooB extends Chip { + readonly notA = new Not(); + readonly notB = new Not(); + constructor() { + super([], ["out"], "Foo", ["x"]); + this.wire(this.notA, [ + { + from: { name: "true", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "x", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + this.wire(this.notB, [ + { + from: { name: "x", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "out", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + } + } + + const fooB = new FooB(); + fooB.sortParts(); + expect(fooB.parts).toEqual([fooB.notA, fooB.notB]); + }); + + it("sorts clocked chips", () => { + class FooC extends Chip { + readonly register = new Register(); + readonly inc16A = new Inc16(); + readonly inc16B = new Inc16(); + constructor() { + super([], [], "Foo", []); + this.wire(this.inc16B, [ + { + from: { name: "b", start: 0, width: 16 }, + to: { name: "in", start: 0, width: 16 }, + }, + { + from: { name: "c", start: 0, width: 16 }, + to: { name: "out", start: 0, width: 16 }, + }, + ]); + this.wire(this.register, [ + { + from: { name: "c", start: 0, width: 16 }, + to: { name: "in", start: 0, width: 16 }, + }, + { + from: { name: "true", start: 0, width: 1 }, + to: { name: "load", start: 0, width: 1 }, + }, + { + from: { name: "a", start: 0, width: 16 }, + to: { name: "out", start: 0, width: 16 }, + }, + ]); + this.wire(this.inc16A, [ + { + from: { name: "a", start: 0, width: 16 }, + to: { name: "in", start: 0, width: 16 }, + }, + { + from: { name: "b", start: 0, width: 16 }, + to: { name: "out", start: 0, width: 16 }, + }, + ]); + } + } + const fooC = new FooC(); + fooC.sortParts(); + const parts = fooC.parts.map((chip) => chip.id); + expect(parts).toEqual([fooC.register.id, fooC.inc16A.id, fooC.inc16B.id]); + }); + + it("evals without order issues (after sorting)", () => { + /* + CHIP Or { + IN a, b; + OUT out; + + PARTS: + + Not(in =b , out = net2); + Nand(a = net, b =net2 , out =out ); + Not(in =a , out = net); +} + */ + class OrA extends Chip { + readonly nota = new Not(); + readonly nand = new Nand(); + readonly notb = new Not(); + constructor() { + super(["a", "b"], ["out"], "OrA", []); + this.wire(this.nota, [ + { + from: { name: "b", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "net2", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + this.wire(this.nand, [ + { + from: { name: "net", start: 0, width: 1 }, + to: { name: "a", start: 0, width: 1 }, + }, + { + from: { name: "net2", start: 0, width: 1 }, + to: { name: "b", start: 0, width: 1 }, + }, + { + from: { name: "out", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + this.wire(this.notb, [ + { + from: { name: "a", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "net", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + this.sortParts(); + } + } + + class OrB extends Chip { + readonly nota = new Not(); + readonly nand = new Nand(); + readonly notb = new Not(); + constructor() { + super(["a", "b"], ["out"], "OrB", []); + this.wire(this.nota, [ + { + from: { name: "b", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "net2", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + this.wire(this.notb, [ + { + from: { name: "a", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "net", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + this.wire(this.nand, [ + { + from: { name: "net", start: 0, width: 1 }, + to: { name: "a", start: 0, width: 1 }, + }, + { + from: { name: "net2", start: 0, width: 1 }, + to: { name: "b", start: 0, width: 1 }, + }, + { + from: { name: "out", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ]); + } + } + + class OrC extends Chip { + readonly nota = new Not(); + readonly nand = new Nand(); + readonly notb = new Not(); + constructor() { + super(["a", "b"], ["out"], "OrC", []); + this.wireAll([ + { + part: this.nota, + connections: [ + { + from: { name: "b", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "net2", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ], + }, + { + part: this.nand, + connections: [ + { + from: { name: "net", start: 0, width: 1 }, + to: { name: "a", start: 0, width: 1 }, + }, + { + from: { name: "net2", start: 0, width: 1 }, + to: { name: "b", start: 0, width: 1 }, + }, + { + from: { name: "out", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ], + }, + { + part: this.notb, + connections: [ + { + from: { name: "a", start: 0, width: 1 }, + to: { name: "in", start: 0, width: 1 }, + }, + { + from: { name: "net", start: 0, width: 1 }, + to: { name: "out", start: 0, width: 1 }, + }, + ], + }, + ]); + } + } + + const ora = new OrA(); + ora.in("a").pull(HIGH); + ora.in("b").pull(LOW); + ora.eval(); + expect(ora.out("out").busVoltage).toBe(HIGH); + + const orb = new OrB(); + orb.in("a").pull(HIGH); + orb.in("b").pull(LOW); + orb.eval(); + expect(orb.out("out").busVoltage).toBe(HIGH); + + const orc = new OrC(); + orc.in("a").pull(HIGH); + orc.in("b").pull(LOW); + orc.eval(); + expect(orc.out("out").busVoltage).toBe(HIGH); + }); +}); diff --git a/web-ide-main/simulator/src/chip/chip.ts b/web-ide-main/simulator/src/chip/chip.ts new file mode 100644 index 0000000..69159ab --- /dev/null +++ b/web-ide-main/simulator/src/chip/chip.ts @@ -0,0 +1,830 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { assert, assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { range } from "@davidsouther/jiffies/lib/esm/range.js"; +import { + Err, + isErr, + Ok, + Result, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import type { Subscription } from "rxjs"; +import { bin } from "../util/twos.js"; +import { Clock } from "./clock.js"; + +export const HIGH = 1; +export const LOW = 0; +export type Voltage = typeof HIGH | typeof LOW; + +export interface Pin { + readonly name: string; + readonly width: number; + busVoltage: number; + pull(voltage: Voltage, bit?: number): void; + toggle(bit?: number): void; + voltage(bit?: number): Voltage; + connect(pin: Pin): void; +} + +export function isConstantPin(pinName: string): boolean { + return ( + pinName === "false" || + pinName === "true" || + pinName === "0" || + pinName === "1" + ); +} + +export class Bus implements Pin { + state: Voltage[]; + next: Pin[] = []; + + constructor( + readonly name: string, + readonly width = 1, + ) { + this.state = range(0, this.width).map(() => LOW); + } + + ensureWidth(newWidth: number) { + assert(newWidth <= 16, `Cannot widen past 16 to ${newWidth} bits`); + if (this.width < newWidth) { + (this as { width: number }).width = newWidth; + this.state = [ + ...this.state, + ...range(this.width, newWidth).map(() => LOW as Voltage), + ]; + } + } + + connect(next: Pin) { + this.next.push(next); + next.busVoltage = this.busVoltage; + } + + pull(voltage: Voltage, bit = 0) { + assert( + bit >= 0 && bit < this.width, + `Bit out of bounds: ${this.name}@${bit}`, + ); + this.state[bit] = voltage; + this.next.forEach((n) => n.pull(voltage, bit)); + } + + voltage(bit = 0): Voltage { + assert(bit >= 0 && bit < this.width); + return this.state[bit]; + } + + set busVoltage(voltage: number) { + for (const i of range(0, this.width)) { + this.state[i] = ((voltage & (1 << i)) >> i) as Voltage; + } + this.next.forEach((n) => (n.busVoltage = this.busVoltage)); + } + + get busVoltage(): number { + return range(0, this.width).reduce((b, i) => b | (this.state[i] << i), 0); + } + + toggle(bit = 0) { + const nextVoltage = this.voltage(bit) === LOW ? HIGH : LOW; + this.pull(nextVoltage, bit); + } +} + +export class InSubBus extends Bus { + constructor( + private bus: Pin, + private start: number, + override readonly width = 1, + ) { + super(bus.name); + assert( + start >= 0 && start + width <= bus.width, + `Mismatched InSubBus dimensions on ${bus.name} (${width} + ${start} > ${bus.width})`, + ); + this.connect(bus); + } + + override pull(voltage: Voltage, bit = 0) { + assert(bit >= 0 && bit < this.width); + this.bus.pull(voltage, this.start + bit); + } + + override voltage(bit = 0): Voltage { + assert(bit >= 0 && bit < this.width); + return this.bus.voltage(this.start + bit); + } + + override set busVoltage(voltage: number) { + const high = this.bus.busVoltage & ~mask(this.width + this.start); + const low = this.bus.busVoltage & mask(this.start); + const mid = (voltage & mask(this.width)) << this.start; + this.bus.busVoltage = high | mid | low; + } + + override get busVoltage(): number { + return (this.bus.busVoltage >> this.start) & mask(this.width); + } + + override connect(bus: Pin): void { + assert( + this.start + this.width <= bus.width, + `Mismatched InSubBus connection dimensions (From ${bus.name} to ${this.name})`, + ); + this.bus = bus; + } +} + +export class OutSubBus extends Bus { + constructor( + private bus: Pin, + private start: number, + override readonly width = 1, + ) { + super(bus.name); + assert(start >= 0 && width <= bus.width, `Mismatched OutSubBus dimensions`); + this.connect(bus); + } + + override pull(voltage: Voltage, bit = 0) { + if (bit >= this.start && bit < this.start + this.width) { + this.bus.pull(voltage, bit - this.start); + } + } + + override set busVoltage(voltage: number) { + this.bus.busVoltage = + (voltage & mask(this.width + this.start)) >> this.start; + } + + override get busVoltage(): number { + return (this.bus.busVoltage >> this.start) & mask(this.width); + } + + override connect(bus: Pin): void { + assert( + this.width <= bus.width, + `Mismatched OutSubBus connection dimensions`, + ); + this.bus = bus; + } +} + +export class ConstantBus extends Bus { + constructor( + name: string, + private readonly value: number, + ) { + super(name, 16 /* TODO: get high bit index */); + } + + pullHigh(_ = 0) { + return undefined; + } + pullLow(_ = 0) { + return undefined; + } + override voltage(_ = 0): Voltage { + return (this.busVoltage & 0x1) as Voltage; + } + + override set busVoltage(voltage: number) { + // Noop + } + override get busVoltage(): number { + return this.value; + } +} + +export const TRUE_BUS = new ConstantBus("true", 0xffff); +export const FALSE_BUS = new ConstantBus("false", 0); + +export function parsePinDecl(toPin: string): { + pin: string; + width: number; +} { + const { pin, w } = toPin.match(/(?[a-zA-Z]+)(\[(?\d+)\])?/) + ?.groups as { + pin: string; + w?: string; + }; + return { + pin, + width: w ? Number(w) : 1, + }; +} + +export function parseToPin(toPin: string): { + pin: string; + start?: number; + end?: number; +} { + const { pin, i, j } = toPin.match( + /(?[a-z]+)(\[(?\d+)(\.\.(?\d+))?\])?/, + )?.groups as { pin: string; i?: string; j?: string }; + return { + pin, + start: i ? Number(i) : undefined, + end: j ? Number(j) : undefined, + }; +} + +export class Pins { + private readonly map = new Map(); + + insert(pin: Pin) { + const { name } = pin; + assert(!this.map.has(name), `Pins already has ${name}!`); + this.map.set(name, pin); + } + + emplace(name: string, minWidth?: number) { + if (this.has(name)) { + return assertExists(this.get(name)); + } else { + const pin = new Bus(name, minWidth); + this.insert(pin); + return pin; + } + } + + has(pin: string): boolean { + return this.map.has(pin); + } + + get(pin: string): Pin | undefined { + return this.map.get(pin); + } + + entries(): Iterable { + return this.map.values(); + } + + [Symbol.iterator]() { + return this.map[Symbol.iterator](); + } +} + +function validateWidth( + start: number, + width: number, + pin: Pin, +): Result { + return start + width <= pin.width + ? Ok() + : Err(`Sub-bus index out of range (${pin.name} has width ${pin.width})`); +} + +let id = 0; + +export interface PartWireError { + wireIndex: number; + lhs: boolean; + message: string; +} + +export interface WireError { + message: string; + lhs: boolean; +} +export class Chip { + readonly id = id++; + ins = new Pins(); + outs = new Pins(); + pins = new Pins(); + insToPart = new Map>(); + partToOuts = new Map>(); + parts: Chip[] = []; + clockedPins: Set; + clockSubscription?: Subscription; + + get clocked() { + if (this.clockedPins.size > 0) { + return true; + } + for (const part of this.parts) { + if (part.clocked) return true; + } + return false; + } + + constructor( + ins: (string | { pin: string; width: number })[], + outs: (string | { pin: string; width: number })[], + public name?: string, + internals: (string | { pin: string; width: number })[] = [], + clocked: string[] = [], + ) { + for (const inn of ins) { + const { pin, width = 1 } = + (inn as { pin: string }).pin !== undefined + ? (inn as { pin: string; width: number }) + : parsePinDecl(inn as string); + this.ins.insert(new Bus(pin, width)); + } + + for (const out of outs) { + const { pin, width = 1 } = + (out as { pin: string }).pin !== undefined + ? (out as { pin: string; width: number }) + : parsePinDecl(out as string); + this.outs.insert(new Bus(pin, width)); + } + + for (const internal of internals) { + const { pin, width = 1 } = + (internal as { pin: string }).pin !== undefined + ? (internal as { pin: string; width: number }) + : parsePinDecl(internal as string); + this.pins.insert(new Bus(pin, width)); + } + + this.clockedPins = new Set(clocked); + + this.subscribeToClock(); + } + + subscribeToClock() { + this.clockSubscription?.unsubscribe(); + this.clockSubscription = Clock.subscribe(() => this.eval()); + } + + reset() { + for (const [_, pin] of this.ins) { + pin.busVoltage = 0; + } + for (const part of this.parts) { + part.reset(); + } + this.eval(); + } + + in(pin = "in"): Pin { + assert(this.hasIn(pin), `No in pin ${pin}`); + return assertExists(this.ins.get(pin)); + } + + out(pin = "out"): Pin { + assert(this.hasOut(pin), `No in pin ${pin}`); + return assertExists(this.outs.get(pin)); + } + + hasIn(pin: string): boolean { + return this.ins.has(pin); + } + + hasOut(pin: string): boolean { + return this.outs.has(pin); + } + + pin(name: string): Pin { + assert(this.pins.has(name), "Pin not available in "); + return assertExists(this.pins.get(name)); + } + + get(name: string, offset?: number): Pin | undefined { + if (this.ins.has(name)) { + return assertExists(this.ins.get(name)); + } + if (this.outs.has(name)) { + return assertExists(this.outs.get(name)); + } + if (this.pins.has(name)) { + return assertExists(this.pins.get(name)); + } + return this.getBuiltin(name, offset); + } + + private getBuiltin(name: string, offset = 0): Pin | undefined { + if (BUILTIN_NAMES.includes(name)) { + for (const part of this.parts) { + const pin = part.get(name, offset); + if (pin) { + return pin; + } + } + } + return undefined; + } + + isInPin(pin: string): boolean { + return this.ins.has(pin); + } + + isOutPin(pin: string): boolean { + return this.outs.has(pin); + } + + isExternalPin(pin: string): boolean { + return this.isInPin(pin) || this.isOutPin(pin) || isConstantPin(pin); + } + + isInternalPin(pin: string): boolean { + return !this.isExternalPin(pin); + } + + pathExists(start: string, end: string) { + const nodes: (Chip | string)[] = [start]; + + while (nodes.length > 0) { + const node = assertExists(nodes.pop()); + if (typeof node == "string") { + if (node == end) { + return true; + } + nodes.push(...(this.insToPart.get(node) ?? [])); + } else { + nodes.push(...(this.partToOuts.get(node) ?? [])); + } + } + + return false; + } + + isClockedPin(pin: string) { + if (this.isInPin(pin)) { + return ![...this.outs].some(([out, _]) => this.pathExists(pin, out)); + } else { + return ![...this.ins].some(([in_, _]) => this.pathExists(in_, pin)); + } + } + + hasConnection(from: Chip, to: Chip): boolean { + return [...(this.partToOuts.get(from) ?? [])].some((pin) => + this.insToPart.get(pin)?.has(to), + ); + } + + wire(part: Chip, connections: Connection[]): Result { + for (let i = 0; i < connections.length; i++) { + const { from, to } = connections[i]; + if (part.isOutPin(to.name)) { + const result = this.wireOutPin(part, to, from); + if (isErr(result)) { + return Err({ + wireIndex: i, + lhs: Err(result).lhs, + message: Err(result).message, + }); + } + } else { + const result = this.wireInPin(part, to, from); + if (isErr(result)) { + return Err({ + wireIndex: i, + lhs: Err(result).lhs, + message: Err(result).message, + }); + } + } + } + this.parts.push(part); + + return Ok(); + } + + wireAll(wires: Iterable<{ part: Chip; connections: Connection[] }>) { + for (const { part, connections } of wires) { + this.wire(part, connections); + } + this.sortParts(); + } + + // Returns whether the part connection graph has a loop. This should be called + // after wiring pins, so that connections are sorted topologically to best + // simulate non-order-dependent wiring. This can be handled manually (OrB), + // by calling sortParts() after wiring (OrA), or by using wireAll for creating + // wires (OrC). + sortParts(): boolean { + const sorted: Chip[] = []; + const visited = new Set(); + const visiting = new Set(); + + type Node = { part: Chip; isReturning: boolean }; + + const stack: Node[] = this.parts.map((part) => ({ + part, + isReturning: false, + })); + + while (stack.length > 0) { + const node = assertExists(stack.pop()); + + if (node.isReturning) { + // If we are returning to this node, we can safely add it to the sorted list + visited.add(node.part); + sorted.push(node.part); + } else if (!visited.has(node.part)) { + if (visiting.has(node.part)) { + return true; + } + visiting.add(node.part); + + // Re-push this node to handle it on return + stack.push({ part: node.part, isReturning: true }); + + // Push all its children to visit them + for (const out of this.partToOuts.get(node.part) ?? []) { + stack.push( + ...Array.from(this.insToPart.get(out) ?? []) + .filter((part) => !visited.has(part)) + .map((part) => ({ + part, + isReturning: false, + })), + ); + } + } + } + + this.parts = sorted.reverse(); + return false; + } + + private findPin(from: string, minWidth?: number): Pin { + if (from === "true" || from === "1") { + return TRUE_BUS; + } + if (from === "false" || from === "0") { + return FALSE_BUS; + } + if (this.ins.has(from)) { + return assertExists(this.ins.get(from)); + } + if (this.outs.has(from)) { + return assertExists(this.outs.get(from)); + } + return this.pins.emplace(from, minWidth); + } + + private wireOutPin( + part: Chip, + to: PinSide, + from: PinSide, + ): Result { + const partPin = assertExists( + part.outs.get(to.name), + () => `Cannot wire to missing pin ${to.name}`, + ); + to.width ??= partPin.width; + + let chipPin = this.findPin(from.name, from.width ?? to.width); + const isInternal = this.pins.has(chipPin.name); + + from.width ??= chipPin.width; + + if (chipPin instanceof ConstantBus) { + return Err({ + message: `Cannot wire to constant bus`, + lhs: true, + }); + } + + // Widen internal pins + if (isInternal && chipPin instanceof Bus) { + chipPin.ensureWidth(from.start + from.width); + } + + // Wrap the chipPin in an InBus when the chip side is dimensioned + if (from.start > 0 || from.width !== chipPin.width) { + const result = validateWidth(from.start, from.width, chipPin); + if (isErr(result)) { + return Err({ + message: Err(result), + lhs: true, + }); + } + chipPin = new InSubBus(chipPin, from.start, from.width); + } + + // Wrap the chipPin in an OutBus when the part side is dimensioned + if (to.start > 0 || to.width !== partPin.width) { + const result = validateWidth(to.start, to.width, partPin); + if (isErr(result)) { + return Err({ + message: Err(result), + lhs: false, + }); + } + chipPin = new OutSubBus(chipPin, to.start, to.width); + } + + if (!part.clockedPins.has(partPin.name)) { + const partToOuts = this.partToOuts.get(part) ?? new Set(); + partToOuts.add(chipPin.name); + this.partToOuts.set(part, partToOuts); + } + + const loop = this.sortParts(); + + if (loop) { + const partToOuts = this.partToOuts.get(part) ?? new Set(); + partToOuts.delete(chipPin.name); + this.partToOuts.set(part, partToOuts); + return Err({ message: "Circular pin dependency", lhs: false }); + } else { + partPin.connect(chipPin); + } + + return Ok(); + } + + private wireInPin( + part: Chip, + to: PinSide, + from: PinSide, + ): Result { + let partPin = assertExists( + part.ins.get(to.name), + () => `Cannot wire to missing pin ${to.name}`, + ); + to.width ??= partPin.width; + + const chipPin = this.findPin(from.name, from.width ?? to.width); + + from.width ??= chipPin.width; + + // Wrap the partPin in an InBus when the part side is dimensioned + if (to.start > 0 || to.width !== partPin.width) { + const result = validateWidth(to.start, to.width, partPin); + if (isErr(result)) { + return Err({ + message: Err(result), + lhs: true, + }); + } + partPin = new InSubBus(partPin, to.start, to.width); + } + + // Wrap the partPin in an OutBus when the chip side is dimensioned + if (!["true", "false"].includes(chipPin.name)) { + if (from.start > 0 || from.width !== chipPin.width) { + const result = validateWidth(from.start, from.width, chipPin); + if (isErr(result)) { + return Err({ + message: Err(result), + lhs: false, + }); + } + partPin = new OutSubBus(partPin, from.start, from.width); + } + } + + if (!part.clockedPins.has(partPin.name)) { + const pinsToPart = this.insToPart.get(chipPin.name) ?? new Set(); + pinsToPart.add(part); + this.insToPart.set(chipPin.name, pinsToPart); + } + + const loop = this.sortParts(); + + if (loop) { + const pinsToPart = this.insToPart.get(chipPin.name) ?? new Set(); + pinsToPart.delete(part); + this.insToPart.set(chipPin.name, pinsToPart); + return Err({ message: "Circular pin dependency", lhs: true }); + } else { + chipPin.connect(partPin); + } + + return Ok(); + } + + eval() { + for (const chip of this.parts) { + TRUE_BUS.next.forEach((pin) => (pin.busVoltage = TRUE_BUS.busVoltage)); + FALSE_BUS.next.forEach((pin) => (pin.busVoltage = FALSE_BUS.busVoltage)); + chip.eval(); + } + } + + tick() { + this.eval(); + } + + tock() { + this.eval(); + } + + remove() { + this.clockSubscription?.unsubscribe(); + for (const part of this.parts) { + part.remove(); + } + } + + // For the ROM32K builtin to load from a file system + async load(fs: FileSystem, path: string): Promise { + for (const part of this.parts) { + if (part.name === "ROM32K") { + await part.load(fs, path); + } + } + } +} + +export class Low extends Chip { + constructor() { + super([], []); + this.outs.insert(FALSE_BUS); + } +} + +export class High extends Chip { + constructor() { + super([], []); + this.outs.insert(TRUE_BUS); + } +} + +export class ClockedChip extends Chip { + override get clocked(): boolean { + return true; + } + + override subscribeToClock(): void { + this.clockSubscription?.unsubscribe(); + this.clockSubscription = Clock.subscribe(({ level }) => { + if (level === LOW) { + this.tock(); + } else { + this.tick(); + } + }); + } + + override remove() { + this.clockSubscription?.unsubscribe(); + super.remove(); + } + + override reset(): void { + super.reset(); + this.tick(); + this.tock(); + } +} + +export interface PinSide { + name: string; + start: number; + width?: number; +} + +export interface Connection { + // To is the part side + to: PinSide; + // From is the chip side + from: PinSide; +} + +export type Pinout = Record; +export interface SerializedChip { + id: number; + name: string; + ins: Pinout; + outs: Pinout; + pins: Pinout; + children: SerializedChip[]; +} + +function mask(width: number) { + return Math.pow(2, width) - 1; +} + +function setBus(busses: Pinout, pin: Pin) { + busses[pin.name] = bin( + (pin.busVoltage & mask(pin.width)) << + (pin as unknown as { start: number }).start, + ); + return busses; +} + +export function printChip(chip: Chip): SerializedChip { + return { + id: chip.id, + name: chip.name ?? chip.constructor.name, + ins: [...chip.ins.entries()].reduce(setBus, {} as Pinout), + outs: [...chip.outs.entries()].reduce(setBus, {} as Pinout), + pins: [...chip.pins.entries()].reduce(setBus, {} as Pinout), + children: [...chip.parts.values()].map(printChip), + }; +} + +export const BUILTIN_NAMES = [ + "Register", + "ARegister", + "DRegister", + "PC", + "RAM8", + "RAM64", + "RAM512", + "RAM4K", + "RAM16K", + "ROM32K", + "Screen", + "Keyboard", + "Memory", +]; diff --git a/web-ide-main/simulator/src/chip/clock.ts b/web-ide-main/simulator/src/chip/clock.ts new file mode 100644 index 0000000..f3d56f5 --- /dev/null +++ b/web-ide-main/simulator/src/chip/clock.ts @@ -0,0 +1,92 @@ +import { assert } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { BehaviorSubject, Observable, Subject } from "rxjs"; +import { HIGH, LOW, Voltage } from "./chip.js"; + +interface Tick { + readonly level: Voltage; + readonly ticks: number; +} + +let clock: Clock; +export class Clock { + private level: Voltage = LOW; + private ticks = 0; + + static get() { + if (clock === undefined) { + clock = new Clock(); + } + return clock; + } + + static subscribe(observer: (value: Tick) => void) { + return Clock.get().$.subscribe(observer); + } + + get isHigh(): boolean { + return this.level === HIGH; + } + + get isLow(): boolean { + return this.level === LOW; + } + + private subject = new BehaviorSubject({ + level: this.level, + ticks: this.ticks, + }); + readonly frameSubject = new Subject(); + readonly resetSubject = new Subject(); + + readonly $: Observable = this.subject; + readonly frame$: Observable = this.frameSubject; + readonly reset$: Observable = this.resetSubject; + + private next() { + this.subject.next({ + level: this.level, + ticks: this.ticks, + }); + } + + private constructor() { + // private + } + + reset() { + this.level = LOW; + this.ticks = 0; + this.next(); + this.resetSubject.next(); + } + + tick() { + assert(this.level === LOW, "Can only tick up from LOW"); + this.level = HIGH; + this.next(); + } + + tock() { + assert(this.level === HIGH, "Can only tock down from HIGH"); + this.level = LOW; + this.ticks += 1; + this.next(); + } + + toggle() { + this.level === HIGH ? this.tock() : this.tick(); + } + + eval() { + this.tick(); + this.tock(); + } + + frame() { + this.frameSubject.next(); + } + + toString() { + return `${this.ticks}${this.level === HIGH ? "+" : ""}`; + } +} diff --git a/web-ide-main/simulator/src/chip/errors.txt b/web-ide-main/simulator/src/chip/errors.txt new file mode 100644 index 0000000..0ac85ff --- /dev/null +++ b/web-ide-main/simulator/src/chip/errors.txt @@ -0,0 +1,59 @@ +These are the errors from the current builder. + +https://github.com/DavidSouther/nand2tetris/blob/8adbbd3d23c1a1bc746946891bd6d489da08594a/nand2tetris/org/nand2tetris/hack/simulators/gates/CompositeGateClass.java#L212 + try { + result = getSubBus(pinName); + } catch (Exception e) { + input.HDLError(pinName + " has an invalid sub bus specification"); + } + +https://github.com/DavidSouther/nand2tetris/blob/8adbbd3d23c1a1bc746946891bd6d489da08594a/nand2tetris/org/nand2tetris/hack/simulators/gates/CompositeGateClass.java#L217 + if (result != null) { + if (result[0] < 0 || result[1] < 0) + input.HDLError(pinName + ": negative bit numbers are illegal"); + else if (result[0] > result[1]) + input.HDLError(pinName + ": left bit number should be lower than the right one"); + else if (result[1] >= busWidth) + input.HDLError(pinName + ": the specified sub bus is not in the bus range"); + } + +https://github.com/DavidSouther/nand2tetris/blob/8adbbd3d23c1a1bc746946891bd6d489da08594a/nand2tetris/org/nand2tetris/hack/simulators/gates/CompositeGateClass.java#L274 + // find left pin info. If doesn't exist - error. + byte leftType = partGateClass.getPinType(leftName); + if (leftType == UNKNOWN_PIN_TYPE) + input.HDLError(leftName + " is not a pin in " + partName); + +https://github.com/DavidSouther/nand2tetris/blob/8adbbd3d23c1a1bc746946891bd6d489da08594a/nand2tetris/org/nand2tetris/hack/simulators/gates/CompositeGateClass.java#L310 + if ((rightType == UNKNOWN_PIN_TYPE || rightType == INTERNAL_PIN_TYPE) && + !fullRightName.equals(rightName)) + input.HDLError(fullRightName + ": sub bus of an internal node may not be used"); + +https://github.com/DavidSouther/nand2tetris/blob/8adbbd3d23c1a1bc746946891bd6d489da08594a/nand2tetris/org/nand2tetris/hack/simulators/gates/CompositeGateClass.java#L333 + if (selfFittingWidth) { + if(!rightName.equals(fullRightName)) + input.HDLError(rightName + " may not be subscripted"); + +https://github.com/DavidSouther/nand2tetris/blob/8adbbd3d23c1a1bc746946891bd6d489da08594a/nand2tetris/org/nand2tetris/hack/simulators/gates/CompositeGateClass.java#L346 + // check that right & left has the same width + if (leftWidth != rightWidth) + input.HDLError(leftName + "(" + leftWidth + ") and " + rightName + "(" + rightWidth + + ") have different bus widths"); + +https://github.com/DavidSouther/nand2tetris/blob/8adbbd3d23c1a1bc746946891bd6d489da08594a/nand2tetris/org/nand2tetris/hack/simulators/gates/CompositeGateClass.java#L352 + // make sure that an internal pin is only fed once by a part's output pin + if ((rightType == INTERNAL_PIN_TYPE) && (leftType == OUTPUT_PIN_TYPE)) { + if (rightPinInfo.isInitialized(rightSubBus)) + input.HDLError("An internal pin may only be fed once by a part's output pin"); + +https://github.com/DavidSouther/nand2tetris/blob/8adbbd3d23c1a1bc746946891bd6d489da08594a/nand2tetris/org/nand2tetris/hack/simulators/gates/CompositeGateClass.java#L377 + // find connection type + switch (leftType) { + case INPUT_PIN_TYPE: + switch (rightType) { + case OUTPUT_PIN_TYPE: + input.HDLError("Can't connect gate's output pin to part"); + + case OUTPUT_PIN_TYPE: + switch (rightType) { + case INPUT_PIN_TYPE: + input.HDLError("Can't connect part's output pin to gate's input pin"); \ No newline at end of file diff --git a/web-ide-main/simulator/src/compare.test.ts b/web-ide-main/simulator/src/compare.test.ts new file mode 100644 index 0000000..fe9bbf5 --- /dev/null +++ b/web-ide-main/simulator/src/compare.test.ts @@ -0,0 +1,42 @@ +import { compare, compareLines, diff } from "./compare.js"; + +describe("compare", () => { + it("diffs a row", () => { + const as = ["a", "b", "c"]; + const bs = ["a", "d", "c"]; + const diffs = diff(as, bs); + expect(diffs).toMatchObject([{ a: "b", b: "d", col: 1 }]); + }); + + it("diffs a block", () => { + const as = [ + ["0", "0", "0"], + ["0", "1", "1"], + ["1", "0", "1"], + ["1", "1", "0"], + ]; + const bs = [ + ["0", "0", "0"], + ["0", "1", "0"], + ["1", "0", "0"], + ["1", "1", "1"], + ]; + const diffs = compare(as, bs); + expect(diffs).toMatchObject([ + { a: "1", b: "0", row: 1, col: 2 }, + { a: "1", b: "0", row: 2, col: 2 }, + { a: "0", b: "1", row: 3, col: 2 }, + ]); + }); +}); + +describe("compareLines", () => { + it("handles windows and unix lines", () => { + expect(compareLines("AAA\r\nBBB\r\nCCC\r\n", "AAA\nBBB\nCCC\n")).toEqual( + {}, + ); + expect(compareLines("AAA\nBBB\nCCC\n", "AAA\r\nBBB\r\nCCC\r\n")).toEqual( + {}, + ); + }); +}); diff --git a/web-ide-main/simulator/src/compare.ts b/web-ide-main/simulator/src/compare.ts new file mode 100644 index 0000000..f297d19 --- /dev/null +++ b/web-ide-main/simulator/src/compare.ts @@ -0,0 +1,82 @@ +export interface Diff { + a: string; + b: string; + row?: number; + col?: number; +} + +function normalLines( + str: string, + { + trim = true, + skipTrimmed = false, + }: { trim?: boolean; skipTrimmed?: boolean } = {}, +): string[] { + let lines = str.replace("\r\n", "\n").split("\n"); + + if (trim) lines = lines.map((line) => line.trim()); + if (skipTrimmed) lines = lines.filter((line) => line != ""); + return lines; +} + +export type CompareResultSuccess = Record; +export interface CompareResultLengths { + lenA: number; + lenB: number; +} +export interface CompareResultLine { + line: number; +} +export type CompareResult = + | CompareResultSuccess + | CompareResultLine + | CompareResultLengths; + +export function compareLines(as: string, bs: string): CompareResult { + const resultLines = normalLines(as); + const compareLines = normalLines(bs); + + if (resultLines.length != compareLines.length) { + return { lenA: resultLines.length, lenB: compareLines.length }; + } + + for (let line = 0; line < compareLines.length; line++) { + if (resultLines[line] !== compareLines[line]) { + return { line }; + } + } + + return {}; +} + +export function compare(as: string[][], bs: string[][]): Diff[] { + let diffs: Diff[] = []; + + const q = Math.max(as.length, bs.length); + for (let row = 0; row < q; row++) { + const a = as[row] ?? []; + const b = bs[row] ?? []; + diffs = diffs.concat( + diff(a, b).map((diff) => { + diff.row = row; + return diff; + }), + ); + } + + return diffs; +} + +export function diff(as: string[], bs: string[]): Diff[] { + const diffs: Diff[] = []; + + const q = Math.max(as.length, bs.length); + for (let col = 0; col < q; col++) { + const a = as[col] ?? ""; + const b = bs[col] ?? ""; + if (a !== b && !a.match(/\*+/)) { + diffs.push({ a, b, col }); + } + } + return diffs; +} diff --git a/web-ide-main/simulator/src/cpu/alu.test.ts b/web-ide-main/simulator/src/cpu/alu.test.ts new file mode 100644 index 0000000..b763a27 --- /dev/null +++ b/web-ide-main/simulator/src/cpu/alu.test.ts @@ -0,0 +1,67 @@ +import { alu, alua, COMMANDS, Flags } from "./alu.js"; + +describe("alu", () => { + it("calculates", () => { + expect(alu(COMMANDS.asm["0"], 123, 456)).toEqual([0, Flags.Zero]); + expect(alu(COMMANDS.asm["D+A"], 123, 456)).toEqual([579, Flags.Positive]); + expect(alu(COMMANDS.asm["D-A"], 123, 456)).toEqual([ + -333 & 0xffff, + Flags.Negative, + ]); + expect(alu(COMMANDS.asm["A-D"], 123, 456)).toEqual([333, Flags.Positive]); + expect(alu(COMMANDS.asm["D&A"], 0b1010, 0b1101)).toEqual([ + 0b1000, + Flags.Positive, + ]); + expect(alu(COMMANDS.asm["D|A"], 0b1010, 0b1101)).toEqual([ + 0b1111, + Flags.Positive, + ]); + }); + + it("calculates undocumented", () => { + // https://medium.com/@MadOverlord/14-nand2tetris-opcodes-they-dont-want-you-to-know-about-f3246831d1d1 + + // -2 + expect(alua(0b111110, 0, 0)).toEqual([0xfffe, Flags.Negative]); + + // NAND + expect(alua(0b000001, 0, 0)).toEqual([0xffff, Flags.Negative]); + expect(alua(0b000001, 0, 1)).toEqual([0xffff, Flags.Negative]); + expect(alua(0b000001, 1, 0)).toEqual([0xffff, Flags.Negative]); + expect(alua(0b000001, 1, 1)).toEqual([0xfffe, Flags.Negative]); + expect(alua(0b000001, 0b0011, 0b0101)).toEqual([ + 0b1111111111111110, + Flags.Negative, + ]); + + // NOR + expect(alua(0b010100, 0, 0)).toEqual([0xffff, Flags.Negative]); + expect(alua(0b010100, 0, 1)).toEqual([0xfffe, Flags.Negative]); + expect(alua(0b010100, 1, 0)).toEqual([0xfffe, Flags.Negative]); + expect(alua(0b010100, 1, 1)).toEqual([0xfffe, Flags.Negative]); + expect(alua(0b010100, 0b0011, 0b0101)).toEqual([ + 0b1111_1111_1111_1000, + Flags.Negative, + ]); + + // Weird + // 010000 : NOT(X) AND Y : 00,01,10,11 TruthTable=0100 + expect(alua(0b010000, 0b0011, 0b0101)[0] & 0b1111).toBe(0b0100); + // 010001 : NOT(NOT(X) AND Y) : 00,01,10,11 TruthTable=1011 + expect(alua(0b010001, 0b0011, 0b0101)[0] & 0b1111).toBe(0b1011); + // 000101 : NOT(X AND NOT(Y)) : 00,01,10,11 TruthTable=1101 + expect(alua(0b000101, 0b0011, 0b0101)[0] & 0b1111).toBe(0b1101); + // 000100 : X AND NOT(Y) : 00,01,10,11 TruthTable=0010 + expect(alua(0b000100, 0b0011, 0b0101)[0] & 0b1111).toBe(0b0010); + + // Bizarre + expect(alua(0b010111, 13, 19)[0]).toBe(33); // X + Y + 1 + expect(alua(0b000110, 13, 19)[0]).toBe(-7 & 0xffff); // X โ€” Y โ€” 1 + expect(alua(0b011110, 13, 19)[0]).toBe(-15 & 0xffff); // -(X + 2) + expect(alua(0b110110, 13, 19)[0]).toBe(-21 & 0xffff); // -(Y + 2) + expect(alua(0b010110, 13, 19)[0]).toBe(-34 & 0xffff); // -(X + Y + 2) + expect(alua(0b000011, 13, 19)[0]).toBe(-33 & 0xffff); // -(X + Y + 1) + expect(alua(0b010010, 13, 19)[0]).toBe(5 & 0xffff); // -(X โ€” Y + 1) + }); +}); diff --git a/web-ide-main/simulator/src/cpu/alu.ts b/web-ide-main/simulator/src/cpu/alu.ts new file mode 100644 index 0000000..79e0171 --- /dev/null +++ b/web-ide-main/simulator/src/cpu/alu.ts @@ -0,0 +1,330 @@ +const commandASMValues = new Set([ + "0", + "1", + "-1", + "D", + "A", + "!D", + "!A", + "-D", + "-A", + "D+1", + "A+1", + "D-1", + "A-1", + "D+A", + "D-A", + "A-D", + "D&A", + "D|A", +] as const); + +export type COMMANDS_ASM = typeof commandASMValues extends Set + ? S + : never; + +export function isCommandAsm(command: string): command is COMMANDS_ASM { + return ( + commandASMValues.has(command as COMMANDS_ASM) || + commandASMValues.has(command.replace("M", "A") as COMMANDS_ASM) + ); +} + +export type COMMANDS_OP = + | 0b101010 + | 0b111111 + | 0b111010 + | 0b001100 + | 0b110000 + | 0b110000 + | 0b001101 + | 0b110001 + | 0b001111 + | 0b110011 + | 0b011111 + | 0b110111 + | 0b001110 + | 0b110010 + | 0b000010 + | 0b010011 + | 0b010011 + | 0b000111 + | 0b000000 + | 0b000000 + | 0b010101 + | 0b010101; + +//Usefull for the visualization of the ALU +export type COMMANDS_ALU = + | "0" + | "1" + | "-1" + | "x" + | "y" + | "!x" + | "!y" + | "-x" + | "-y" + | "x+1" + | "y+1" + | "x-1" + | "y-1" + | "x+y" + | "x-y" + | "y-x" + | "x&y" + | "x|y"; + +export const COMMANDS_ALU: { + op: Record; +} = { + op: { + 0x2a: "0", + 0x3f: "1", + 0x3a: "-1", + 0x0c: "x", + 0x30: "y", + 0x0d: "!x", + 0x31: "!y", + 0x0f: "-x", + 0x33: "-y", + 0x1f: "x+1", + 0x37: "y+1", + 0x0e: "x-1", + 0x32: "y-1", + 0x02: "x+y", + 0x13: "x-y", + 0x07: "y-x", + 0x00: "x&y", + 0x15: "x|y", + }, +}; + +export const COMMANDS: { + asm: Record; + op: Record; + getOp: (asm: string) => COMMANDS_OP; +} = { + asm: { + "0": 0b101010, // 42 0x2A + "1": 0b111111, // 63 0x3F + "-1": 0b111010, // 58 0x3A + D: 0b001100, // 12 0x0C + A: 0b110000, // 48 0x30 + "!D": 0b001101, // 13 0x0D + "!A": 0b110001, // 49 0x31 + "-D": 0b001111, // 15 0x0F + "-A": 0b110011, // 51 0x33 + "D+1": 0b011111, // 31 0x1F + "A+1": 0b110111, // 55 0x37 + "D-1": 0b001110, // 14 0x0E + "A-1": 0b110010, // 50 0x32 + "D+A": 0b000010, // 2 0x02 + "D-A": 0b010011, // 19 0x13 + "A-D": 0b000111, // 7 0x07 + "D&A": 0b000000, // 0 0x00 + "D|A": 0b010101, // 21 0x15 + }, + op: { + 0x2a: "0", + 0x3f: "1", + 0x3a: "-1", + 0x0c: "D", + 0x30: "A", + 0x0d: "!D", + 0x31: "!A", + 0x0f: "-D", + 0x33: "-A", + 0x1f: "D+1", + 0x37: "A+1", + 0x0e: "D-1", + 0x32: "A-1", + 0x02: "D+A", + 0x13: "D-A", + 0x07: "A-D", + 0x00: "D&A", + 0x15: "D|A", + }, + getOp(asm: string) { + return COMMANDS.asm[asm.replace("M", "A") as COMMANDS_ASM]; + }, +}; + +const assignAsmValues = new Set([ + "", + "M", + "D", + "MD", + "A", + "AM", + "AD", + "AMD", +] as const); + +export type ASSIGN_ASM = typeof assignAsmValues extends Set + ? S + : never; + +export type ASSIGN_OP = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7; + +export function isAssignAsm(assign: unknown): assign is ASSIGN_ASM { + return assignAsmValues.has(assign as ASSIGN_ASM); +} + +export const ASSIGN: { + asm: Record; + op: Record; +} = { + asm: { + "": 0x0, + M: 0b001, + D: 0b010, + MD: 0b011, + A: 0b100, + AM: 0b101, + AD: 0b110, + AMD: 0b111, + }, + op: { + 0x0: "", + 0x1: "M", + 0x2: "D", + 0x3: "MD", + 0x4: "A", + 0x5: "AM", + 0x6: "AD", + 0x7: "AMD", + }, +}; + +const jumpAsmValues = new Set([ + "", + "JGT", + "JEQ", + "JGE", + "JLT", + "JNE", + "JLE", + "JMP", +] as const); + +export type JUMP_ASM = typeof jumpAsmValues extends Set ? S : never; +export type JUMP_OP = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7; + +export function isJumpAsm(jump: unknown): jump is JUMP_ASM { + return jumpAsmValues.has(jump as JUMP_ASM); +} + +export const JUMP: { + asm: Record; + op: Record; +} = { + asm: { + "": 0b0, + JGT: 0b001, + JEQ: 0b010, + JGE: 0b011, + JLT: 0b100, + JNE: 0b101, + JLE: 0b110, + JMP: 0b111, + }, + op: { + 0x0: "", + 0x1: "JGT", + 0x2: "JEQ", + 0x3: "JGE", + 0x4: "JLT", + 0x5: "JNE", + 0x6: "JLE", + 0x7: "JMP", + }, +}; + +export const Flags = { + 0x01: "Positive", + 0x00: "Zero", + 0x0f: "Negative", + Positive: 0x01, + Zero: 0x00, + Negative: 0x0f, +}; + +export function alu(op: number, d: number, a: number): [number, number] { + let o = 0; + switch (op) { + case 0x2a: + o = 0; + break; + case 0x3f: + o = 1; + break; + case 0x3a: + o = -1; + break; + case 0x0c: + o = d; + break; + case 0x30: + o = a; + break; + case 0x0d: + o = ~d; + break; + case 0x31: + o = ~a; + break; + case 0x0f: + o = -d; + break; + case 0x33: + o = -a; + break; + case 0x1f: + o = d + 1; + break; + case 0x37: + o = a + 1; + break; + case 0x0e: + o = d - 1; + break; + case 0x32: + o = a - 1; + break; + case 0x02: + o = d + a; + break; + case 0x13: + o = d - a; + break; + case 0x07: + o = a - d; + break; + case 0x00: + o = d & a; + break; + case 0x15: + o = d | a; + break; + } + + o = o & 0xffff; + const flags = + o === 0 ? Flags.Zero : o & 0x8000 ? Flags.Negative : Flags.Positive; + return [o, flags]; +} + +export function alua(op: number, d: number, a: number): [number, number] { + if (op & 0b100000) d = 0; + if (op & 0b010000) d = ~d & 0xffff; + if (op & 0b001000) a = 0; + if (op & 0b000100) a = ~a & 0xffff; + + let o = (op & 0b000010 ? d + a : d & a) & 0xffff; + if (op & 0b000001) o = ~o & 0xffff; + + const flags = + o === 0 ? Flags.Zero : o & 0x8000 ? Flags.Negative : Flags.Positive; + return [o, flags]; +} diff --git a/web-ide-main/simulator/src/cpu/cpu.test.ts b/web-ide-main/simulator/src/cpu/cpu.test.ts new file mode 100644 index 0000000..489bf35 --- /dev/null +++ b/web-ide-main/simulator/src/cpu/cpu.test.ts @@ -0,0 +1,202 @@ +import { HACK } from "../testing/mult.js"; +import { Flags } from "./alu.js"; +import { CPU, CPUInput, CPUState, cpu } from "./cpu.js"; +import { Memory } from "./memory.js"; + +describe("CPU", () => { + describe("cpu step function", () => { + test("@A: sets A for @ instuructions", () => { + const input: CPUInput = { inM: 0, reset: false, instruction: 0x0002 }; + const state: CPUState = { + A: 0, + D: 0, + PC: 0, + ALU: 0, + flag: Flags.Zero, + }; + + const [output, outState] = cpu(input, state); + + expect(output).toEqual({ outM: 0, writeM: false, addressM: 2 }); + expect(outState).toEqual({ + A: 2, + D: 0, + PC: 1, + ALU: 0, + flag: Flags.Zero, + }); + }); + + test("M=1: writes to memory", () => { + const input: CPUInput = { inM: 0, reset: false, instruction: 0xffc8 }; + const inState: CPUState = { + A: 2, + D: 0, + PC: 0, + ALU: 0, + flag: Flags.Zero, + }; + + const [output, outState] = cpu(input, inState); + + expect(output).toEqual({ outM: 1, writeM: true, addressM: 2 }); + expect(outState).toEqual({ + A: 2, + D: 0, + PC: 1, + ALU: 1, + flag: Flags.Positive, + }); + }); + + test("D=M: reads from memory", () => { + const input: CPUInput = { + inM: 0x1234, + reset: false, + instruction: 0xfc10, + }; + const inState: CPUState = { A: 0, D: 0, PC: 0, ALU: 0, flag: Flags.Zero }; + + const [output, outState] = cpu(input, inState); + + expect(output).toEqual({ outM: 0x1234, writeM: false, addressM: 0 }); + expect(outState).toEqual({ + A: 0, + D: 0x1234, + PC: 1, + ALU: 0x1234, + flag: Flags.Positive, + }); + }); + + test("D;JEQ: jumps when D is 0", () => { + const input: CPUInput = { + inM: 0x0, + reset: false, + instruction: 0xd302, + }; + const inState: CPUState = { + A: 0xf, + D: 0, + PC: 0, + ALU: 0, + flag: Flags.Zero, + }; + + const [output, outState] = cpu(input, inState); + + expect(output).toEqual({ outM: 0, writeM: false, addressM: 0xf }); + expect(outState).toEqual({ + A: 0xf, + D: 0, + PC: 15, + ALU: 0, + flag: Flags.Zero, + }); + }); + + test("D;JEQ: does not jump when D is not 0", () => { + const input: CPUInput = { + inM: 0x0, + reset: false, + instruction: 0xd302, + }; + const inState: CPUState = { + A: 0xf, + D: 3, + PC: 0, + ALU: 0, + flag: Flags.Zero, + }; + + const [output, outState] = cpu(input, inState); + + expect(output).toEqual({ outM: 3, writeM: false, addressM: 0xf }); + expect(outState).toEqual({ + A: 0xf, + D: 3, + PC: 1, + ALU: 3, + flag: Flags.Positive, + }); + }); + + test("D=D+M: adds memory with register", () => { + const input: CPUInput = { + inM: 5, + reset: false, + instruction: 0xf090, + }; + const inState: CPUState = { A: 0, D: 3, PC: 0, ALU: 0, flag: Flags.Zero }; + + const [output, outState] = cpu(input, inState); + + expect(output).toEqual({ outM: 13, writeM: false, addressM: 0 }); + expect(outState).toEqual({ + A: 0, + D: 8, + PC: 1, + ALU: 13, // ALU adds at every eval + flag: Flags.Positive, + }); + }); + + test("@15 A=-1;JMP", () => { + const input: CPUInput = { + inM: 0, + reset: false, + instruction: 0xeea7, + }; + const inState: CPUState = { + A: 15, + D: 0, + PC: 0, + ALU: 0, + flag: Flags.Zero, + }; + + const [output, outState] = cpu(input, inState); + + expect(output).toEqual({ outM: 0xffff, writeM: false, addressM: 0xffff }); + expect(outState).toEqual({ + A: 0xffff, + D: 0, + PC: 15, // Jumped to old address + ALU: 0xffff, + flag: Flags.Negative, + }); + }); + }); + + it("executes instructions", () => { + const RAM = new Memory(256); + RAM.set(0, 2); + RAM.set(1, 3); + const ROM = new Memory(HACK.buffer); + const cpu = new CPU({ RAM, ROM }); + + for (let i = 0; i < 100; i++) { + cpu.tick(); + } + + expect(RAM.get(2)).toBe(6); + }); + + // https://github.com/nand2tetris/web-ide/issues/337 + it("MD=D+1 does not double-update on tock", () => { + const RAM = new Memory(1); + const ROM = new Memory( + new Int16Array([ + 0x0000, // @0 + 0xefc8, // M=1 // init RAM[0]=1 + 0xefd0, // D=1 + 0xe7d8, // MD=D+1 + ]).buffer, + ); + + const cpu = new CPU({ RAM, ROM }); + for (let i = 0; i < 4; i++) cpu.tick(); + + expect(RAM.get(0)).toBe(2); + }); +}); diff --git a/web-ide-main/simulator/src/cpu/cpu.ts b/web-ide-main/simulator/src/cpu/cpu.ts new file mode 100644 index 0000000..eb03fc5 --- /dev/null +++ b/web-ide-main/simulator/src/cpu/cpu.ts @@ -0,0 +1,221 @@ +import { alu, COMMANDS_OP, Flags } from "./alu.js"; +import { + Memory, + MemoryAdapter, + MemoryKeyboard, + RAM as RAMMem, + SCREEN_OFFSET, + SCREEN_SIZE, + SubMemory, +} from "./memory.js"; + +export interface CPUInput { + inM: number; + instruction: number; + reset: boolean; +} + +export interface CPUOutput { + outM: number; + writeM: boolean; + addressM: number; +} + +export interface CPUState { + A: number; + D: number; + PC: number; + ALU: number; + flag: number; +} + +export function emptyState(): CPUState { + return { A: 0, D: 0, PC: 0, ALU: 0, flag: Flags.Zero }; +} + +const BITS = { + c: 0b1000_0000_0000_0000, + x1: 0b1001_0000_0000_0000, + x2: 0b1001_0000_0000_0000, + am: 0b1001_0000_0000_0000, + op: 0b0000_1111_1100_0000, + d1: 0b1000_0000_0010_0000, + d2: 0b1000_0000_0001_0000, + d3: 0b1000_0000_0000_1000, + j1: 0b1000_0000_0000_0001, + j2: 0b1000_0000_0000_0010, + j3: 0b1000_0000_0000_0100, +}; + +export function decode(instruction: number) { + function bit(bit: number): boolean { + return (instruction & bit) === bit; + } + const bits = { + c: bit(BITS.c), + x1: bit(BITS.x1), + x2: bit(BITS.x2), + am: bit(BITS.am), + op: ((instruction & BITS.op) >> 6) as COMMANDS_OP, + d1: bit(BITS.d1), + d2: bit(BITS.d2), + d3: bit(BITS.d3), + j1: bit(BITS.j1), + j2: bit(BITS.j2), + j3: bit(BITS.j3), + }; + + return bits; +} + +export function cpuTick( + { inM, instruction }: CPUInput, + { A, D, PC }: CPUState, +): [CPUState, boolean, number] { + const bits = decode(instruction); + const a = bits.am ? inM : A; + const [ALU, flag] = alu(bits.op, D, a); + + // While a DRegister would update during the Tock clock step, + // this implementation updates the D internal state during tick because the test will need to access the internal D state. + if (bits.d2) { + D = ALU; + } + + return [{ A, D, PC: PC + 1, ALU, flag }, bits.d3, ALU]; +} + +export function cpuTock( + { inM, instruction, reset }: CPUInput, + { A, D, PC, ALU, flag }: CPUState, +): [CPUOutput, CPUState] { + const bits = decode(instruction); + + const j1 = bits.j1 && flag === Flags.Positive; + const j2 = bits.j2 && flag === Flags.Zero; + const j3 = bits.j3 && flag === Flags.Negative; + const jmp = j1 || j2 || j3; + + PC = reset ? 0 : jmp ? A : PC; + + if (!bits.c) { + A = instruction & 0x7fff; + } else if (bits.d1) { + A = ALU; + } + + const a = bits.am ? inM : A; + const alu2 = alu(bits.op, D, a); + + ALU = alu2[0]; + flag = alu2[1]; + + const output: CPUOutput = { + addressM: A, + outM: ALU, + writeM: bits.d3, + }; + + const state: CPUState = { + A, + D, + ALU, + flag, + PC, + }; + + return [output, state]; +} + +export function cpu(input: CPUInput, state: CPUState): [CPUOutput, CPUState] { + const [tickState, _writeM] = cpuTick(input, state); + return cpuTock(input, tickState); +} + +export class CPU { + readonly RAM: Memory; + readonly ROM: Memory; + readonly Screen: MemoryAdapter; + readonly Keyboard: MemoryKeyboard; + + #pc = 0; + #a = 0; + #d = 0; + + #tickState: CPUState = { + A: 0, + D: 0, + PC: 0, + ALU: 0, + flag: Flags.Zero, + }; + + get state(): CPUState { + return this.#tickState; + } + + get PC() { + return this.#pc; + } + + get A() { + return this.#a; + } + + get D() { + return this.#d; + } + + setA(value: number) { + this.#a = value; + } + + setD(value: number) { + this.#d = value; + } + + setPC(value: number) { + this.#pc = value; + } + + constructor({ RAM = new RAMMem(), ROM }: { RAM?: Memory; ROM: Memory }) { + this.RAM = RAM; + this.ROM = ROM; + + // "Device Map" + this.Screen = new SubMemory(this.RAM, SCREEN_SIZE, SCREEN_OFFSET); + this.Keyboard = new MemoryKeyboard(this.RAM); + } + + reset() { + this.#pc = 0; + this.#a = 0; + this.#d = 0; + } + + tick() { + const addressM = this.#a; + const input = { + inM: this.RAM.get(this.#a), + instruction: this.ROM.get(this.#pc), + reset: false, + }; + + const [tickState, writeM, outM] = cpuTick(input, { + A: this.#a, + D: this.#d, + PC: this.#pc, + ALU: this.#d, + flag: Flags.Zero, + }); + + if (writeM) { + this.RAM.set(addressM, outM); + } + + const [_, { A, D, PC }] = cpuTock(input, tickState); + this.#a = A; + this.#d = D; + this.#pc = PC; + } +} diff --git a/web-ide-main/simulator/src/cpu/memory.ts b/web-ide-main/simulator/src/cpu/memory.ts new file mode 100644 index 0000000..68cf9f4 --- /dev/null +++ b/web-ide-main/simulator/src/cpu/memory.ts @@ -0,0 +1,234 @@ +import { assert } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { load } from "../fs.js"; +import { op } from "../util/asm.js"; +import { int2, int10, int16 } from "../util/twos.js"; + +export const FORMATS = ["bin", "dec", "hex", "asm"]; +export type Format = (typeof FORMATS)[number]; + +export const SCREEN_OFFSET = 0x4000; +export const SCREEN_ROWS = 256; +export const SCREEN_COLS = 32; // These are 16-bit columns +export const SCREEN_SIZE = SCREEN_ROWS * SCREEN_COLS; +export const KEYBOARD_OFFSET = 0x6000; + +export interface MemoryAdapter { + size: number; + get(index: number): number; + set(index: number, value: number): void; + reset(): void; + update(cell: number, value: string, format: Format): void; + load(fs: FileSystem, path: string, offset?: number): Promise; + loadBytes(bytes: number[], offset?: number): void; + range(start?: number, end?: number): number[]; + map( + fn: (index: number, value: number) => T, + start?: number, + end?: number, + ): Iterable; + [Symbol.iterator](): Iterable; +} + +export interface KeyboardAdapter { + getKey(): number; + setKey(key: number): void; + clearKey(): void; +} + +export class Memory implements MemoryAdapter { + private memory: Int16Array; + + get size(): number { + return this.memory.length; + } + + constructor(memory: ArrayBuffer | number) { + if (typeof memory === "number") { + this.memory = new Int16Array(memory); + } else { + this.memory = new Int16Array(memory); + } + } + + get(index: number): number { + if (index < 0 || index >= this.size) { + return 0xffff; + } + return this.memory[index] ?? 0; + } + + set(index: number, value: number): void { + if (index >= 0 && index < this.size) { + this.memory[index] = value & 0xffff; + } + } + + reset(): void { + this.memory.fill(0); + } + + update(cell: number, value: string, format: Format) { + let current: number | undefined; + switch (format) { + case "asm": + try { + current = op(value); + } catch { + current = undefined; + } + break; + case "bin": + current = int2(value); + break; + case "hex": + current = int16(value); + break; + case "dec": + default: + current = int10(value); + break; + } + + if (current !== undefined && isFinite(current) && current <= 0xffff) { + this.set(cell, current); + } + } + + async load(fs: FileSystem, path: string, offset?: number) { + try { + this.loadBytes(await load(fs, path), offset); + } catch (_cause) { + // throw new Error(`ROM32K Failed to load file ${path}`, { cause }); + throw new Error(`Memory Failed to load file ${path}`); + } + } + + loadBytes(bytes: number[], offset?: number): void { + this.memory.set(new Int16Array(bytes), offset); + this.memory.fill(0, bytes.length, this.size); + } + + range(start = 0, end = this.size): number[] { + return [...this.memory.slice(start, end)]; + } + + *map( + fn: (index: number, value: number) => T, + start = 0, + end = this.size, + ): Iterable { + assert(start <= end); + for (let i = start; i < end; i++) { + yield fn(i, this.get(i)); + } + } + + [Symbol.iterator](): Iterable { + return this.map((_, v) => v); + } + + isEmpty(): boolean { + return this.memory.every((word) => word === 0); + } +} + +export class SubMemory implements MemoryAdapter { + constructor( + private readonly parent: MemoryAdapter, + readonly size: number, + private readonly offset: number, + ) {} + + get(index: number): number { + if (index < 0 || index >= this.size) { + return 0xffff; + } + return this.parent.get(this.offset + index); + } + + set(index: number, value: number, trackChange = true): void { + if (index >= 0 && index < this.size) { + this.parent.set(index + this.offset, value); + } + } + + reset(): void { + for (let i = 0; i < this.size; i++) { + this.set(i, 0, false); + } + } + + update(index: number, value: string, format: string): void { + if (index >= 0 && index < this.size) { + this.parent.update(index + this.offset, value, format); + } + } + + load(fs: FileSystem, path: string): Promise { + return this.parent.load(fs, path, this.offset); + } + + loadBytes(bytes: number[]): void { + return this.parent.loadBytes(bytes, this.offset); + } + + range(start?: number, end?: number): number[] { + return this.parent.range(start, end); + } + + map( + fn: (index: number, value: number) => T, + start = 0, + end: number = this.size, + ): Iterable { + return this.parent.map(fn, start + this.offset, end + this.offset); + } + + [Symbol.iterator](): Iterable { + return this.map((_, v) => v); + } +} + +export class MemoryKeyboard extends SubMemory implements KeyboardAdapter { + constructor(memory: MemoryAdapter) { + super(memory, 1, 0x6000); + } + + getKey(): number { + return this.get(0); + } + + setKey(key: number): void { + this.set(0, key & 0xffff); + } + + clearKey(): void { + this.set(0, 0); + } +} + +export class ROM extends Memory { + static readonly SIZE = 0x8000; + constructor(program?: Int16Array) { + if (program) { + const arr = new Int16Array(ROM.SIZE); + arr.set(program); + super(arr.buffer); + } else { + super(ROM.SIZE); + } + } +} + +export class RAM extends Memory { + keyboard = new SubMemory(this, 1, KEYBOARD_OFFSET); + screen = new SubMemory(this, SCREEN_SIZE, SCREEN_OFFSET); + + // 4k main memory, 2k screen memory, 1 keyboard + static readonly SIZE = 0x4000 + 0x2000 + 0x0001; + + constructor() { + super(RAM.SIZE); + } +} diff --git a/web-ide-main/simulator/src/fs.ts b/web-ide-main/simulator/src/fs.ts new file mode 100644 index 0000000..e09e1e9 --- /dev/null +++ b/web-ide-main/simulator/src/fs.ts @@ -0,0 +1,25 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import * as loader from "./loader.js"; + +export async function load(fs: FileSystem, path: string): Promise { + if (path.endsWith(".hack")) { + return loadHack(fs, path); + } + + if (path.endsWith(".asm")) { + return loadAsm(fs, path); + } + + throw new Error(`Cannot load file without hack or asm extension ${path}`); +} + +export async function loadAsm(fs: FileSystem, path: string): Promise { + return loader.loadAsm(await fs.readFile(path)); +} + +export async function loadHack( + fs: FileSystem, + path: string, +): Promise { + return loader.loadHack(await fs.readFile(path)); +} diff --git a/web-ide-main/simulator/src/jack/compiler.test.ts b/web-ide-main/simulator/src/jack/compiler.test.ts new file mode 100644 index 0000000..1745def --- /dev/null +++ b/web-ide-main/simulator/src/jack/compiler.test.ts @@ -0,0 +1,163 @@ +import { Programs } from "@nand2tetris/projects/samples/project_11/index.js"; +import { JACK } from "../languages/jack"; +import { Compiler, compile } from "./compiler"; + +function parse(code: string, rule: string) { + return JACK.semantics(JACK.parser.match(code, rule)); +} + +describe("compiler", () => { + it("compiles expression", () => { + const exp = parse("(2 + 3) * 5", "Expression").expression; + + const compiler = new Compiler(); + compiler.compileExpression(exp); + expect(compiler.output).toEqual([ + "push constant 2", + "push constant 3", + "add", + "push constant 5", + "call Math.multiply 2", + ]); + }); + + it("compiles function", () => { + const func = parse( + `function void main() { + var int a; + let a = 4; + return; + }`, + "SubroutineDec", + ).subroutineDec; + + const compiler = new Compiler(); + compiler.className = "Main"; + compiler.compileFunction(func); + expect(compiler.output).toEqual([ + "function Main.main 1", + "push constant 4", + "pop local 0", + "push constant 0", + "return", + ]); + }); + + it("compiles array access", () => { + const statement = parse(`let x = arr[2];`, "Statement").statement; + + const compiler = new Compiler(); + compiler.localSymbolTable = { + x: { + type: "int", + segment: "local", + index: 0, + }, + arr: { + type: "Array", + segment: "local", + index: 1, + }, + }; + compiler.compileStatement(statement); + expect(compiler.output).toEqual([ + "push constant 2", + "push local 1", + "add", + "pop pointer 1", + "push that 0", + "pop local 0", + ]); + }); + + it("compiles if-else", () => { + const statement = parse( + `if (condition) { + let x = 4; + } else { + let x = 5; + }`, + "Statement", + ).statement; + + const compiler = new Compiler(); + compiler.className = "Main"; + compiler.localSymbolTable = { + condition: { + type: "boolean", + segment: "local", + index: 0, + }, + x: { + type: "int", + segment: "local", + index: 1, + }, + }; + compiler.compileStatement(statement); + expect(compiler.output).toEqual([ + "push local 0", + "not", + "if-goto Main_1", + "push constant 4", + "pop local 1", + "goto Main_0", + "label Main_1", + "push constant 5", + "pop local 1", + "label Main_0", + ]); + }); + + it.each(Object.keys(Programs))("%s", (program) => { + const compiled = compile( + Object.fromEntries( + Object.entries(Programs[program]).map(([name, file]) => [ + name, + file.jack, + ]), + ), + ); + + for (const file of Object.keys(compiled)) { + expect(compiled[file]).toEqual(Programs[program][file].compiled); + } + }); + + it("compiles a class with no fields", () => { + const compiled = compile({ + NoField: ` + class NoField { + constructor NoField new() { + return this; + } + method void dispose() { + do Memory.deAlloc(this); + return; + } + } + `, + Main: ` + class Main { + function void main() { + var NoField z; + let z = NoField.new(); + do z.dispose(); + return; + } + } + `, + }); + + const noFieldVm = compiled["NoField"]; + expect(noFieldVm).toContain("function NoField.new 0"); + expect(noFieldVm).not.toContain("call Memory.alloc 1"); + expect(noFieldVm).toContain("function NoField.dispose 0"); + expect(noFieldVm).not.toContain("call Memory.deAlloc 1"); + + const mainVm = compiled["Main"]; + expect(mainVm).toContain("function Main.main 1"); + expect(mainVm).toContain("call NoField.new 0"); + expect(mainVm).toContain("call NoField.dispose 1"); + }); +}); diff --git a/web-ide-main/simulator/src/jack/compiler.ts b/web-ide-main/simulator/src/jack/compiler.ts new file mode 100644 index 0000000..ca52069 --- /dev/null +++ b/web-ide-main/simulator/src/jack/compiler.ts @@ -0,0 +1,651 @@ +import { + Err, + isErr, + Ok, + Result, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import { CompilationError, createError, Span } from "../languages/base.js"; +import { + ArrayAccess, + Class, + ClassVarDec, + DoStatement, + Expression, + IfStatement, + isPrimitive, + JACK, + KeywordConstant, + LetStatement, + Op, + Parameter, + ReturnStatement, + Statement, + Subroutine, + SubroutineCall, + Term, + Type, + UnaryOp, + VarDec, + Variable, + WhileStatement, +} from "../languages/jack.js"; +import { Segment } from "../languages/vm.js"; +import { + makeInterface, + overridesOsCorrectly, + VM_BUILTINS, +} from "../vm/builtins.js"; +import { validateSubroutine } from "./controlFlow.js"; + +const osClasses = new Set([ + "Sys", + "Screen", + "Output", + "Keyboard", + "String", + "Array", + "Memory", + "Math", +]); + +function isOsClass(name: string): boolean { + return osClasses.has(name); +} + +function isError(value: unknown): value is CompilationError { + return (value as CompilationError).message != undefined; +} + +function capitalize(s: string) { + return s.charAt(0).toUpperCase() + s.slice(1); +} + +export function compile( + files: Record, +): Record { + const classes: Record = {}; + for (const [name, content] of Object.entries(files)) { + const parsed = JACK.parse(content); + if (isErr(parsed)) { + classes[name] = Err(parsed); + } else { + const cls = Ok(parsed); + const result = validateClass(cls); + classes[name] = + cls.name.value == name + ? isErr(result) + ? Err(result) + : cls + : createError( + `Class name ${cls.name.value} doesn't match file name ${name}`, + cls.name.span, + ); + } + } + + const validClasses: Record = Object.fromEntries( + Object.entries(classes).filter(([_, parsed]) => !isError(parsed)), + ) as Record; + + const vms: Record = {}; + for (const [name, parsed] of Object.entries(classes)) { + if (isError(parsed)) { + vms[name] = parsed; + } else { + try { + const compiled = new Compiler().compile(parsed, validClasses); + if (isErr(compiled)) { + vms[name] = Err(compiled); + } else { + vms[name] = Ok(compiled); + } + } catch (e) { + vms[name] = e as CompilationError; + } + } + } + return vms; +} + +function validateClass(cls: Class): Result { + const subroutineNames = new Set(); + for (const subroutine of cls.subroutines) { + if (subroutineNames.has(subroutine.name.value)) { + return Err( + createError( + `Subroutine ${subroutine.name.value} already declared`, + subroutine.name.span, + ), + ); + } + subroutineNames.add(subroutine.name.value); + const result = validateSubroutine(subroutine); + if (isErr(result)) { + return result; + } + } + return Ok(); +} + +interface VariableData { + type: Type; + segment: Segment; + index: number; +} + +const ops: Record = { + "+": "add", + "-": "sub", + "*": "call Math.multiply 2", + "/": "call Math.divide 2", + "&": "and", + "|": "or", + "<": "lt", + ">": "gt", + "=": "eq", +}; + +const unaryOps: Record = { + "-": "neg", + "~": "not", +}; + +interface SubroutineCallAttributes { + className: string; + subroutineName: string; + object?: string; // object being acted upon if this is a method (undefined if function / constructor) +} + +export class Compiler { + private instructions: string[] = []; + globalSymbolTable: Record = {}; + localSymbolTable: Record = {}; + + className = ""; + private classes: Record = {}; + + private labelNum = 0; + private fieldNum = 0; + private staticNum = 0; + private localNum = 0; + + get output(): string[] { + return Array.from(this.instructions); + } + + varData(name: string): VariableData | undefined { + return this.localSymbolTable[name] || this.globalSymbolTable[name]; + } + + var(name: string): string; + var(variable: Variable): string; + var(variable: ArrayAccess): string; + var(variable: LetStatement): string; + var(arg: string | Variable | ArrayAccess | LetStatement): string { + let name: string; + let span: Span | undefined; + if (typeof arg == "string") { + name = arg; + } else { + if (typeof arg.name == "string") { + name = arg.name; + span = arg.span; + } else { + name = arg.name.value; + span = arg.name.span; + } + } + const data = this.varData(name); + if (!data) { + throw createError(`Undeclared variable ${name}`, span); + } + return `${data.segment} ${data.index}`; + } + + write(...lines: string[]) { + this.instructions.push(...lines); + } + + getLabel() { + const label = `${this.className}_${this.labelNum}`; + this.labelNum += 1; + return label; + } + + compile( + cls: Class, + other?: Record, + ): Result { + this.className = cls.name.value; + this.classes = other ?? {}; + for (const varDec of cls.varDecs) { + this.compileClassVarDec(varDec); + } + for (const subroutine of cls.subroutines) { + this.compileSubroutineDec(subroutine); + } + return Ok( + this.instructions + .map((inst) => + inst.startsWith("function") || inst.startsWith("label") + ? inst + : " ".concat(inst), + ) + .join("\n"), + ); + } + + validateType(type: string, span?: Span) { + if (isPrimitive(type) || isOsClass(type) || this.classes[type]) { + return; + } + throw createError(`Unknown type ${type}`, span); + } + + validateReturnType(returnType: string, span?: Span) { + if (returnType == "void") { + return; + } + this.validateType(returnType, span); + } + + compileClassVarDec(dec: ClassVarDec) { + this.validateType(dec.type.value, dec.type.span); + for (const name of dec.names) { + if (dec.varType == "field") { + this.globalSymbolTable[name] = { + type: dec.type.value, + segment: "this", + index: this.fieldNum, + }; + this.fieldNum += 1; + } else { + this.globalSymbolTable[name] = { + type: dec.type.value, + segment: "static", + index: this.staticNum, + }; + this.staticNum += 1; + } + } + } + + compileVarDec(dec: VarDec) { + this.validateType(dec.type.value, dec.type.span); + for (const name of dec.names) { + this.localSymbolTable[name] = { + type: dec.type.value, + segment: "local", + index: this.localNum, + }; + this.localNum += 1; + } + } + + registerArgs(params: Parameter[], offset = false) { + let argNum = 0; + for (const param of params) { + this.validateType(param.type.value, param.type.span); + this.localSymbolTable[param.name] = { + type: param.type.value, + segment: "argument", + index: argNum + (offset ? 1 : 0), // when compiling a method the first argument is this, so we offset the others by 1 + }; + argNum += 1; + } + } + + validateSubroutineDec(subroutine: Subroutine) { + this.validateReturnType( + subroutine.returnType.value, + subroutine.returnType.span, + ); + + if (isOsClass(this.className)) { + const builtin = VM_BUILTINS[`${this.className}.${subroutine.name.value}`]; + + if (builtin && !overridesOsCorrectly(this.className, subroutine)) { + throw createError( + `OS subroutine ${this.className}.${subroutine.name.value} must follow the interface ${makeInterface(subroutine.name.value, builtin)})`, + ); + } + } + } + + compileSubroutineDec(subroutine: Subroutine) { + this.validateSubroutineDec(subroutine); + switch (subroutine.type) { + case "method": + this.compileMethod(subroutine); + break; + case "constructor": + this.compileConstructor(subroutine); + break; + case "function": + this.compileFunction(subroutine); + } + } + + compileSubroutineStart(subroutine: Subroutine, isMethod = false) { + this.localSymbolTable = {}; + this.localNum = 0; + this.registerArgs(subroutine.parameters, isMethod); + + const localCount = subroutine.body.varDecs + .map((dec) => dec.names.length) + .reduce((a, b) => a + b, 0); + this.write( + `function ${this.className}.${subroutine.name.value} ${localCount}`, + ); + for (const varDec of subroutine.body.varDecs) { + this.compileVarDec(varDec); + } + } + + compileFunction(subroutine: Subroutine) { + this.compileSubroutineStart(subroutine); + this.compileStatements(subroutine.body.statements); + } + + compileMethod(subroutine: Subroutine) { + this.compileSubroutineStart(subroutine, true); + this.write("push argument 0", "pop pointer 0"); + this.compileStatements(subroutine.body.statements); + } + + compileConstructor(subroutine: Subroutine) { + this.compileSubroutineStart(subroutine); + + if (this.fieldNum > 0) + this.write( + `push constant ${this.fieldNum}`, + "call Memory.alloc 1", + "pop pointer 0", + ); + else this.write("push constant 0", "pop pointer 0"); + + this.compileStatements(subroutine.body.statements); + } + + compileExpression(expression: Expression) { + this.compileTerm(expression.term); + for (const part of expression.rest) { + this.compileTerm(part.term); + this.compileOp(part.op); // postfix + } + } + + compileOp(op: Op) { + this.write(ops[op]); + } + + compileTerm(term: Term) { + switch (term.termType) { + case "numericLiteral": + this.write(`push constant ${term.value}`); + break; + case "stringLiteral": + this.compileStringLiteral(term.value); + break; + case "variable": + this.write(`push ${this.var(term)}`); + break; + case "keywordLiteral": + this.compileKeywordLiteral(term.value); + break; + case "subroutineCall": + this.compileSubroutineCall(term); + break; + case "arrayAccess": + this.compileExpression(term.index); + this.write( + `push ${this.var(term)}`, + "add", + "pop pointer 1", + "push that 0", + ); + break; + case "groupedExpression": + this.compileExpression(term.expression); + break; + case "unaryExpression": + this.compileTerm(term.term); + this.write(unaryOps[term.op]); + } + } + + validateArgNum(name: string, expected: number, call: SubroutineCall) { + const received = call.parameters.length; + if (expected != received) { + throw createError( + `${name} expected ${expected} arguments, got ${received}`, + call.span, + ); + } + } + + validateSubroutineCall( + className: string, + subroutineName: string, + call: SubroutineCall, + isMethod: boolean, + ) { + const builtin = VM_BUILTINS[`${className}.${subroutineName}`]; + if (builtin) { + if (builtin.type == "method" && !isMethod) { + throw createError( + `Method ${className}.${subroutineName} was called as a function/constructor`, + call.name.span, + ); + } + if (builtin.type != "method" && isMethod) { + throw createError( + `${capitalize( + builtin.type, + )} ${className}.${subroutineName} was called as a method`, + call.name.span, + ); + } + this.validateArgNum( + `${className}.${subroutineName}`, + builtin.args.length, + call, + ); + return; + } else if (this.classes[className]) { + for (const subroutine of this.classes[className].subroutines) { + if (subroutine.name.value == subroutineName) { + if (subroutine.type == "method" && !isMethod) { + throw createError( + `Method ${className}.${subroutineName} was called as a function/constructor`, + call.name.span, + ); + } + if (subroutine.type != "method" && isMethod) { + throw createError( + `${capitalize( + subroutine.name.value, + )} ${className}.${subroutineName} was called as a method`, + call.name.span, + ); + } + this.validateArgNum( + `${className}.${subroutineName}`, + subroutine.parameters.length, + call, + ); + return; + } + } + throw createError( + `Class ${className} doesn't contain a function/constructor ${subroutineName}`, + call.name.span, + ); + } else { + throw createError(`Class ${className} doesn't exist`, call.name.span); + } + } + + classifySubroutineCall(call: SubroutineCall): SubroutineCallAttributes { + let object: string | undefined; + let className = ""; + let subroutineName = ""; + + if (call.name.value.includes(".")) { + const [prefix, suffix] = call.name.value.split(".", 2); + subroutineName = suffix; + const varData = this.varData(prefix); + if (varData) { + // external method call + object = this.var(prefix); + className = varData.type; + } else { + // function / constructor call + className = prefix; + } + } else { + object = "pointer 0"; // this + className = this.className; + subroutineName = call.name.value; + } + + this.validateSubroutineCall( + className, + subroutineName, + call, + object != undefined, + ); + + return { className, subroutineName, object }; + } + + compileSubroutineCall(call: SubroutineCall) { + const attributes = this.classifySubroutineCall(call); + + if ( + attributes.className === "Memory" && + attributes.subroutineName === "deAlloc" && + this.fieldNum === 0 + ) { + for (const param of call.parameters) { + this.compileExpression(param); + this.write("pop temp 0"); + } + + this.write("push constant 0"); + return; + } + + if (attributes.object) { + this.write(`push ${attributes.object}`); + } + for (const param of call.parameters) { + this.compileExpression(param); + } + this.write( + `call ${attributes.className}.${attributes.subroutineName} ${ + call.parameters.length + (attributes.object ? 1 : 0) + }`, + ); + } + + compileStringLiteral(str: string) { + this.write(`push constant ${str.length}`, `call String.new 1`); + for (let i = 0; i < str.length; i++) { + this.write( + `push constant ${str.charCodeAt(i)}`, + `call String.appendChar 2`, + ); + } + } + + compileKeywordLiteral(keyword: KeywordConstant) { + switch (keyword) { + case "true": + this.write(`push constant 1`, `neg`); + break; + case "false": + this.write(`push constant 0`); + break; + case "null": + this.write(`push constant 0`); + break; + case "this": + this.write(`push pointer 0`); + } + } + + compileStatements(statements: Statement[]) { + for (const statement of statements) { + this.compileStatement(statement); + } + } + + compileStatement(statement: Statement) { + switch (statement.statementType) { + case "doStatement": + this.compileDoStatement(statement); + break; + case "ifStatement": + this.compileIf(statement); + break; + case "letStatement": + this.compileLet(statement); + break; + case "returnStatement": + this.compileReturn(statement); + break; + case "whileStatement": + this.compileWhile(statement); + } + } + + compileReturn(statement: ReturnStatement) { + if (statement.value) { + this.compileExpression(statement.value); + } else { + this.write(`push constant 0`); // return 0 + } + this.write(`return`); + } + + compileLet(statement: LetStatement) { + if (statement.arrayIndex) { + this.compileExpression(statement.arrayIndex); + this.write(`push ${this.var(statement)}`, "add"); + this.compileExpression(statement.value); + this.write("pop temp 0", "pop pointer 1", "push temp 0", "pop that 0"); + } else { + this.compileExpression(statement.value); + this.write(`pop ${this.var(statement)}`); + } + } + + compileDoStatement(statement: DoStatement) { + this.compileSubroutineCall(statement.call); + this.write(`pop temp 0`); + } + + compileIf(statement: IfStatement) { + const condTrue = this.getLabel(); + const condFalse = this.getLabel(); + + this.compileExpression(statement.condition); + this.write("not", `if-goto ${condFalse}`); + this.compileStatements(statement.body); + this.write(`goto ${condTrue}`, `label ${condFalse}`); + this.compileStatements(statement.else); + this.write(`label ${condTrue}`); + } + + compileWhile(statement: WhileStatement) { + const loop = this.getLabel(); + const exit = this.getLabel(); + + this.write(`label ${loop}`); + this.compileExpression(statement.condition); + this.write(`not`, `if-goto ${exit}`); + this.compileStatements(statement.body); + this.write(`goto ${loop}`, `label ${exit}`); + } +} diff --git a/web-ide-main/simulator/src/jack/controlFlow.ts b/web-ide-main/simulator/src/jack/controlFlow.ts new file mode 100644 index 0000000..1954273 --- /dev/null +++ b/web-ide-main/simulator/src/jack/controlFlow.ts @@ -0,0 +1,180 @@ +import { + Err, + isErr, + Ok, + Result, + unwrap, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import { CompilationError, createError } from "../languages/base.js"; +import { + IfStatement, + ReturnType, + Statement, + Subroutine, + WhileStatement, +} from "../languages/jack.js"; + +class CFGNode { + id: number; + hasReturn = false; + children: CFGNode[] = []; + + static count = 0; + + constructor() { + this.id = CFGNode.count; + CFGNode.count += 1; + } + + alwaysReturns(): boolean { + const visited: Set = new Set(); + + function checkReturn(node: CFGNode): boolean { + if (node.hasReturn) { + return true; + } else if (node.children.length === 0) { + return false; + } + visited.add(node); + for (const child of node.children) { + if (!visited.has(child) && !checkReturn(child)) { + return false; + } + } + return true; + } + + return checkReturn(this); + } + + getLeafs(): CFGNode[] { + const leafs: Set = new Set(); + const visited: Set = new Set(); + + function findLeafs(node: CFGNode) { + if (node.children.length === 0) { + leafs.add(node); + } else { + visited.add(node); + for (const child of node.children) { + if (!visited.has(child)) { + findLeafs(child); + } + } + } + } + + findLeafs(this); + return Array.from(leafs); + } +} + +function processIf( + statement: IfStatement, + returnType: ReturnType, + current: CFGNode, +): Result { + const ifStart = new CFGNode(); + current.children.push(ifStart); + current = ifStart; + const result1 = buildCFG(statement.body, returnType); + const result2 = buildCFG(statement.else, returnType); + if (isErr(result1)) { + return result1; + } + if (isErr(result2)) { + return result2; + } + const path1 = unwrap(result1); + const path2 = unwrap(result2); + current.children.push(path1, path2); + const leafs = path1.getLeafs().concat(path2.getLeafs()); + current = new CFGNode(); + for (const leaf of leafs) { + leaf.children.push(current); + } + return Ok(current); +} + +function processWhile( + statement: WhileStatement, + returnType: ReturnType, + current: CFGNode, +): Result { + const whileStart = new CFGNode(); + current.children.push(whileStart); + current = whileStart; + const result = buildCFG(statement.body, returnType); + if (isErr(result)) { + return result; + } + const body = unwrap(result); + for (const leaf of body.getLeafs()) { + leaf.children.push(current); + } + const next = new CFGNode(); + current.children.push(body, next); + current = next; + return Ok(current); +} + +function buildCFG( + statements: Statement[], + returnType: ReturnType, +): Result { + const root = new CFGNode(); + let current = root; + + let result: Result | undefined; + for (const statement of statements) { + switch (statement.statementType) { + case "letStatement": + case "doStatement": + break; + case "returnStatement": + if (returnType != "void" && statement.value == undefined) { + return Err( + createError( + `A non void subroutine must return a value`, + statement.span, + ), + ); + } + current.hasReturn = true; + break; + case "ifStatement": + result = processIf(statement, returnType, current); + if (isErr(result)) { + return result; + } + current = unwrap(result); + break; + case "whileStatement": + result = processWhile(statement, returnType, current); + if (isErr(result)) { + return result; + } + current = unwrap(result); + break; + } + } + return Ok(root); +} + +export function validateSubroutine( + subroutine: Subroutine, +): Result { + const cfg = buildCFG(subroutine.body.statements, subroutine.returnType.value); + if (isErr(cfg)) { + return cfg; + } + if (!unwrap(cfg).alwaysReturns()) { + return Err( + createError( + `Subroutine ${subroutine.name.value}: not all code paths return a value`, + subroutine.name.span, + ), + ); + } + return Ok(); +} diff --git a/web-ide-main/simulator/src/languages/asm.test.ts b/web-ide-main/simulator/src/languages/asm.test.ts new file mode 100644 index 0000000..fb425f2 --- /dev/null +++ b/web-ide-main/simulator/src/languages/asm.test.ts @@ -0,0 +1,367 @@ +import { MaxAsm } from "@nand2tetris/projects/samples/project_06/02_max.js"; +import { ASSIGN, COMMANDS, JUMP } from "../cpu/alu.js"; +import { Asm, asmSemantics, emit, fillLabel, grammar } from "./asm.js"; + +describe("asm language", () => { + it("parses an empty file", () => { + const match = grammar.match(""); + expect(match).toHaveSucceeded(); + expect(asmSemantics(match).asm).toEqual({ instructions: [] }); + }); + + it("parses an A instruction to a label", () => { + const match = grammar.match("@R0", "aInstruction"); + expect(match).toHaveSucceeded(); + expect(asmSemantics(match).instruction).toEqual({ + type: "A", + label: "R0", + value: undefined, + span: { line: 1, start: 0, end: 3 }, + }); + }); + + it("parses an A instruction to a value", () => { + const match = grammar.match("@5", "aInstruction"); + expect(match).toHaveSucceeded(); + expect(asmSemantics(match).instruction).toEqual({ + type: "A", + label: undefined, + value: 5, + span: { line: 1, start: 0, end: 2 }, + }); + }); + + it("parses a C instruction", () => { + const match = grammar.match("-1", "cInstruction"); + expect(match).toHaveSucceeded(); + expect(asmSemantics(match).instruction).toEqual({ + type: "C", + op: COMMANDS.getOp("-1"), + isM: false, + span: { line: 1, start: 0, end: 2 }, + }); + }); + + it("parses a C instruction with assignment", () => { + const match = grammar.match("D=M", "cInstruction"); + expect(match).toHaveSucceeded(); + expect(asmSemantics(match).instruction).toEqual({ + type: "C", + op: COMMANDS.getOp("M"), + store: ASSIGN.asm["D"], + isM: true, + span: { line: 1, start: 0, end: 3 }, + }); + }); + + it("parses a C instruction with operation", () => { + const match = grammar.match("M=M+1", "cInstruction"); + expect(match).toHaveSucceeded(); + expect(asmSemantics(match).instruction).toEqual({ + type: "C", + op: COMMANDS.getOp("A+1"), + store: ASSIGN.asm["M"], + isM: true, + span: { line: 1, start: 0, end: 5 }, + }); + }); + + it("parses a C instruction with jump", () => { + const match = grammar.match("D;JEQ", "cInstruction"); + expect(match).toHaveSucceeded(); + expect(asmSemantics(match).instruction).toEqual({ + type: "C", + op: COMMANDS.getOp("D"), + jump: JUMP.asm["JEQ"], + isM: false, + span: { line: 1, start: 0, end: 5 }, + }); + }); + + it("parses a C instruction with assignment and jump", () => { + const match = grammar.match("A=D;JEQ", "cInstruction"); + expect(match).toHaveSucceeded(); + expect(asmSemantics(match).instruction).toEqual({ + type: "C", + op: COMMANDS.getOp("D"), + jump: JUMP.asm["JEQ"], + store: ASSIGN.asm["A"], + isM: false, + span: { line: 1, start: 0, end: 7 }, + }); + }); + + it("parses a file into instructions", () => { + const match = grammar.match(MaxAsm); + + expect(match).toHaveSucceeded(); + const { instructions } = asmSemantics(match).asm as Asm; + expect(instructions).toEqual([ + { + type: "A", + label: "R0", + span: { line: 10, start: 319, end: 322 }, + }, + { + type: "C", + op: COMMANDS.getOp("M"), + store: ASSIGN.asm["D"], + isM: true, + span: { line: 11, start: 325, end: 328 }, + }, + { + type: "A", + label: "R1", + span: { line: 12, start: 331, end: 334 }, + }, + { + type: "C", + op: COMMANDS.getOp("D-M"), + store: ASSIGN.asm["D"], + isM: true, + span: { line: 13, start: 337, end: 342 }, + }, + { + type: "A", + label: "ITSR0", + span: { line: 15, start: 372, end: 378 }, + }, + { + type: "C", + op: COMMANDS.getOp("D"), + jump: JUMP.asm["JGT"], + isM: false, + span: { line: 16, start: 381, end: 386 }, + }, + { + type: "A", + label: "R1", + span: { line: 18, start: 401, end: 404 }, + }, + { + type: "C", + op: COMMANDS.getOp("M"), + store: ASSIGN.asm["D"], + isM: true, + span: { line: 19, start: 407, end: 410 }, + }, + { + type: "A", + label: "OUTPUT_D", + span: { line: 20, start: 413, end: 422 }, + }, + { + type: "C", + op: COMMANDS.getOp("0"), + jump: JUMP.asm["JMP"], + isM: false, + span: { line: 21, start: 425, end: 430 }, + }, + { + type: "L", + label: "ITSR0", + span: { line: 22, start: 431, end: 438 }, + }, + { + type: "A", + label: "R0", + span: { line: 23, start: 441, end: 444 }, + }, + { + type: "C", + op: COMMANDS.getOp("M"), + store: ASSIGN.asm["D"], + isM: true, + span: { line: 24, start: 447, end: 450 }, + }, + { + type: "L", + label: "OUTPUT_D", + span: { line: 25, start: 451, end: 461 }, + }, + { + type: "A", + label: "R2", + span: { line: 26, start: 464, end: 467 }, + }, + { + type: "C", + op: COMMANDS.getOp("D"), + store: ASSIGN.asm["M"], + isM: false, + span: { line: 27, start: 470, end: 473 }, + }, + { + type: "L", + label: "END", + span: { line: 28, start: 474, end: 479 }, + }, + { + type: "A", + label: "END", + span: { line: 29, start: 482, end: 486 }, + }, + { + type: "C", + op: COMMANDS.getOp("0"), + jump: JUMP.asm["JMP"], + isM: false, + span: { line: 30, start: 489, end: 494 }, + }, + ]); + }); + + it("assembles a file to hack", () => { + const match = grammar.match(MaxAsm); + + expect(match).toHaveSucceeded(); + + const asm: Asm = asmSemantics(match).asm; + fillLabel(asm); + + expect(asm.instructions).toEqual([ + { + type: "A", + value: 0, + span: { line: 10, start: 319, end: 322 }, + }, + { + type: "C", + op: COMMANDS.getOp("M"), + store: ASSIGN.asm["D"], + isM: true, + span: { line: 11, start: 325, end: 328 }, + }, + { + type: "A", + value: 1, + span: { line: 12, start: 331, end: 334 }, + }, + { + type: "C", + op: COMMANDS.getOp("D-M"), + store: ASSIGN.asm["D"], + isM: true, + span: { line: 13, start: 337, end: 342 }, + }, + { + type: "A", + value: 10, + span: { line: 15, start: 372, end: 378 }, + }, + { + type: "C", + op: COMMANDS.getOp("D"), + jump: JUMP.asm["JGT"], + isM: false, + span: { line: 16, start: 381, end: 386 }, + }, + { + type: "A", + value: 1, + span: { line: 18, start: 401, end: 404 }, + }, + { + type: "C", + op: COMMANDS.getOp("M"), + store: ASSIGN.asm["D"], + isM: true, + span: { line: 19, start: 407, end: 410 }, + }, + { + type: "A", + value: 12, + span: { line: 20, start: 413, end: 422 }, + }, + { + type: "C", + op: COMMANDS.getOp("0"), + jump: JUMP.asm["JMP"], + isM: false, + span: { line: 21, start: 425, end: 430 }, + }, + { + type: "L", + label: "ITSR0", + span: { line: 22, start: 431, end: 438 }, + }, + { + type: "A", + value: 0, + span: { line: 23, start: 441, end: 444 }, + }, + { + type: "C", + op: COMMANDS.getOp("M"), + store: ASSIGN.asm["D"], + isM: true, + span: { line: 24, start: 447, end: 450 }, + }, + { + type: "L", + label: "OUTPUT_D", + span: { line: 25, start: 451, end: 461 }, + }, + { + type: "A", + value: 2, + span: { line: 26, start: 464, end: 467 }, + }, + { + type: "C", + op: COMMANDS.getOp("D"), + store: ASSIGN.asm["M"], + isM: false, + span: { line: 27, start: 470, end: 473 }, + }, + { + type: "L", + label: "END", + span: { line: 28, start: 474, end: 479 }, + }, + { + type: "A", + value: 14, + span: { line: 29, start: 482, end: 486 }, + }, + { + type: "C", + op: COMMANDS.getOp("0"), + jump: JUMP.asm["JMP"], + isM: false, + span: { line: 30, start: 489, end: 494 }, + }, + ]); + }); + + it("assembles a file to bin", () => { + const match = grammar.match(MaxAsm); + + expect(match).toHaveSucceeded(); + + const asm: Asm = asmSemantics(match).asm; + fillLabel(asm); + const bin = emit(asm); + + // biome-ignore format: special constant formatting + const file = [ + 0b0_000000000000000, // @R0 0x0000 + 0b111_1_110000_010_000, // D=M 0xFE10 + 0b0_000000000000001, // @R1 0x0001 + 0b111_1_010011_010_000, // D=D-M 0xF8D0 + 0b0_000000000001010, // @ITSR0#10 0x000A + 0b111_0_001100_000_001, // D;JGT 0xE301 + 0b0_000000000000001, // @R1 0x0001 + 0b111_1_110000_010_000, // D=M 0xFE10 + 0b0_000000000001100, // @OUTPUT_D#12 0x000C + 0b111_0_101010_000_111, // 0;JMP (ITSR0:10) 0xEA85 + 0b0_000000000000000, // @R0 0x0000 + 0b111_1_110000_010_000, // D=M (OUTPUT_D:12) 0x000C + 0b0_000000000000010, // @R2 0x0002 + 0b111_0_001100_001_000, // M=D (INFINITE LOOP:14) 0xE308 + 0b0_000000000001110, // @INFINITE_LOOP#14 0x0014 + 0b111_0_101010_000_111, // 0;JMP 0xEA83 + ]; + expect(bin).toEqual(file); + }); +}); diff --git a/web-ide-main/simulator/src/languages/asm.ts b/web-ide-main/simulator/src/languages/asm.ts new file mode 100644 index 0000000..557d449 --- /dev/null +++ b/web-ide-main/simulator/src/languages/asm.ts @@ -0,0 +1,365 @@ +import { assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { Err, Ok, Result } from "@davidsouther/jiffies/lib/esm/result.js"; +import { type Node, grammar as ohmGrammar } from "ohm-js"; +import { + ASSIGN, + ASSIGN_ASM, + ASSIGN_OP, + COMMANDS, + COMMANDS_ASM, + COMMANDS_OP, + isAssignAsm, + isCommandAsm, + JUMP, + JUMP_ASM, + JUMP_OP, +} from "../cpu/alu.js"; +import { KEYBOARD_OFFSET, SCREEN_OFFSET } from "../cpu/memory.js"; +import { makeC } from "../util/asm.js"; +import { + baseSemantics, + CompilationError, + createError, + grammars, + makeParser, + Span, + span, +} from "./base.js"; +import asmGrammar from "./grammars/asm.ohm.js"; + +export const grammar = ohmGrammar(asmGrammar, grammars); +export const asmSemantics = grammar.extendSemantics(baseSemantics); + +export interface Asm { + instructions: AsmInstruction[]; +} + +export type AsmInstruction = + | AsmAInstruction + | AsmCInstruction + | AsmLabelInstruction; + +export type AsmAInstruction = AsmALabelInstruction | AsmAValueInstruction; +export interface AsmALabelInstruction { + type: "A"; + label: string; + span?: Span; +} + +export interface AsmAValueInstruction { + type: "A"; + value: number; + span?: Span; +} + +export function isAValueInstruction( + inst: AsmInstruction, +): inst is AsmAValueInstruction { + return inst.type == "A" && (inst as AsmAValueInstruction).value !== undefined; +} + +function isALabelInstruction( + inst: AsmInstruction, +): inst is AsmALabelInstruction { + return inst.type == "A" && (inst as AsmALabelInstruction).label !== undefined; +} + +export interface AsmCInstruction { + type: "C"; + op: COMMANDS_OP; + isM: boolean; + store?: ASSIGN_OP; + jump?: JUMP_OP; + span?: Span; +} + +export interface AsmLabelInstruction { + type: "L"; + label: string; + span?: Span; +} + +asmSemantics.addAttribute("root", { + Root(_) { + return this.asm; + }, +}); + +asmSemantics.addAttribute("asm", { + ASM(asm, last) { + const instructions = + asm.children.map( + (node) => node.intermediateInstruction as AsmInstruction, + ) ?? []; + return { + instructions: last.child(0) + ? [...instructions, last.child(0).instruction] + : instructions, + }; + }, +}); + +asmSemantics.addAttribute("intermediateInstruction", { + intermediateInstruction(inst, _n) { + return inst.instruction; + }, +}); + +function getAsmAssign(assignN: Node) { + let assign = assignN.child(0)?.child(0)?.sourceString ?? ""; + + // The book (figure 4.5) specifies DM and ADM as the correct forms for destination, + // but since the desktop simulators accept only MD and AMD we have decided to accept both */ + if (assign == "DM") { + assign = "MD"; + } + if (assign == "ADM") { + assign = "AMD"; + } + if (assign != "" && !isAssignAsm(assign)) { + const reversed = assign.split("").reverse().join(""); + const suggestion = isAssignAsm(reversed) + ? `. Did you mean ${reversed}?` + : ""; + throw createError( + `Invalid ASM target: ${assign}${suggestion}`, + span(assignN.source), + ); + } + + return assign; +} + +function getAsmOp(opN: Node) { + const op = opN.sourceString; + + if (!isCommandAsm(op)) { + const reversed = op.split("").reverse().join(""); + const suggestion = isCommandAsm(reversed) + ? `. Did you mean ${reversed}?` + : ""; + throw createError( + `Invalid ASM value: ${opN.sourceString}${suggestion}`, + span(opN.source), + ); + } + + return op; +} + +asmSemantics.addAttribute("instruction", { + aInstruction(_at, name): AsmAInstruction { + return A(name.value, span(this.source)); + }, + cInstruction(assignN, opN, jmpN): AsmCInstruction { + const assign = getAsmAssign(assignN); + + const op = getAsmOp(opN) as COMMANDS_ASM; + const jmp = (jmpN.child(0)?.child(1)?.sourceString ?? "") as JUMP_ASM; + return C(assign as ASSIGN_ASM, op, jmp, span(this.source)); + }, + label(_o, { name }, _c): AsmLabelInstruction { + return L(name, span(this.source)); + }, +}); + +export type Pointer = + | "R0" + | "R1" + | "R2" + | "R3" + | "R4" + | "R5" + | "R6" + | "R7" + | "R8" + | "R9" + | "R10" + | "R11" + | "R12" + | "R13" + | "R14" + | "R15" + | "SP" + | "LCL" + | "ARG" + | "THIS" + | "THAT" + | "SCREEN" + | "KBD"; + +export function fillLabel( + asm: Asm, + symbolCallback?: (name: string, value: number, isVar: boolean) => void, +): Result { + let nextLabel = 16; + const symbols = new Map([ + ["R0", 0], + ["R1", 1], + ["R2", 2], + ["R3", 3], + ["R4", 4], + ["R5", 5], + ["R6", 6], + ["R7", 7], + ["R8", 8], + ["R9", 9], + ["R10", 10], + ["R11", 11], + ["R12", 12], + ["R13", 13], + ["R14", 14], + ["R15", 15], + ["SP", 0], + ["LCL", 1], + ["ARG", 2], + ["THIS", 3], + ["THAT", 4], + ["SCREEN", SCREEN_OFFSET], + ["KBD", KEYBOARD_OFFSET], + ]); + + function getLabelValue(label: string) { + if (!symbols.has(label)) { + symbols.set(label, nextLabel); + symbolCallback?.(label, nextLabel, true); + nextLabel += 1; + } + return assertExists(symbols.get(label), `Label not in symbols: ${label}`); + } + + function transmuteAInstruction(instruction: AsmALabelInstruction) { + const value = getLabelValue(instruction.label); + (instruction as unknown as AsmAValueInstruction).value = value; + delete (instruction as unknown as { label: undefined }).label; + } + + const unfilled: AsmALabelInstruction[] = []; + let line = 0; + for (const instruction of asm.instructions) { + if (instruction.type === "L") { + if (symbols.has(instruction.label)) { + return Err( + createError(`Duplicate label ${instruction.label}`, instruction.span), + ); + } else { + symbols.set(instruction.label, line); + symbolCallback?.(instruction.label, line, false); + } + continue; + } + + line += 1; + + if (instruction.type === "A") { + if (isALabelInstruction(instruction)) { + unfilled.push(instruction); + } + } + } + + unfilled.forEach(transmuteAInstruction); + return Ok(); +} + +function writeCInst(inst: AsmCInstruction): string { + return ( + (inst.store ? `${ASSIGN.op[inst.store]}=` : "") + + COMMANDS.op[inst.op] + + (inst.jump ? `;${JUMP.op[inst.jump]}` : "") + ); +} + +export const AsmToString = (inst: AsmInstruction | string): string => { + if (typeof inst === "string") return inst; + switch (inst.type) { + case "A": + return isALabelInstruction(inst) ? `@${inst.label}` : `@${inst.value}`; + case "L": + return `(${inst.label})`; + case "C": + return writeCInst(inst); + } +}; + +export function translateInstruction(inst: AsmInstruction): number | undefined { + if (inst.type === "A") { + if (isALabelInstruction(inst)) { + throw new Error(`ASM Emitting unfilled A instruction`); + } + return inst.value; + } + if (inst.type === "C") { + return makeC( + inst.isM, + inst.op, + (inst.store ?? 0) as ASSIGN_OP, + (inst.jump ?? 0) as ASSIGN_OP, + ); + } + return undefined; +} + +export function emit(asm: Asm): number[] { + return asm.instructions + .map(translateInstruction) + .filter((op): op is number => op !== undefined); +} + +const A = (source: string | number, span?: Span): AsmAInstruction => + typeof source === "string" + ? { + type: "A", + label: source, + span, + } + : { + type: "A", + value: source, + span, + }; + +const C = ( + assign: ASSIGN_ASM, + op: COMMANDS_ASM, + jmp?: JUMP_ASM, + span?: Span, +): AsmCInstruction => { + const inst: AsmCInstruction = { + type: "C", + op: COMMANDS.getOp(op), + isM: op.includes("M"), + span, + }; + if (jmp) inst.jump = JUMP.asm[jmp]; + if (assign) inst.store = ASSIGN.asm[assign]; + return inst; +}; + +const AC = ( + source: string | number, + assign: ASSIGN_ASM, + op: COMMANDS_ASM, + jmp?: JUMP_ASM, +) => [A(source), C(assign, op, jmp)]; + +const L = (label: string, span?: Span): AsmLabelInstruction => ({ + type: "L", + label, + span, +}); + +export const ASM = { + grammar: asmGrammar, + semantics: asmSemantics, + parser: grammar, + parse: makeParser(grammar, asmSemantics), + passes: { + fillLabel, + emit, + }, + A, + C, + AC, + L, +}; diff --git a/web-ide-main/simulator/src/languages/base.test.ts b/web-ide-main/simulator/src/languages/base.test.ts new file mode 100644 index 0000000..8ec4da2 --- /dev/null +++ b/web-ide-main/simulator/src/languages/base.test.ts @@ -0,0 +1,54 @@ +import { cleanState } from "@davidsouther/jiffies/lib/esm/scope/state.js"; +import { grammar } from "ohm-js"; +import { baseSemantics, grammars } from "./base.js"; + +describe("Ohm Base", () => { + it("parses numbers", () => { + const match = grammars.Base.match("1234", "Number"); + + expect(match).toHaveSucceeded(); + const { value } = baseSemantics(match); + expect(value).toBe(1234); + }); + + it.each([ + ["%XFF", 255], + ["%D128", 128], + ["127", 127], + ["%B11", 3], + ["%D-1", 0xffff], + ["0", 0], + ["11111", 11111], + ])("parses values", (str, num) => { + const match = grammars.Base.match(str, "Number"); + expect(match).toHaveSucceeded(); + expect(baseSemantics(match).value).toBe(num); + }); + + it("saves names", () => { + const match = grammars.Base.match("inout", "Name"); + expect(match).toHaveSucceeded(); + const { name } = baseSemantics(match); + expect(name).toBe("inout"); + }); + + describe("trailing lists", () => { + const state = cleanState(() => { + const repGrammar = grammar( + `Rep <: Base { + Rep = List<"A", ","> + Block = OpenParen Rep CloseParen + }`, + grammars, + ); + return { repGrammar }; + }, beforeEach); + + it.each([ + ["A,", "Rep"], + ["(A,)", "Block"], + ])("allows trailing lists", (str, tag) => { + expect(state.repGrammar.match(str, tag)).toHaveSucceeded(); + }); + }); +}); diff --git a/web-ide-main/simulator/src/languages/base.ts b/web-ide-main/simulator/src/languages/base.ts new file mode 100644 index 0000000..1944fa4 --- /dev/null +++ b/web-ide-main/simulator/src/languages/base.ts @@ -0,0 +1,122 @@ +import { Err, Ok, Result } from "@davidsouther/jiffies/lib/esm/result.js"; +import { + type Dict, + type Grammar, + grammar, + Interval, + type Semantics, +} from "ohm-js"; +import { int2, int10, int16 } from "../util/twos.js"; + +import baseGrammar from "./grammars/base.ohm.js"; +export const grammars = { + Base: grammar(baseGrammar), +}; + +export const baseSemantics = grammars.Base.createSemantics(); + +baseSemantics.extendOperation("asIteration", { + List(list, _) { + return list.asIteration(); + }, +}); + +baseSemantics.addAttribute("value", { + decNumber(_, digits): number { + return int10(digits.sourceString); + }, + wholeDec(_, digits): number { + return int10(digits.sourceString); + }, + binNumber(_, digits) { + return int2(digits.sourceString); + }, + hexNumber(_, digits) { + return int16(digits.sourceString); + }, + Number(num) { + return num.value; + }, + Name(ident) { + return ident.name; + }, + identifier(_, __): string { + return this.sourceString; + }, +}); + +baseSemantics.addAttribute("name", { + identifier(_, __): string { + return this.sourceString; + }, + Name(_): string { + return this.child(0)?.name; + }, +}); + +baseSemantics.addAttribute("String", { + String(_a, str, _b) { + return str.sourceString; + }, +}); + +export interface CompilationError { + message: string; + span?: Span; +} + +const UNKNOWN_HDL_ERROR = `HDL statement has a syntax error`; + +export function createError( + description: string, + span?: Span, +): CompilationError { + const match = description.match(/Line \d+, col \d+: (?.*)/); + const message = match?.groups?.message ? match.groups.message : description; + return { + message: `${ + span?.line != undefined ? `Line ${span.line}: ` : "" + }${message}`, + span: span, + }; +} + +export function makeParser( + grammar: Grammar, + semantics: Semantics, + property: (obj: Dict) => ResultType = ({ root }) => root, +): (source: string) => Result { + return function parse(source) { + try { + const match = grammar.match(source); + if (match.succeeded()) { + const parsed = semantics(match); + const parse = property(parsed); + return Ok(parse); + } else { + return Err( + createError( + match.shortMessage ?? UNKNOWN_HDL_ERROR, + span(match.getInterval()), + ), + ); + } + } catch (e) { + return Err(e as Error); + } + }; +} + +export interface Span { + start: number; + end: number; + line: number; +} + +export function span(span: Interval): Span { + return { + start: span.startIdx, + end: span.endIdx, + line: span.getLineAndColumn().lineNum, + }; +} diff --git a/web-ide-main/simulator/src/languages/cmp.test.ts b/web-ide-main/simulator/src/languages/cmp.test.ts new file mode 100644 index 0000000..693dd16 --- /dev/null +++ b/web-ide-main/simulator/src/languages/cmp.test.ts @@ -0,0 +1,26 @@ +import { cmpSemantics, grammar } from "./cmp.js"; + +describe("cmp language", () => { + it("parses an empty file", () => { + const match = grammar.match(""); + expect(match).toHaveSucceeded(); + expect(cmpSemantics(match).root).toEqual([]); + }); + + it("parses a file into lines", () => { + const match = grammar.match(`| a | b | out | +| 0 | 0 | 0 | +| 1 | 0 | 1 | +| 0 | 1 | 1 | +| 1 | 1 | 0 |`); + + expect(match).toHaveSucceeded(); + expect(cmpSemantics(match).root).toEqual([ + [" a ", " b ", " out "], + [" 0 ", " 0 ", " 0 "], + [" 1 ", " 0 ", " 1 "], + [" 0 ", " 1 ", " 1 "], + [" 1 ", " 1 ", " 0 "], + ]); + }); +}); diff --git a/web-ide-main/simulator/src/languages/cmp.ts b/web-ide-main/simulator/src/languages/cmp.ts new file mode 100644 index 0000000..1ce8e26 --- /dev/null +++ b/web-ide-main/simulator/src/languages/cmp.ts @@ -0,0 +1,35 @@ +import { grammar as ohmGrammar } from "ohm-js"; +import { baseSemantics, grammars, makeParser } from "./base.js"; + +export type Cell = string; +export type Line = Cell[]; +export type Cmp = Line[]; + +import cmpGrammar from "./grammars/cmp.ohm.js"; +export const grammar = ohmGrammar(cmpGrammar, grammars); +export const cmpSemantics = grammar.extendSemantics(baseSemantics); + +cmpSemantics.addAttribute("cell", { + cell(value, _) { + return value.sourceString; + }, +}); + +cmpSemantics.addAttribute("line", { + line(_a, cells, _b) { + return cells.children.map((c) => c.cell); + }, +}); + +cmpSemantics.addAttribute("root", { + Root(lines) { + return lines.children.map((c) => c.line); + }, +}); + +export const CMP = { + grammar: cmpGrammar, + semantics: cmpSemantics, + parser: grammar, + parse: makeParser(grammar, cmpSemantics), +}; diff --git a/web-ide-main/simulator/src/languages/grammars/.gitignore b/web-ide-main/simulator/src/languages/grammars/.gitignore new file mode 100644 index 0000000..a11483e --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/.gitignore @@ -0,0 +1 @@ +.ohm.js diff --git a/web-ide-main/simulator/src/languages/grammars/asm.ohm b/web-ide-main/simulator/src/languages/grammars/asm.ohm new file mode 100644 index 0000000..ecee950 --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/asm.ohm @@ -0,0 +1,21 @@ +ASM <: Base { + Root := ASM + ASM = intermediateInstruction* instruction? + + instruction = label|aInstruction|cInstruction + intermediateInstruction = instruction space+ + + identifier := (letter|underscore|dot|dollar|colon) (alnum|underscore|dot|dollar|colon)* + + label = openParen identifier closeParen + aInstruction = at (identifier | decNumber) + cInstruction = assign? op jmp? + + assignChar = "A" | "M" | "D" + opChar = assignChar | "0" | "1" | "!" | "-" | "+" | "|" | "&" + + assign = assignChar+ equal + op = opChar+ + + jmp = semi ("JGT" | "JEQ" | "JGE" | "JLT" | "JNE" | "JLE" | "JMP") +} \ No newline at end of file diff --git a/web-ide-main/simulator/src/languages/grammars/asm.ohm.js b/web-ide-main/simulator/src/languages/grammars/asm.ohm.js new file mode 100644 index 0000000..2426b59 --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/asm.ohm.js @@ -0,0 +1,22 @@ +const asm = `ASM <: Base { + Root := ASM + ASM = intermediateInstruction* instruction? + + instruction = label|aInstruction|cInstruction + intermediateInstruction = instruction space+ + + identifier := (letter|underscore|dot|dollar|colon) (alnum|underscore|dot|dollar|colon)* + + label = openParen identifier closeParen + aInstruction = at (identifier | decNumber) + cInstruction = assign? op jmp? + + assignChar = "A" | "M" | "D" + opChar = assignChar | "0" | "1" | "!" | "-" | "+" | "|" | "&" + + assign = assignChar+ equal + op = opChar+ + + jmp = semi ("JGT" | "JEQ" | "JGE" | "JLT" | "JNE" | "JLE" | "JMP") +}`; +export default asm; diff --git a/web-ide-main/simulator/src/languages/grammars/base.ohm b/web-ide-main/simulator/src/languages/grammars/base.ohm new file mode 100644 index 0000000..7e87372 --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/base.ohm @@ -0,0 +1,77 @@ +Base { + Root = Value* + + At = at + Bang = bang + Bar = bar + CloseAngle = closeAngle + CloseBrace = closeBrace + CloseParen = closeParen + CloseSquare = closeSquare + Comma = comma + Dollar = dollar + Dot = dot + DoubleQuote = doubleQuote + Equal = equal + OpenAngle = openAngle + OpenBrace = openBrace + OpenParen = openParen + OpenSquare = openSquare + Percent = percent + Semi = semi + Underscore = underscore + + at = "@" + bang = "!" + bar = "|" + closeAngle = ">" + closeBrace = "}" + closeParen = ")" + closeSquare = "]" + comma = "," + dollar = "$" + dot = "." + doubleQuote = "\"" + equal = "=" + minus = "-" + newline = "\r"? "\n" + openAngle = "<" + openBrace = "{" + openParen = "(" + openSquare = "[" + percent = "%" + semi = ";" + underscore = "_" + colon = ":" + + Value = identifier | number | boolean + + boolean = true | false + True = true + False = false + true = "true" + false = "false" + + Name = identifier + identifier = (letter|underscore|dot|dollar) (alnum|underscore|dot|dollar)* + + Number = number + number = hexNumber | decNumber | binNumber + binNumber = ("%B") ("0"|"1")+ + hexNumber = ("%X") hexDigit+ + decNumber = ("%D")? (wholeDec | realDec) + wholeDec = minus? digit+ + realDec = minus? digit* "." digit+ + + String = DoubleQuote (~doubleQuote any)* doubleQuote + + spaces := (lineComment | comment | space)* + commentStart = "/*" + commentEnd = "*/" + comment = commentStart (~commentEnd any)* commentEnd + lineCommentStart = "//" + lineComment = lineCommentStart (~"\n" any)* + + List = NonemptyListOf sep? + EmptyList = EmptyList sep? +} \ No newline at end of file diff --git a/web-ide-main/simulator/src/languages/grammars/base.ohm.js b/web-ide-main/simulator/src/languages/grammars/base.ohm.js new file mode 100644 index 0000000..acce3f4 --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/base.ohm.js @@ -0,0 +1,79 @@ +const base = ` +Base { + Root = Value* + + At = at + Bang = bang + Bar = bar + CloseAngle = closeAngle + CloseBrace = closeBrace + CloseParen = closeParen + CloseSquare = closeSquare + Comma = comma + Dollar = dollar + Dot = dot + DoubleQuote = doubleQuote + Equal = equal + OpenAngle = openAngle + OpenBrace = openBrace + OpenParen = openParen + OpenSquare = openSquare + Percent = percent + Semi = semi + Underscore = underscore + + at = "@" + bang = "!" + bar = "|" + closeAngle = ">" + closeBrace = "}" + closeParen = ")" + closeSquare = "]" + comma = "," + dollar = "$" + dot = "." + doubleQuote = "\\"" + equal = "=" + minus = "-" + newline = "\\r"? "\\n" + openAngle = "<" + openBrace = "{" + openParen = "(" + openSquare = "[" + percent = "%" + semi = ";" + underscore = "_" + colon = ":" + + Value = identifier | number | boolean + + boolean = true | false + True = true + False = false + true = "true" + false = "false" + + Name = identifier + identifier = (letter|underscore|dot|dollar) (alnum|underscore|dot|dollar)* + + Number = number + number = hexNumber | decNumber | binNumber + binNumber = ("%B") ("0"|"1")+ + hexNumber = ("%X") hexDigit+ + decNumber = ("%D")? (wholeDec | realDec) + wholeDec = minus? digit+ + realDec = minus? digit* "." digit+ + + String = DoubleQuote (~doubleQuote any)* doubleQuote + + spaces := (lineComment | comment | space)* + commentStart = "/*" + commentEnd = "*/" + comment = commentStart (~commentEnd any)* commentEnd + lineCommentStart = "//" + lineComment = lineCommentStart (~"\\n" any)* + + List = NonemptyListOf sep? + EmptyList = EmptyList sep? +}`; +export default base; diff --git a/web-ide-main/simulator/src/languages/grammars/cmp.ohm b/web-ide-main/simulator/src/languages/grammars/cmp.ohm new file mode 100644 index 0000000..735740b --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/cmp.ohm @@ -0,0 +1,6 @@ +Cmp <: Base { + Root := line* + line = bar cell+ newline? + cell = cellvalue bar + cellvalue = (~(bar|newline) any)* +} \ No newline at end of file diff --git a/web-ide-main/simulator/src/languages/grammars/cmp.ohm.js b/web-ide-main/simulator/src/languages/grammars/cmp.ohm.js new file mode 100644 index 0000000..05fdf51 --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/cmp.ohm.js @@ -0,0 +1,8 @@ +const cmp = ` +Cmp <: Base { + Root := line* + line = bar cell+ newline? + cell = cellvalue bar + cellvalue = (~(bar|newline) any)* +}`; +export default cmp; diff --git a/web-ide-main/simulator/src/languages/grammars/hdl.ohm b/web-ide-main/simulator/src/languages/grammars/hdl.ohm new file mode 100644 index 0000000..f2deaa3 --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/hdl.ohm @@ -0,0 +1,23 @@ +Hdl <: Base{ + Root := Chip + identifier := (letter) (alnum)* + Name := identifier + Chip = "CHIP" Name OpenBrace ChipBody CloseBrace + ChipBody = InList? OutList? PartList ClockedList? + InList = "IN" PinList Semi + OutList = "OUT" PinList Semi + PartList = BuiltinPart | Parts + PinList = List + PinDecl = Name PinWidth? + PinWidth = OpenSquare decNumber CloseSquare + BuiltinPart = "BUILTIN" Semi + Parts = "PARTS:" Part* + Part = Name "(" Wires ")" Semi + Wires = List + Wire = WireSide Equal (WireSide | True | False) + WireSide = Name SubBus? + SubBus = OpenSquare decNumber subBusRest? CloseSquare + subBusRest = ".." decNumber + ClockedList = "CLOCKED" SimplePinList Semi + SimplePinList = List +} \ No newline at end of file diff --git a/web-ide-main/simulator/src/languages/grammars/hdl.ohm.js b/web-ide-main/simulator/src/languages/grammars/hdl.ohm.js new file mode 100644 index 0000000..b730f80 --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/hdl.ohm.js @@ -0,0 +1,25 @@ +const hdl = ` +Hdl <: Base{ + Root := Chip + identifier := (letter) (alnum)* + Name := identifier + Chip = "CHIP" Name OpenBrace ChipBody CloseBrace + ChipBody = InList? OutList? PartList ClockedList? + InList = "IN" PinList Semi + OutList = "OUT" PinList Semi + PartList = BuiltinPart | Parts + PinList = List + PinDecl = Name PinWidth? + PinWidth = OpenSquare decNumber CloseSquare + BuiltinPart = "BUILTIN" Semi + Parts = "PARTS:" Part* + Part = Name "(" Wires ")" Semi + Wires = List + Wire = WireSide Equal (WireSide | True | False) + WireSide = Name SubBus? + SubBus = OpenSquare decNumber subBusRest? CloseSquare + subBusRest = ".." decNumber + ClockedList = "CLOCKED" SimplePinList Semi + SimplePinList = List +}`; +export default hdl; diff --git a/web-ide-main/simulator/src/languages/grammars/jack.ohm b/web-ide-main/simulator/src/languages/grammars/jack.ohm new file mode 100644 index 0000000..f313b9e --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/jack.ohm @@ -0,0 +1,78 @@ +Jack <: Base { + Root := Class + + whitespace = (lineComment | comment | space) + + class = "class" whitespace+ + Class = class jackIdentifier OpenBrace ClassVarDec* SubroutineDec* CloseBrace + + type = ("int" | "char" | "boolean" | jackIdentifier) whitespace+ + + classVarType = ("static" | "field") whitespace+ + ClassVarDec = classVarType type jackIdentifier TrailingIdentifier* Semi + TrailingIdentifier = Comma jackIdentifier + + void = "void" whitespace+ + returnType = (type | void) + subroutineType = ("constructor" | "function" | "method") whitespace+ + SubroutineDec = subroutineType returnType jackIdentifier OpenParen ParameterList CloseParen SubroutineBody + + + Parameter = type jackIdentifier + Parameters = Parameter TrailingParameter* + TrailingParameter = Comma Parameter + ParameterList = Parameters? + + SubroutineBody = OpenBrace VarDec* Statement* CloseBrace + + var = "var" whitespace+ + VarDec = var type jackIdentifier TrailingIdentifier* Semi + + Statement = LetStatement | IfStatement | WhileStatement | DoStatement | ReturnStatement + + arrayAccessStart = jackIdentifier openSquare + ArrayAccess = arrayAccessStart Expression CloseSquare + + let = "let" whitespace+ + LetTarget = ArrayAccess | jackIdentifier + LetStatement = let LetTarget Equal Expression Semi + + IfStatement = "if" OpenParen Expression CloseParen OpenBrace Statement* CloseBrace ElseBlock? + ElseBlock = "else" OpenBrace Statement* CloseBrace + + WhileStatement = "while" OpenParen Expression CloseParen OpenBrace Statement* CloseBrace + + do = "do" whitespace+ + DoStatement = do SubroutineCall Semi + + return = "return" + returnWithSpace = "return" whitespace+ + ReturnStatement = EmptyReturn | ReturnValue + EmptyReturn = return Semi + ReturnValue = returnWithSpace Expression Semi + + op = "+" | "-" | "*" | "/" | "&" | "|" | "<" | ">" | "=" + ExpressionPart = op Term + Expression = Term ExpressionPart* + + integerConstant = digit+ + stringConstant = doubleQuote (~doubleQuote ~newline any)* doubleQuote + keywordConstant = "true" | "false" | "null" | "this" + + GroupedExpression = OpenParen Expression CloseParen + + unaryOp = "-" | "~" + UnaryExpression = unaryOp Term + + Term = integerConstant | stringConstant | keywordConstant | SubroutineCall | ArrayAccess | jackIdentifier | GroupedExpression | UnaryExpression + + compoundIdentifier = jackIdentifier dot jackIdentifier + SubroutineName = compoundIdentifier | jackIdentifier + SubroutineCall = SubroutineName OpenParen ExpressionList CloseParen + + ExpressionList = Expressions? + Expressions = Expression TrailingExpression* + TrailingExpression = Comma Expression + + jackIdentifier = letter (alnum | underscore)* +} \ No newline at end of file diff --git a/web-ide-main/simulator/src/languages/grammars/jack.ohm.js b/web-ide-main/simulator/src/languages/grammars/jack.ohm.js new file mode 100644 index 0000000..c1431ce --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/jack.ohm.js @@ -0,0 +1,80 @@ +const jack = `Jack <: Base { + Root := Class + + whitespace = (lineComment | comment | space) + + class = "class" whitespace+ + Class = class jackIdentifier OpenBrace ClassVarDec* SubroutineDec* CloseBrace + + type = ("int" | "char" | "boolean" | jackIdentifier) whitespace+ + + classVarType = ("static" | "field") whitespace+ + ClassVarDec = classVarType type jackIdentifier TrailingIdentifier* Semi + TrailingIdentifier = Comma jackIdentifier + + void = "void" whitespace+ + returnType = (type | void) + subroutineType = ("constructor" | "function" | "method") whitespace+ + SubroutineDec = subroutineType returnType jackIdentifier OpenParen ParameterList CloseParen SubroutineBody + + + Parameter = type jackIdentifier + Parameters = Parameter TrailingParameter* + TrailingParameter = Comma Parameter + ParameterList = Parameters? + + SubroutineBody = OpenBrace VarDec* Statement* CloseBrace + + var = "var" whitespace+ + VarDec = var type jackIdentifier TrailingIdentifier* Semi + + Statement = LetStatement | IfStatement | WhileStatement | DoStatement | ReturnStatement + + arrayAccessStart = jackIdentifier openSquare + ArrayAccess = arrayAccessStart Expression CloseSquare + + let = "let" whitespace+ + LetTarget = ArrayAccess | jackIdentifier + LetStatement = let LetTarget Equal Expression Semi + + IfStatement = "if" OpenParen Expression CloseParen OpenBrace Statement* CloseBrace ElseBlock? + ElseBlock = "else" OpenBrace Statement* CloseBrace + + WhileStatement = "while" OpenParen Expression CloseParen OpenBrace Statement* CloseBrace + + do = "do" whitespace+ + DoStatement = do SubroutineCall Semi + + return = "return" + returnWithSpace = "return" whitespace+ + ReturnStatement = EmptyReturn | ReturnValue + EmptyReturn = return Semi + ReturnValue = returnWithSpace Expression Semi + + op = "+" | "-" | "*" | "/" | "&" | "|" | "<" | ">" | "=" + ExpressionPart = op Term + Expression = Term ExpressionPart* + + integerConstant = digit+ + stringConstant = doubleQuote (~doubleQuote ~newline any)* doubleQuote + keywordConstant = "true" | "false" | "null" | "this" + + GroupedExpression = OpenParen Expression CloseParen + + unaryOp = "-" | "~" + UnaryExpression = unaryOp Term + + Term = integerConstant | stringConstant | keywordConstant | SubroutineCall | ArrayAccess | jackIdentifier | GroupedExpression | UnaryExpression + + compoundIdentifier = jackIdentifier dot jackIdentifier + SubroutineName = compoundIdentifier | jackIdentifier + SubroutineCall = SubroutineName OpenParen ExpressionList CloseParen + + ExpressionList = Expressions? + Expressions = Expression TrailingExpression* + TrailingExpression = Comma Expression + + jackIdentifier = letter (alnum | underscore)* +}`; + +export default jack; diff --git a/web-ide-main/simulator/src/languages/grammars/prep.sh b/web-ide-main/simulator/src/languages/grammars/prep.sh new file mode 100644 index 0000000..da88ae2 --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/prep.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" + +for f in *.ohm ; do + echo "const ${f%.ohm} = \`" >| "${f}.js" + cat "$f" | sed 's!\\!\\\\!g' >> "${f}.js" + echo "\`;" >> "${f}.js" + echo "export default ${f%.ohm};" >> "${f}.js" +done \ No newline at end of file diff --git a/web-ide-main/simulator/src/languages/grammars/tst.ohm b/web-ide-main/simulator/src/languages/grammars/tst.ohm new file mode 100644 index 0000000..cd0b13e --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/tst.ohm @@ -0,0 +1,59 @@ +Tst <: Base { + Root := Tst + Tst = (TstStatement | TstRepeat | TstWhile)+ + + TstRepeat = Repeat Number? OpenBrace TstCommand+ CloseBrace + TstWhile = While Condition OpenBrace TstCommand+ CloseBrace + TstStatement = TstCommand + + TstCommand = TstOperation Separator + Separator = (Semi | Bang | Comma) + + TstOperation = + | TstFileOperation + | TstOutputListOperation + | TstEvalOperation + | TstSetOperation + | TstOutputOperation + | TstEchoOperation + | TstClearEchoOperation + | TstLoadROMOperation + | TstResetRAMOperation + + TstLoadROMOperation = ROM32K Load FileName + TstFileOperation = FileOperation FileName? + TstOutputListOperation = "output-list" OutputFormat+ + OutputFormat = Name Index? FormatSpec? + FormatSpec = percent FormatStyle wholeDec dot wholeDec dot wholeDec + TstSetOperation = Set Name Index? Number + Index = OpenSquare wholeDec? CloseSquare + Condition = Value CompareOp Value + TstEvalOperation = Eval | TickTock | Tick | Tock | VmStep + TstOutputOperation = Output + TstEchoOperation = Echo String + TstClearEchoOperation = ClearEcho + TstResetRAMOperation = ResetRAM + + filename = (alnum|underscore|dot|dollar|minus)+ + FileName = filename + FileOperation = "load" | "output-file" | "compare-to" + + Set = "set" + Eval = "eval" + Tick = "tick" + Tock = "tock" + TickTock = "ticktock" + VmStep = "vmstep" + Echo = "echo" + Repeat = "repeat" + ClearEcho = "clear-echo" + Output = "output" + OutputList = "output-list" + FormatStyle = "B"|"D"|"S"|"X" + ROM32K = "ROM32K" + Load = "load" + While = "while" + ResetRAM = "resetRam" + + CompareOp = "<>" | "<=" | ">=" | "=" | "<" | ">" +} \ No newline at end of file diff --git a/web-ide-main/simulator/src/languages/grammars/tst.ohm.js b/web-ide-main/simulator/src/languages/grammars/tst.ohm.js new file mode 100644 index 0000000..4d13ae3 --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/tst.ohm.js @@ -0,0 +1,61 @@ +const tst = ` +Tst <: Base { + Root := Tst + Tst = (TstStatement | TstRepeat | TstWhile)+ + + TstRepeat = Repeat Number? OpenBrace TstCommand+ CloseBrace + TstWhile = While Condition OpenBrace TstCommand+ CloseBrace + TstStatement = TstCommand + + TstCommand = TstOperation Separator + Separator = (Semi | Bang | Comma) + + TstOperation = + | TstFileOperation + | TstOutputListOperation + | TstEvalOperation + | TstSetOperation + | TstOutputOperation + | TstEchoOperation + | TstClearEchoOperation + | TstLoadROMOperation + | TstResetRAMOperation + + TstLoadROMOperation = ROM32K Load FileName + TstFileOperation = FileOperation FileName? + TstOutputListOperation = "output-list" OutputFormat+ + OutputFormat = Name Index? FormatSpec? + FormatSpec = percent FormatStyle wholeDec dot wholeDec dot wholeDec + TstSetOperation = Set Name Index? Number + Index = OpenSquare wholeDec? CloseSquare + Condition = Value CompareOp Value + TstEvalOperation = Eval | TickTock | Tick | Tock | VmStep + TstOutputOperation = Output + TstEchoOperation = Echo String + TstClearEchoOperation = ClearEcho + TstResetRAMOperation = ResetRAM + + filename = (alnum|underscore|dot|dollar|minus)+ + FileName = filename + FileOperation = "load" | "output-file" | "compare-to" + + Set = "set" + Eval = "eval" + Tick = "tick" + Tock = "tock" + TickTock = "ticktock" + VmStep = "vmstep" + Echo = "echo" + Repeat = "repeat" + ClearEcho = "clear-echo" + Output = "output" + OutputList = "output-list" + FormatStyle = "B"|"D"|"S"|"X" + ROM32K = "ROM32K" + Load = "load" + While = "while" + ResetRAM = "resetRam" + + CompareOp = "<>" | "<=" | ">=" | "=" | "<" | ">" +}`; +export default tst; diff --git a/web-ide-main/simulator/src/languages/grammars/vm.js b/web-ide-main/simulator/src/languages/grammars/vm.js new file mode 100644 index 0000000..e69de29 diff --git a/web-ide-main/simulator/src/languages/grammars/vm.ohm b/web-ide-main/simulator/src/languages/grammars/vm.ohm new file mode 100644 index 0000000..442d50c --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/vm.ohm @@ -0,0 +1,56 @@ +Vm <: Base { + Root := Vm + + Vm = newline* VmInstructionLine* VmInstruction? + + space := comment | " " | "\t" + whitespace = lineComment | comment | space + + VmInstructionLine = VmInstruction newline+ + VmInstruction = + | StackInstruction + | OpInstruction + | FunctionInstruction + | CallInstruction + | ReturnInstruction + | GotoInstruction + | LabelInstruction + + StackInstruction = (push | pop) MemorySegment Number + OpInstruction = Add | Sub | Neg | Lt | Gt | Eq | And | Or | Not + FunctionInstruction = function Name Number + CallInstruction = call Name Number + ReturnInstruction = return + LabelInstruction = label Name + GotoInstruction = (goto | ifGoto) Name + + MemorySegment = argument | local | static | constant | this | that | pointer | temp + + push = "push" whitespace+ + pop = "pop" whitespace+ + function = "function" whitespace+ + call = "call" whitespace+ + return = "return" + goto = "goto" whitespace+ + ifGoto = "if-goto" whitespace+ + label = "label" whitespace+ + + argument = "argument" whitespace+ + local = "local" whitespace+ + static = "static" whitespace+ + constant = "constant" whitespace+ + this = "this" whitespace+ + that = "that" whitespace+ + pointer = "pointer" whitespace+ + temp = "temp" whitespace+ + + Add = "add" + Sub = "sub" + Neg = "neg" + Eq = "eq" + Lt = "lt" + Gt = "gt" + And = "and" + Or = "or" + Not = "not" +} \ No newline at end of file diff --git a/web-ide-main/simulator/src/languages/grammars/vm.ohm.js b/web-ide-main/simulator/src/languages/grammars/vm.ohm.js new file mode 100644 index 0000000..6c08bdc --- /dev/null +++ b/web-ide-main/simulator/src/languages/grammars/vm.ohm.js @@ -0,0 +1,57 @@ +const vm = `Vm <: Base { + Root := Vm + + Vm = newline* VmInstructionLine* VmInstruction? + + space := comment | " " | "\t" + whitespace = lineComment | comment | space + + VmInstructionLine = VmInstruction newline+ + VmInstruction = + | StackInstruction + | OpInstruction + | FunctionInstruction + | CallInstruction + | ReturnInstruction + | GotoInstruction + | LabelInstruction + + StackInstruction = (push | pop) MemorySegment Number + OpInstruction = Add | Sub | Neg | Lt | Gt | Eq | And | Or | Not + FunctionInstruction = function Name Number + CallInstruction = call Name Number + ReturnInstruction = return + LabelInstruction = label Name + GotoInstruction = (goto | ifGoto) Name + + MemorySegment = argument | local | static | constant | this | that | pointer | temp + + push = "push" whitespace+ + pop = "pop" whitespace+ + function = "function" whitespace+ + call = "call" whitespace+ + return = "return" + goto = "goto" whitespace+ + ifGoto = "if-goto" whitespace+ + label = "label" whitespace+ + + argument = "argument" whitespace+ + local = "local" whitespace+ + static = "static" whitespace+ + constant = "constant" whitespace+ + this = "this" whitespace+ + that = "that" whitespace+ + pointer = "pointer" whitespace+ + temp = "temp" whitespace+ + + Add = "add" + Sub = "sub" + Neg = "neg" + Eq = "eq" + Lt = "lt" + Gt = "gt" + And = "and" + Or = "or" + Not = "not" +}`; +export default vm; diff --git a/web-ide-main/simulator/src/languages/hdl.test.ts b/web-ide-main/simulator/src/languages/hdl.test.ts new file mode 100644 index 0000000..7360639 --- /dev/null +++ b/web-ide-main/simulator/src/languages/hdl.test.ts @@ -0,0 +1,352 @@ +import { + grammar, + HdlParse, + hdlSemantics, + Part, + PinDeclaration, +} from "./hdl.js"; + +const AND_BUILTIN = `CHIP And { + IN a, b; + OUT out; + BUILTIN; +}`; + +const NOT_PARTS = `CHIP Not { + IN in; + OUT out; + PARTS: + Nand(a=in, b=in, out=out); +}`; + +const NOT_NO_PARTS = `CHIP Not { + IN in; + OUT out; + PARTS: +}`; + +const AND_16_BUILTIN = `CHIP And16 { + IN a[16], b[16]; + OUT out[16]; + BUILTIN; +}`; + +const CLOCKED = `CHIP Foo { + IN in; + + PARTS: + + CLOCKED in; +}`; + +const ERRORS = [ + ["Not { BUILTIN }", 'Line 1, col 1: expected "CHIP"'], + ["CHIP { BUILTIN }", "Line 1, col 6: expected a letter"], // A chip name is expected + ["CHIP Not BUILTIN }", 'Line 1, col 10: expected "{"'], + ["CHIP Not { BUILTIN }", 'Line 1, col 20: expected ";"'], + ["CHIP Not { BONKERS; }", 'Line 1, col 12: expected "PARTS:" or "BUILTIN"'], + ["CHIP Not { ", 'Line 1, col 12: expected "PARTS:" or "BUILTIN"'], + [ + "CHIP Not { PARTS: (); }", + 'Line 1, col 19: expected "}", "CLOCKED", or a letter', // A chip name is expected + ], + ["CHIP Not { PARTS: Nand; }", 'Line 1, col 23: expected "("'], + ["CHIP Not { PARTS: Nand() }", "Line 1, col 24: expected a letter"], // A pin name is expected + ["CHIP Not { PARTS: Nand(=a) }", "Line 1, col 24: expected a letter"], // A pin name is expected + [ + "CHIP Not { PARTS: Nand(a=) }", + 'Line 1, col 26: expected "false", "true", or a letter', + ], // A pin name is expected + ["CHIP Not { PARTS: Nand(a) }", 'Line 1, col 25: expected "="'], + ["CHIP Not { PARTS: Nand(a=a }", 'Line 1, col 28: expected ")", ",", or "["'], +]; + +describe("HDL w/ Ohm", () => { + describe("parts", () => { + it("parses part wires", () => { + const wire = grammar.match("a[2..4]=b[10..12]", "Wire"); + expect(wire).toHaveSucceeded(); + expect(hdlSemantics(wire).Wire).toEqual({ + lhs: { + pin: "a", + start: 2, + end: 4, + span: { start: 0, end: 7, line: 1 }, + }, + rhs: { + pin: "b", + start: 10, + end: 12, + span: { start: 8, end: 17, line: 1 }, + }, + }); + }); + + it("parses parts", () => { + const wide = grammar.match("Nand(a=a, b=b, out=out);", "Part"); + expect(wide).toHaveSucceeded(); + expect(hdlSemantics(wide).Part).toEqual({ + name: "Nand", + span: { start: 0, end: 24, line: 1 }, + wires: [ + { + lhs: { + pin: "a", + start: undefined, + end: undefined, + span: { start: 5, end: 6, line: 1 }, + }, + rhs: { + pin: "a", + start: undefined, + end: undefined, + span: { start: 7, end: 8, line: 1 }, + }, + }, + { + lhs: { + pin: "b", + start: undefined, + end: undefined, + span: { start: 10, end: 11, line: 1 }, + }, + rhs: { + pin: "b", + start: undefined, + end: undefined, + span: { start: 12, end: 13, line: 1 }, + }, + }, + { + lhs: { + pin: "out", + start: undefined, + end: undefined, + span: { start: 15, end: 18, line: 1 }, + }, + rhs: { + pin: "out", + start: undefined, + end: undefined, + span: { start: 19, end: 22, line: 1 }, + }, + }, + ], + }); + }); + + it("parses trailing commas", () => { + const parse1 = grammar.match(`a=a, b=b,`, "Wires"); + expect(parse1).toHaveSucceeded(); + const parse2 = grammar.match(`Foo(a=a, b=b,);`, "Part"); + expect(parse2).toHaveSucceeded(); + }); + + it("parses complex parts", () => { + const not8 = grammar.match( + `Not(in[0..1] = true, + in[3..5] = six, + in[7] = true, + out[3..7] = out1, + address=address[0..13], + out[2..3]=address[5..6]);`, + "Part", + ); + expect(not8).toHaveSucceeded(); + expect(hdlSemantics(not8).Part).toEqual({ + name: "Not", + span: { start: 0, end: 158, line: 1 }, + wires: [ + { + lhs: { + pin: "in", + start: 0, + end: 1, + span: { start: 4, end: 12, line: 1 }, + }, + rhs: { + pin: "true", + start: undefined, + end: undefined, + span: { start: 15, end: 19, line: 1 }, + }, + }, + { + lhs: { + pin: "in", + start: 3, + end: 5, + span: { start: 29, end: 37, line: 2 }, + }, + rhs: { + pin: "six", + start: undefined, + end: undefined, + span: { start: 40, end: 43, line: 2 }, + }, + }, + { + lhs: { + pin: "in", + start: 7, + end: 7, + span: { start: 53, end: 58, line: 3 }, + }, + rhs: { + pin: "true", + start: undefined, + end: undefined, + span: { start: 61, end: 65, line: 3 }, + }, + }, + { + lhs: { + pin: "out", + start: 3, + end: 7, + span: { start: 75, end: 84, line: 4 }, + }, + rhs: { + pin: "out1", + start: undefined, + end: undefined, + span: { start: 87, end: 91, line: 4 }, + }, + }, + { + lhs: { + pin: "address", + start: undefined, + end: undefined, + span: { start: 101, end: 108, line: 5 }, + }, + rhs: { + pin: "address", + start: 0, + end: 13, + span: { start: 109, end: 123, line: 5 }, + }, + }, + { + lhs: { + pin: "out", + start: 2, + end: 3, + span: { start: 133, end: 142, line: 6 }, + }, + rhs: { + pin: "address", + start: 5, + end: 6, + span: { start: 143, end: 156, line: 6 }, + }, + }, + ], + }); + }); + }); + + describe("pins", () => { + it("parses a simple decl", () => { + const decl = grammar.match("a", "PinDecl"); + expect(decl).toHaveSucceeded(); + expect(hdlSemantics(decl).PinDecl).toEqual({ pin: "a", width: 1 }); + }); + + it("parses a wide decl", () => { + const decl = grammar.match("a[3]", "PinDecl"); + expect(decl).toHaveSucceeded(); + expect(hdlSemantics(decl).PinDecl).toEqual({ pin: "a", width: 3 }); + }); + }); + + describe("entire chips", () => { + it("parses basic chip", () => { + const match = grammar.match(AND_BUILTIN); + expect(match).toHaveSucceeded(); + expect(hdlSemantics(match).Chip).toEqual({ + name: { value: "And", span: { start: 5, end: 8, line: 1 } }, + ins: [ + { pin: "a", width: 1 }, + { pin: "b", width: 1 }, + ], + outs: [{ pin: "out", width: 1 }], + parts: "BUILTIN", + }); + }); + + it("parses chip with parts", () => { + const match = grammar.match(NOT_PARTS); + expect(match).toHaveSucceeded(); + expect(hdlSemantics(match).Chip).toEqual({ + name: { value: "Not", span: { start: 5, end: 8, line: 1 } }, + ins: [{ pin: "in", width: 1 }], + outs: [{ pin: "out", width: 1 }], + parts: [ + { + name: "Nand", + span: { start: 50, end: 76, line: 5 }, + wires: [ + { + lhs: { pin: "a", span: { start: 55, end: 56, line: 5 } }, + rhs: { pin: "in", span: { start: 57, end: 59, line: 5 } }, + }, + { + lhs: { pin: "b", span: { start: 61, end: 62, line: 5 } }, + rhs: { pin: "in", span: { start: 63, end: 65, line: 5 } }, + }, + { + lhs: { pin: "out", span: { start: 67, end: 70, line: 5 } }, + rhs: { pin: "out", span: { start: 71, end: 74, line: 5 } }, + }, + ], + }, + ], + }); + }); + + it("parses chip without parts", () => { + const match = grammar.match(NOT_NO_PARTS); + expect(match).toHaveSucceeded(); + + expect(hdlSemantics(match).Chip).toEqual({ + name: { value: "Not", span: { start: 5, end: 8, line: 1 } }, + ins: [{ pin: "in", width: 1 }], + outs: [{ pin: "out", width: 1 }], + parts: [], + }); + }); + + it("parses chip using builtins", () => { + const match = grammar.match(AND_16_BUILTIN); + expect(match).toHaveSucceeded(); + expect(hdlSemantics(match).Chip).toEqual({ + name: { value: "And16", span: { start: 5, end: 10, line: 1 } }, + ins: [ + { pin: "a", width: 16 }, + { pin: "b", width: 16 }, + ], + outs: [{ pin: "out", width: 16 }], + parts: "BUILTIN", + }); + }); + + it("parses a chip with clocked pins", () => { + const match = grammar.match(CLOCKED); + expect(match).toHaveSucceeded(); + expect(hdlSemantics(match).Chip).toEqual({ + name: { value: "Foo", span: { start: 5, end: 8, line: 1 } }, + ins: [{ pin: "in", width: 1 }], + outs: [], + parts: [], + clocked: ["in"], + }); + }); + }); + + describe("errors", () => { + it.each(ERRORS)("fails with reasonable errors", (source, message) => { + expect(grammar.match(source)).toHaveFailed(message); + }); + }); +}); diff --git a/web-ide-main/simulator/src/languages/hdl.ts b/web-ide-main/simulator/src/languages/hdl.ts new file mode 100644 index 0000000..8d65330 --- /dev/null +++ b/web-ide-main/simulator/src/languages/hdl.ts @@ -0,0 +1,154 @@ +/** Reads and parses HDL chip descriptions. */ +import { grammar as ohmGrammar } from "ohm-js"; +import { baseSemantics, grammars, makeParser, Span, span } from "./base.js"; + +export interface PinIndex { + start?: number | undefined; + end?: number | undefined; +} + +export interface PinParts extends PinIndex { + pin: string; + span: Span; +} + +export interface PinDeclaration { + pin: string | string; + width: number; +} + +export interface Wire { + lhs: PinParts; + rhs: PinParts; +} + +export interface Part { + name: string; + wires: Wire[]; + span: Span; +} + +export interface HdlParse { + name: { value: string; span?: Span }; + ins: PinDeclaration[]; + outs: PinDeclaration[]; + clocked: string[]; + parts: "BUILTIN" | Part[]; +} + +import hdlGrammar from "./grammars/hdl.ohm.js"; +export const grammar = ohmGrammar(hdlGrammar, grammars); + +export const hdlSemantics = grammar.extendSemantics(baseSemantics); + +hdlSemantics.addAttribute("SubBus", { + SubBus(_a, startNode, endNode, _b) { + const start = startNode.value; + const end = endNode.child(0)?.child(1)?.value ?? start; + return { start, end }; + }, +}); + +hdlSemantics.addAttribute("WireSide", { + WireSide({ name }, index) { + const { start, end } = (index.child(0)?.SubBus as PinIndex) ?? { + start: undefined, + end: undefined, + }; + return { pin: name, start, end, span: span(this.source) }; + }, +}); + +hdlSemantics.addAttribute("Wire", { + Wire(left, _, right) { + const rhs: PinParts = right.isTerminal() + ? { pin: right.sourceString } + : right.WireSide; + return { lhs: left.WireSide as PinParts, rhs }; + }, +}); + +hdlSemantics.addAttribute("Wires", { + Wires(list) { + return list.asIteration().children.map((node) => node.Wire as Wire); + }, +}); + +hdlSemantics.addAttribute("Part", { + Part({ name }, _a, { Wires }, _b, _c) { + return { + name: name as string, + wires: Wires as Wire[], + span: span(this.source), + }; + }, +}); + +hdlSemantics.addAttribute("Parts", { + Parts(_, parts) { + return parts.children.map((c) => c.Part); + }, + BuiltinPart(_a, _b) { + return "BUILTIN"; + }, +}); + +hdlSemantics.addAttribute<"BUILTIN" | Part[]>("PartList", { + PartList(list) { + return list.Parts; + }, +}); + +hdlSemantics.addAttribute("Clocked", { + ClockedList(_a, clocked, _b) { + return ( + clocked + .asIteration() + .children.map( + ({ sourceString }: { sourceString: string }) => sourceString, + ) ?? [] + ); + }, +}); + +hdlSemantics.addAttribute("PinDecl", { + PinDecl({ name }, width) { + return { + pin: name, + width: width.child(0)?.child(1)?.value ?? 1, + }; + }, +}); + +hdlSemantics.addAttribute("PinList", { + PinList(list) { + return list + .asIteration() + .children.map((node) => node.PinDecl as PinDeclaration); + }, +}); + +hdlSemantics.addAttribute("Chip", { + Chip(_a, name, _b, body, _c) { + return { + name: { value: name.sourceString, span: span(name.source) }, + ins: body.child(0).child(0)?.child(1)?.PinList ?? [], + outs: body.child(1).child(0)?.child(1)?.PinList ?? [], + parts: body.child(2).PartList ?? [], + clocked: body.child(3).child(0)?.Clocked, + }; + }, +}); + +hdlSemantics.addAttribute("Root", { + Root(root) { + return root.child(0)?.Chip; + }, +}); + +export const HDL = { + parser: grammar, + grammar: hdlGrammar, + semantics: hdlSemantics, + parse: makeParser(grammar, hdlSemantics, (n) => n.Chip), +}; diff --git a/web-ide-main/simulator/src/languages/jack.test.ts b/web-ide-main/simulator/src/languages/jack.test.ts new file mode 100644 index 0000000..74cd320 --- /dev/null +++ b/web-ide-main/simulator/src/languages/jack.test.ts @@ -0,0 +1,13 @@ +import { unwrap } from "@davidsouther/jiffies/lib/esm/result"; +import { Programs } from "@nand2tetris/projects/samples/project_11/index.js"; +import { JACK } from "./jack"; + +describe("jack language", () => { + describe.each(Object.keys(Programs))("%s", (program) => { + it.each(Object.keys(Programs[program]))("%s", (filename) => { + const parsed = JACK.parse(Programs[program][filename].jack); + expect(parsed).toBeOk(); + expect(unwrap(parsed)).toEqual(Programs[program][filename].parsed); + }); + }); +}); diff --git a/web-ide-main/simulator/src/languages/jack.ts b/web-ide-main/simulator/src/languages/jack.ts new file mode 100644 index 0000000..bb4c31e --- /dev/null +++ b/web-ide-main/simulator/src/languages/jack.ts @@ -0,0 +1,438 @@ +import { type Node, grammar as ohmGrammar } from "ohm-js"; +import { baseSemantics, grammars, makeParser, Span, span } from "./base.js"; +import jackGrammar from "./grammars/jack.ohm.js"; + +const primitives = new Set(["int", "boolean", "char"] as const); +export type Primitive = typeof primitives extends Set ? S : never; + +export function isPrimitive(value: string): value is Primitive { + return primitives.has(value as Primitive); +} + +export type Type = Primitive | string; + +export interface Class { + name: { value: string; span: Span }; + varDecs: ClassVarDec[]; + subroutines: Subroutine[]; +} + +export type ClassVarType = "static" | "field"; + +export interface ClassVarDec { + varType: ClassVarType; + type: { value: Type; span: Span }; + names: string[]; +} + +export interface Parameter { + type: { value: Type; span: Span }; + name: string; +} + +export type ReturnType = Type | "void"; +export type SubroutineType = "constructor" | "function" | "method"; + +export interface Subroutine { + type: SubroutineType; + name: { value: string; span: Span }; + returnType: { value: ReturnType; span: Span }; + parameters: Parameter[]; + body: SubroutineBody; +} + +export interface SubroutineBody { + varDecs: VarDec[]; + statements: Statement[]; +} + +export interface VarDec { + type: { value: Type; span: Span }; + names: string[]; +} + +export type Statement = + | LetStatement + | IfStatement + | WhileStatement + | DoStatement + | ReturnStatement; + +export interface LetStatement { + statementType: "letStatement"; + name: { value: string; span: Span }; + arrayIndex?: Expression; + value: Expression; + span: Span; +} + +export interface IfStatement { + statementType: "ifStatement"; + condition: Expression; + body: Statement[]; + else: Statement[]; +} + +export interface WhileStatement { + statementType: "whileStatement"; + condition: Expression; + body: Statement[]; +} + +export interface DoStatement { + statementType: "doStatement"; + call: SubroutineCall; +} + +export interface ReturnStatement { + statementType: "returnStatement"; + value?: Expression; + span: Span; +} + +export type Op = "+" | "-" | "*" | "/" | "&" | "|" | "<" | ">" | "="; +export type KeywordConstant = "true" | "false" | "null" | "this"; +export type UnaryOp = "-" | "~"; + +export type Term = + | NumericLiteral + | StringLiteral + | Variable + | KeywordLiteral + | SubroutineCall + | ArrayAccess + | GroupedExpression + | UnaryExpression; + +export interface NumericLiteral { + termType: "numericLiteral"; + value: number; +} + +export interface StringLiteral { + termType: "stringLiteral"; + value: string; +} + +export interface KeywordLiteral { + termType: "keywordLiteral"; + value: KeywordConstant; +} + +export interface Variable { + termType: "variable"; + name: string; + span: Span; +} + +export interface GroupedExpression { + termType: "groupedExpression"; + expression: Expression; +} + +export interface UnaryExpression { + termType: "unaryExpression"; + op: UnaryOp; + term: Term; +} + +export interface ArrayAccess { + termType: "arrayAccess"; + name: { value: string; span: Span }; + index: Expression; + span: Span; +} + +export interface SubroutineCall { + termType: "subroutineCall"; + name: { value: string; span: Span }; + span: Span; + parameters: Expression[]; +} + +export interface ExpressionPart { + op: Op; + term: Term; +} + +export interface Expression { + term: Term; + rest: ExpressionPart[]; +} + +export const grammar = ohmGrammar(jackGrammar, grammars); +export const jackSemantics = grammar.extendSemantics(baseSemantics); + +function statements(node: Node) { + return node.children.map((n) => n.statement); +} + +jackSemantics.addAttribute("Root", { + Root(_) { + return this.class; + }, +}); + +jackSemantics.addAttribute("class", { + Class(_a, name, _b, varDecs, subroutines, _c) { + return { + name: { value: name.sourceString, span: span(name.source) }, + varDecs: varDecs.children.map((n) => n.classVarDec), + subroutines: subroutines.children.map((n) => n.subroutineDec), + }; + }, +}); + +jackSemantics.addAttribute("classVarDec", { + ClassVarDec(varType, type, name, rest, _) { + return { + varType: varType.sourceString.trim() as ClassVarType, + type: { + value: type.sourceString.trim() as Type, + span: span(type.source), + }, + names: [ + name.sourceString, + ...rest.children.map((n) => n.child(1).sourceString), + ], + }; + }, +}); + +jackSemantics.addAttribute("subroutineDec", { + SubroutineDec(type, returnType, name, _a, parameters, _b, body) { + return { + type: type.sourceString.trim() as SubroutineType, + returnType: { + value: returnType.sourceString.trim() as ReturnType, + span: span(returnType.source), + }, + name: { value: name.sourceString, span: span(name.source) }, + parameters: parameters.parameterList, + body: body.subroutineBody, + }; + }, +}); + +jackSemantics.addAttribute("parameter", { + Parameter(type, name) { + return { + type: { + value: type.sourceString.trim() as Type, + span: span(type.source), + }, + name: name.sourceString, + }; + }, +}); + +jackSemantics.addAttribute("parameterList", { + ParameterList(node) { + return node.child(0)?.parameters ?? []; + }, +}); + +jackSemantics.addAttribute("parameters", { + Parameters(first, rest) { + return [first.parameter, ...rest.children.map((n) => n.child(1).parameter)]; + }, +}); + +jackSemantics.addAttribute("subroutineBody", { + SubroutineBody(_a, varDecs, statementList, _b) { + return { + varDecs: varDecs.children.map((n) => n.varDec), + statements: statements(statementList), + }; + }, +}); + +jackSemantics.addAttribute("varDec", { + VarDec(_a, type, name, rest, _b) { + return { + type: { + value: type.sourceString.trim() as Type, + span: span(type.source), + }, + names: [ + name.sourceString, + ...rest.children.map((n) => n.child(1).sourceString), + ], + }; + }, +}); + +// jackSemantics.addAttribute("letTarget", { +// LetTarget() { +// jackI +// } +// }) + +jackSemantics.addAttribute("statement", { + LetStatement(_a, target, _b, value, _c) { + if (target.term.termType == "variable") { + return { + statementType: "letStatement", + name: { + value: (target.term as Variable).name, + span: (target.term as Variable).span, + }, + value: value.expression, + span: span(this.source), + }; + } else { + return { + statementType: "letStatement", + name: (target.term as ArrayAccess).name, + arrayIndex: (target.term as ArrayAccess).index, + value: value.expression, + span: span(this.source), + }; + } + }, + + IfStatement(_a, _b, condition, _c, _d, body, _e, elseBlock) { + return { + statementType: "ifStatement", + condition: condition.expression, + body: statements(body), + else: elseBlock.child(0)?.else ?? [], + }; + }, + + WhileStatement(_a, _b, condition, _c, _d, body, _e) { + return { + statementType: "whileStatement", + condition: condition.expression, + body: statements(body), + }; + }, + + DoStatement(_a, call, _b) { + return { statementType: "doStatement", call: call.term as SubroutineCall }; + }, + + EmptyReturn(_a, _b) { + return { + statementType: "returnStatement", + span: span(this.source), + }; + }, + + ReturnValue(_a, value, _b) { + return { + statementType: "returnStatement", + value: value.expression, + span: span(this.source), + }; + }, +}); + +jackSemantics.addAttribute("else", { + ElseBlock(_a, _b, body, _c) { + return statements(body); + }, +}); + +jackSemantics.addAttribute("term", { + integerConstant(node) { + return { + termType: "numericLiteral", + value: Number(node.sourceString), + }; + }, + + stringConstant(_a, _b, _c) { + return { termType: "stringLiteral", value: this.sourceString.slice(1, -1) }; + }, + + keywordConstant(_) { + return { + termType: "keywordLiteral", + value: this.sourceString as KeywordConstant, + }; + }, + + SubroutineCall(name, _a, expressions, _b) { + return { + termType: "subroutineCall", + name: { value: name.sourceString, span: span(name.source) }, + parameters: expressions.expressionList, + span: span(this.source), + }; + }, + + ArrayAccess(start, index, _) { + const name = start.child(0); + return { + termType: "arrayAccess", + name: { value: name.sourceString, span: span(name.source) }, + index: index.expression, + span: span(this.source), + }; + }, + + jackIdentifier(first, rest) { + return { + termType: "variable", + name: `${first.sourceString}${rest.sourceString}`, + span: span(this.source), + }; + }, + + GroupedExpression(_a, expression, _b) { + return { + termType: "groupedExpression", + expression: expression.expression, + }; + }, + + UnaryExpression(op, term) { + return { + termType: "unaryExpression", + op: op.sourceString as UnaryOp, + term: term.term, + }; + }, +}); + +jackSemantics.addAttribute("expressionList", { + ExpressionList(node) { + return node.child(0)?.expressions ?? []; + }, +}); + +jackSemantics.addAttribute("expressions", { + Expressions(first, rest) { + return [ + first.expression, + ...rest.children.map((n) => n.child(1).expression), + ]; + }, +}); + +jackSemantics.addAttribute("expression", { + Expression(first, rest) { + return { + nodeType: "expression", + term: first.term, + rest: rest.children.map((n) => n.expressionPart), + }; + }, +}); + +jackSemantics.addAttribute("expressionPart", { + ExpressionPart(op, term) { + return { + op: op.sourceString as Op, + term: term.term, + }; + }, +}); + +export const JACK = { + parser: grammar, + grammar: jackGrammar, + semantics: jackSemantics, + parse: makeParser(grammar, jackSemantics, (n) => n.class), +}; diff --git a/web-ide-main/simulator/src/languages/tst.test.ts b/web-ide-main/simulator/src/languages/tst.test.ts new file mode 100644 index 0000000..2cd5c6c --- /dev/null +++ b/web-ide-main/simulator/src/languages/tst.test.ts @@ -0,0 +1,507 @@ +import { + FileSystem, + ObjectFileSystemAdapter, +} from "@davidsouther/jiffies/lib/esm/fs.js"; +import { resetFiles } from "@nand2tetris/projects/full.js"; +import { grammar, TST } from "./tst.js"; + +const NOT_TST = ` +output-list in%B3.1.3 out%B3.1.3; + +set in 0, eval, output; +set in 1, eval, output;`; + +const BIT_TST = ` +output-list time%S1.4.1 in%B2.1.2 load%B2.1.2 out%B2.1.2; +set in 0, set load 0, tick, output; tock, output; +set in 0, set load 1, eval, output; +`; + +const MEM_TST = ` +output-list time%S1.2.1 in%B2.1.2; +set in -32123, tick, output; +`; + +const MEM_REPEAT = ` +repeat 14 { + eval, output; +} +`; + +const INDEF_REPEAT = ` +repeat { + eval, output; +} +`; + +const COND_WHILE = `while out <> 89 { + eval; +}`; + +describe("tst language", () => { + it("parses an output format", () => { + const match = grammar.match("a%B3.1.3", "OutputFormat"); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).format).toStrictEqual({ + id: "a", + builtin: false, + address: -1, + format: { + style: "B", + width: 1, + lpad: 3, + rpad: 3, + }, + }); + }); + + it("parses an output list", () => { + const match = grammar.match( + "output-list a%B1.1.1 out%X2.3.4", + "TstOutputListOperation", + ); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).operation).toStrictEqual({ + op: "output-list", + spec: [ + { + id: "a", + builtin: false, + address: -1, + format: { style: "B", width: 1, lpad: 1, rpad: 1 }, + }, + { + id: "out", + + builtin: false, + address: -1, + format: { style: "X", width: 3, lpad: 2, rpad: 4 }, + }, + ], + }); + }); + + it("parses an output list with junk", () => { + const match = grammar.match( + "\n/// A list\noutput-list a%B1.1.1 /* the output */ out%X2.3.4", + "TstOutputListOperation", + ); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).operation).toStrictEqual({ + op: "output-list", + spec: [ + { + id: "a", + builtin: false, + address: -1, + format: { style: "B", width: 1, lpad: 1, rpad: 1 }, + }, + { + id: "out", + builtin: false, + address: -1, + format: { style: "X", width: 3, lpad: 2, rpad: 4 }, + }, + ], + }); + }); + + it("parses an output list with builtins", () => { + const match = grammar.match( + "output-list PC[]%D0.4.0 RAM16K[0]%D1.7.1", + "TstOutputListOperation", + ); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).operation).toStrictEqual({ + op: "output-list", + spec: [ + { + id: "PC", + builtin: true, + address: -1, + format: { style: "D", width: 4, lpad: 0, rpad: 0 }, + }, + { + id: "RAM16K", + builtin: true, + address: 0, + format: { style: "D", width: 7, lpad: 1, rpad: 1 }, + }, + ], + }); + }); + + it("parses file ops", () => { + const match = grammar.match( + "load A.hdl, output-file A.out, compare-to A.cmp, output-list a%B1.1.1;", + ); + expect(match).toHaveSucceeded(); + }); + + it("parses a single set", () => { + const match = grammar.match("set a 0", "TstSetOperation"); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).operation).toEqual({ + op: "set", + id: "a", + value: 0, + }); + }); + + it("parses simple multiline", () => { + const match = grammar.match("eval;\n\neval;\n\n"); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).tst).toEqual({ + lines: [ + { + op: { op: "eval" }, + separator: ";", + span: { start: 0, end: 5, line: 1 }, + }, + { + op: { op: "eval" }, + separator: ";", + span: { start: 7, end: 12, line: 3 }, + }, + ], + }); + }); + + it("parses a test file", () => { + const match = grammar.match(NOT_TST); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).tst).toEqual({ + lines: [ + { + op: { + op: "output-list", + spec: [ + { + id: "in", + builtin: false, + address: -1, + format: { style: "B", width: 1, lpad: 3, rpad: 3 }, + }, + { + id: "out", + builtin: false, + address: -1, + format: { style: "B", width: 1, lpad: 3, rpad: 3 }, + }, + ], + }, + separator: ";", + span: { line: 2, start: 1, end: 34 }, + }, + + { + op: { op: "set", id: "in", value: 0 }, + separator: ",", + span: { line: 4, start: 36, end: 45 }, + }, + { + op: { op: "eval" }, + separator: ",", + span: { line: 4, start: 46, end: 51 }, + }, + { + op: { op: "output" }, + separator: ";", + span: { line: 4, start: 52, end: 59 }, + }, + + { + op: { op: "set", id: "in", value: 1 }, + separator: ",", + span: { line: 5, start: 60, end: 69 }, + }, + { + op: { op: "eval" }, + separator: ",", + span: { line: 5, start: 70, end: 75 }, + }, + { + op: { op: "output" }, + separator: ";", + span: { line: 5, start: 76, end: 83 }, + }, + ], + }); + }); + + it("parses a clocked test file", () => { + const match = grammar.match(BIT_TST); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).tst).toEqual({ + lines: [ + { + op: { + op: "output-list", + spec: [ + { + id: "time", + builtin: false, + address: -1, + format: { style: "S", width: 4, lpad: 1, rpad: 1 }, + }, + { + id: "in", + builtin: false, + address: -1, + format: { style: "B", width: 1, lpad: 2, rpad: 2 }, + }, + { + id: "load", + builtin: false, + address: -1, + format: { style: "B", width: 1, lpad: 2, rpad: 2 }, + }, + { + id: "out", + builtin: false, + address: -1, + format: { style: "B", width: 1, lpad: 2, rpad: 2 }, + }, + ], + }, + separator: ";", + span: { line: 2, start: 1, end: 58 }, + }, + + { + op: { op: "set", id: "in", value: 0 }, + separator: ",", + span: { line: 3, start: 59, end: 68 }, + }, + { + op: { op: "set", id: "load", value: 0 }, + separator: ",", + span: { line: 3, start: 69, end: 80 }, + }, + { + op: { op: "tick" }, + separator: ",", + span: { line: 3, start: 81, end: 86 }, + }, + { + op: { op: "output" }, + separator: ";", + span: { line: 3, start: 87, end: 94 }, + }, + + { + op: { op: "tock" }, + separator: ",", + span: { line: 3, start: 95, end: 100 }, + }, + { + op: { op: "output" }, + separator: ";", + span: { line: 3, start: 101, end: 108 }, + }, + + { + op: { op: "set", id: "in", value: 0 }, + separator: ",", + span: { line: 4, start: 109, end: 118 }, + }, + { + op: { op: "set", id: "load", value: 1 }, + separator: ",", + span: { line: 4, start: 119, end: 130 }, + }, + { + op: { op: "eval" }, + separator: ",", + span: { line: 4, start: 131, end: 136 }, + }, + { + op: { op: "output" }, + separator: ";", + span: { line: 4, start: 137, end: 144 }, + }, + ], + }); + }); + + it("parses a test file with negative integers", () => { + const match = grammar.match(MEM_TST); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).tst).toEqual({ + lines: [ + // output-list time%S1.2.1 in%B2.1.2; + { + op: { + op: "output-list", + spec: [ + { + id: "time", + builtin: false, + address: -1, + format: { style: "S", width: 2, lpad: 1, rpad: 1 }, + }, + { + id: "in", + builtin: false, + address: -1, + format: { style: "B", width: 1, lpad: 2, rpad: 2 }, + }, + ], + }, + separator: ";", + span: { + start: 1, + end: 35, + line: 2, + }, + }, + // set in -32123, tick, output; + { + op: { op: "set", id: "in", value: 33413 /* unsigned */ }, + separator: ",", + span: { line: 3, start: 36, end: 50 }, + }, + { + op: { op: "tick" }, + separator: ",", + span: { line: 3, start: 51, end: 56 }, + }, + { + op: { op: "output" }, + separator: ";", + span: { line: 3, start: 57, end: 64 }, + }, + ], + }); + }); + + it("repeats blocks", () => { + const match = grammar.match(MEM_REPEAT); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).tst).toEqual({ + lines: [ + { + count: 14, + statements: [ + { + op: { op: "eval" }, + separator: ",", + span: { line: 3, start: 15, end: 20 }, + }, + { + op: { op: "output" }, + separator: ";", + span: { line: 3, start: 21, end: 28 }, + }, + ], + span: { + start: 1, + end: 30, + line: 2, + }, + }, + ], + }); + }); + + it("repeats indefinitely", () => { + const match = grammar.match(INDEF_REPEAT); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).tst).toEqual({ + lines: [ + { + count: -1, + span: { + start: 1, + end: 27, + line: 2, + }, + statements: [ + { + op: { op: "eval" }, + separator: ",", + span: { line: 3, start: 12, end: 17 }, + }, + { + op: { op: "output" }, + separator: ";", + span: { line: 3, start: 18, end: 25 }, + }, + ], + }, + ], + }); + }); + + it("loops with a condition", () => { + const match = grammar.match(COND_WHILE); + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).tst).toEqual({ + lines: [ + { + span: { + start: 0, + end: 27, + line: 1, + }, + condition: { + op: "<>", + left: "out", + right: 89, + }, + statements: [ + { + op: { op: "eval" }, + separator: ";", + span: { + start: 20, + end: 25, + line: 2, + }, + }, + ], + }, + ], + }); + }); + + it("loads ROMs", () => { + const match = grammar.match(`ROM32K load Max.hack;`); + + expect(match).toHaveSucceeded(); + expect(TST.semantics(match).tst).toEqual({ + lines: [ + { + span: { + start: 0, + end: 21, + line: 1, + }, + op: { op: "loadRom", file: "Max.hack" }, + separator: ";", + }, + ], + }); + }); +}); + +it("loads all project tst files", async () => { + const fs = new FileSystem(new ObjectFileSystemAdapter({})); + await resetFiles(fs); + async function check() { + for (const stat of await fs.scandir(".")) { + if (stat.isDirectory()) { + fs.pushd(stat.name); + await check(); + fs.popd(); + } else { + if (stat.name.endsWith("vm_tst")) { + const tst = await fs.readFile(stat.name); + const match = grammar.match(tst); + expect(match).toHaveSucceeded(); + } + } + } + } + await check(); +}); diff --git a/web-ide-main/simulator/src/languages/tst.ts b/web-ide-main/simulator/src/languages/tst.ts new file mode 100644 index 0000000..c8e4eb5 --- /dev/null +++ b/web-ide-main/simulator/src/languages/tst.ts @@ -0,0 +1,272 @@ +/** Reads tst files to apply and perform test runs. */ + +import { grammar as ohmGrammar } from "ohm-js"; +import { baseSemantics, grammars, makeParser, Span, span } from "./base.js"; + +export interface TstEchoOperation { + op: "echo"; + message: string; +} + +export interface TstClearEchoOperation { + op: "clear-echo"; +} + +export interface TstSetOperation { + op: "set"; + id: string; + index?: number; + value: number; +} + +export interface TstEvalOperation { + op: "eval" | "tick" | "tock" | "ticktock" | "vmstep"; +} + +export interface TstOutputOperation { + op: "output"; +} + +export interface TstOutputFormat { + style: "D" | "X" | "B" | "S"; + width: number; + lpad: number; + rpad: number; +} + +export interface TstOutputSpec { + id: string; + builtin: boolean; + address: number; + format?: TstOutputFormat; +} + +export interface TstOutputListOperation { + op: "output-list"; + spec: TstOutputSpec[]; +} + +export interface TstLoadROMOperation { + op: "loadRom"; + file: string; +} + +export interface TstFileOperation { + op: "load" | "output-file" | "compare-to"; + file?: string; +} + +export interface TstResetRamOperation { + op: "resetRam"; +} + +export type TstOperation = + | TstFileOperation + | TstEvalOperation + | TstEchoOperation + | TstClearEchoOperation + | TstOutputOperation + | TstSetOperation + | TstOutputListOperation + | TstLoadROMOperation + | TstResetRamOperation; + +export type Separator = "," | ";" | "!"; + +export interface TstCommand { + op: TstOperation; + separator: Separator; + span: Span; +} + +export interface TstRepeat { + statements: TstCommand[]; + count: number; + span: Span; +} + +export interface TstWhileCondition { + op: "<" | "<=" | "=" | ">=" | ">" | "<>"; + left: string | number; + right: string | number; +} + +export interface TstWhileStatement { + statements: TstCommand[]; + condition: TstWhileCondition; + span: Span; +} + +export type TstStatement = TstCommand | TstRepeat | TstWhileStatement; + +export interface Tst { + lines: TstStatement[]; +} + +import tstGrammar from "./grammars/tst.ohm.js"; +export const grammar = ohmGrammar(tstGrammar, grammars); +export const tstSemantics = grammar.extendSemantics(baseSemantics); + +tstSemantics.extendAttribute("value", { + Index(_a, idx, _b) { + return idx?.child(0)?.value ?? -1; + }, +}); + +tstSemantics.extendAttribute("name", { + FileName({ name }) { + return name; + }, +}); + +tstSemantics.addAttribute("index", { + Index(_open, dec, _close) { + return dec.child(0)?.value ?? 0; + }, +}); + +tstSemantics.addAttribute("formatSpec", { + FormatSpec( + _a, + { sourceString: style }, + { value: lpad }, + _b, + { value: width }, + _c, + { value: rpad }, + ) { + return { + style: style as TstOutputFormat["style"], + width, + lpad, + rpad, + }; + }, +}); + +tstSemantics.addAttribute("format", { + OutputFormat({ name: id }, index, formatSpec) { + return { + id, + builtin: index?.child(0) !== undefined, + address: index?.child(0)?.value ?? -1, + format: formatSpec?.child(0)?.formatSpec, + }; + }, +}); + +tstSemantics.addAttribute("operation", { + TstEvalOperation(op) { + return { op: op.sourceString as TstEvalOperation["op"] }; + }, + TstOutputOperation(_) { + return { op: "output" }; + }, + TstOutputListOperation(_, formats) { + return { + op: "output-list", + spec: formats.children.map((n) => n.format), + }; + }, + TstSetOperation(op, { name }, index, { value }) { + const setOp: TstSetOperation = { + op: "set", + id: name, + value, + }; + const child = index.child(0)?.child(1)?.child(0); + if (child) { + setOp.index = child.value; + } + return setOp; + }, + TstEchoOperation(op, str) { + return { + op: "echo", + message: str.String as string, + }; + }, + TstClearEchoOperation(op) { + return { + op: "clear-echo", + }; + }, + TstLoadROMOperation(_r, _l, name) { + return { + op: "loadRom", + file: name.sourceString, + }; + }, + TstFileOperation(op, file) { + return { + op: op.sourceString as TstFileOperation["op"], + file: file?.sourceString, + }; + }, + TstResetRAMOperation(_) { + return { + op: "resetRam", + }; + }, +}); + +tstSemantics.addAttribute("command", { + TstCommand(op, sep) { + return { + op: op.operation, + separator: sep.sourceString as Separator, + span: span(this.source), + }; + }, +}); + +tstSemantics.addAttribute("condition", { + Condition({ value: left }, { sourceString: op }, { value: right }) { + return { + left, + right, + op: op as "<" | "<=" | "=" | ">=" | ">" | "<>", + }; + }, +}); + +tstSemantics.addAttribute("statement", { + TstWhile(op, cond, _o, commands, _c) { + return { + statements: commands.children.map((node) => node.command as TstCommand), + condition: cond.condition, + span: span(this.source), + }; + }, + TstRepeat(op, count, _o, commands, _c) { + return { + statements: commands.children.map((node) => node.command as TstCommand), + count: count.sourceString ? Number(count.sourceString) : -1, + span: span(this.source), + }; + }, + TstStatement(command) { + return command.command; + }, +}); + +tstSemantics.addAttribute("tst", { + Tst(lines) { + return { + lines: lines.children.map((n) => n.statement), + }; + }, +}); + +tstSemantics.addAttribute("root", { + Root({ tst }) { + return tst; + }, +}); + +export const TST = { + grammar: tstGrammar, + semantics: tstSemantics, + parser: grammar, + parse: makeParser(grammar, tstSemantics), +}; diff --git a/web-ide-main/simulator/src/languages/vm.test.ts b/web-ide-main/simulator/src/languages/vm.test.ts new file mode 100644 index 0000000..03c0087 --- /dev/null +++ b/web-ide-main/simulator/src/languages/vm.test.ts @@ -0,0 +1,495 @@ +import { grammar, VM, Vm } from "./vm.js"; + +const SIMPLE_ADD = ` +push constant 7 +push constant 8 +add`; + +const SIMPLE_ADD_PARSED = { + instructions: [ + { + op: "push", + segment: "constant", + offset: 7, + span: { start: 1, end: 16, line: 2 }, + }, + { + op: "push", + segment: "constant", + offset: 8, + span: { start: 17, end: 32, line: 3 }, + }, + { op: "add", span: { start: 33, end: 36, line: 4 } }, + ], +} satisfies Vm; + +// d = (2 - x) + (y + 9) +const FIG7_3A = ` +push constant 2 +push local 0 +sub +push local 1 +push constant 9 +add +add +pop local 2 +`; + +const FIG7_3A_PARSED = { + instructions: [ + { + op: "push", + segment: "constant", + offset: 2, + span: { start: 1, end: 16, line: 2 }, + }, + { + op: "push", + segment: "local", + offset: 0, + span: { start: 17, end: 29, line: 3 }, + }, + { op: "sub", span: { start: 30, end: 33, line: 4 } }, + { + op: "push", + segment: "local", + offset: 1, + span: { start: 34, end: 46, line: 5 }, + }, + { + op: "push", + segment: "constant", + offset: 9, + span: { start: 47, end: 62, line: 6 }, + }, + { op: "add", span: { start: 63, end: 66, line: 7 } }, + { op: "add", span: { start: 67, end: 70, line: 8 } }, + { + op: "pop", + segment: "local", + offset: 2, + span: { start: 71, end: 82, line: 9 }, + }, + ], +} satisfies Vm; + +// (x < 7) or (y == 8) +const FIG7_3B = ` +push local 0 +push constant 7 +lt +push local 1 +push constant 8 +eq +or +`; +const FIG7_3B_PARSED = { + instructions: [ + { + op: "push", + segment: "local", + offset: 0, + span: { start: 1, end: 13, line: 2 }, + }, + { + op: "push", + segment: "constant", + offset: 7, + span: { start: 14, end: 29, line: 3 }, + }, + { op: "lt", span: { start: 30, end: 32, line: 4 } }, + { + op: "push", + segment: "local", + offset: 1, + span: { start: 33, end: 45, line: 5 }, + }, + { + op: "push", + segment: "constant", + offset: 8, + span: { start: 46, end: 61, line: 6 }, + }, + { op: "eq", span: { start: 62, end: 64, line: 7 } }, + { op: "or", span: { start: 65, end: 67, line: 8 } }, + ], +} satisfies Vm; + +const FIG8_1 = ` +// returns x * y +// x = arg 0 +// y = arg 1 +// sum = local 0 +// i = local 1 +function mult 2 + push constant 0 + pop local 0 + push constant 0 + pop local 1 +label WHILE_LOOP + push local 1 + push argument 1 + lt + neg + if-goto WHILE_END + push local 0 + push argument 0 + add + pop local 0 + push local 1 + push constant 1 + add + pop local 1 + goto WHILE_LOOP +label WHILE_END + push local 0 + return +`; +const FIG8_1_PARSED = { + instructions: [ + { + op: "function", + name: "mult", + nVars: 2, + span: { start: 76, end: 91, line: 7 }, + }, + { + op: "push", + segment: "constant", + offset: 0, + span: { start: 94, end: 109, line: 8 }, + }, + { + op: "pop", + segment: "local", + offset: 0, + span: { start: 112, end: 123, line: 9 }, + }, + { + op: "push", + segment: "constant", + offset: 0, + span: { start: 126, end: 141, line: 10 }, + }, + { + op: "pop", + segment: "local", + offset: 1, + span: { start: 144, end: 155, line: 11 }, + }, + { + op: "label", + label: "WHILE_LOOP", + span: { start: 156, end: 172, line: 12 }, + }, + { + op: "push", + segment: "local", + offset: 1, + span: { start: 175, end: 187, line: 13 }, + }, + { + op: "push", + segment: "argument", + offset: 1, + span: { start: 190, end: 205, line: 14 }, + }, + { op: "lt", span: { start: 208, end: 210, line: 15 } }, + { op: "neg", span: { start: 213, end: 216, line: 16 } }, + { + op: "if-goto", + label: "WHILE_END", + span: { start: 219, end: 236, line: 17 }, + }, + { + op: "push", + segment: "local", + offset: 0, + span: { start: 239, end: 251, line: 18 }, + }, + { + op: "push", + segment: "argument", + offset: 0, + span: { start: 254, end: 269, line: 19 }, + }, + { op: "add", span: { start: 272, end: 275, line: 20 } }, + { + op: "pop", + segment: "local", + offset: 0, + span: { start: 278, end: 289, line: 21 }, + }, + { + op: "push", + segment: "local", + offset: 1, + span: { start: 292, end: 304, line: 22 }, + }, + { + op: "push", + segment: "constant", + offset: 1, + span: { start: 307, end: 322, line: 23 }, + }, + { op: "add", span: { start: 325, end: 328, line: 24 } }, + { + op: "pop", + segment: "local", + offset: 1, + span: { start: 331, end: 342, line: 25 }, + }, + { + op: "goto", + label: "WHILE_LOOP", + span: { start: 345, end: 360, line: 26 }, + }, + { + op: "label", + label: "WHILE_END", + span: { start: 361, end: 376, line: 27 }, + }, + { + op: "push", + segment: "local", + offset: 0, + span: { start: 379, end: 391, line: 28 }, + }, + { op: "return", span: { start: 394, end: 400, line: 29 } }, + ], +}; + +const FIG8_2 = ` +function main 0 + push constant 3 + push constant 4 + call hypot 2 + return + +function hypot 2 + push argument 0 + push argument 0 + call mult 2 + push argument 1 + push argument 1 + call mult 2 + add + call sqrt 1 + return +`; +const FIG8_2_PARSED = { + instructions: [ + { + op: "function", + name: "main", + nVars: 0, + span: { start: 1, end: 16, line: 2 }, + }, + { + op: "push", + segment: "constant", + offset: 3, + span: { start: 19, end: 34, line: 3 }, + }, + { + op: "push", + segment: "constant", + offset: 4, + span: { start: 37, end: 52, line: 4 }, + }, + { + op: "call", + name: "hypot", + nArgs: 2, + span: { start: 55, end: 67, line: 5 }, + }, + { op: "return", span: { start: 70, end: 76, line: 6 } }, + { + op: "function", + name: "hypot", + nVars: 2, + span: { start: 78, end: 94, line: 8 }, + }, + { + op: "push", + segment: "argument", + offset: 0, + span: { start: 97, end: 112, line: 9 }, + }, + { + op: "push", + segment: "argument", + offset: 0, + span: { start: 115, end: 130, line: 10 }, + }, + { + op: "call", + name: "mult", + nArgs: 2, + span: { start: 133, end: 144, line: 11 }, + }, + { + op: "push", + segment: "argument", + offset: 1, + span: { start: 147, end: 162, line: 12 }, + }, + { + op: "push", + segment: "argument", + offset: 1, + span: { start: 165, end: 180, line: 13 }, + }, + { + op: "call", + name: "mult", + nArgs: 2, + span: { start: 183, end: 194, line: 14 }, + }, + { op: "add", span: { start: 197, end: 200, line: 15 } }, + { + op: "call", + name: "sqrt", + nArgs: 1, + span: { start: 203, end: 214, line: 16 }, + }, + { op: "return", span: { start: 217, end: 223, line: 17 } }, + ], +} satisfies Vm; + +const FIG8_4 = ` +function main 0 +push constant 3 +call factorial 1 +return +function factorial 1 +push argument 0 +push constant 1 +eq +if-goto BASE_CASE +push argument 0 +push argument 0 +push constant 1 +sub +call factorial 1 +call mult 2 +return +label BASE_CASE +push constant 1 +return +`; +const FIG8_4_PARSED = { + instructions: [ + { + op: "function", + name: "main", + nVars: 0, + span: { start: 1, end: 16, line: 2 }, + }, + { + op: "push", + segment: "constant", + offset: 3, + span: { start: 17, end: 32, line: 3 }, + }, + { + op: "call", + name: "factorial", + nArgs: 1, + span: { start: 33, end: 49, line: 4 }, + }, + { op: "return", span: { start: 50, end: 56, line: 5 } }, + { + op: "function", + name: "factorial", + nVars: 1, + span: { start: 57, end: 77, line: 6 }, + }, + { + op: "push", + segment: "argument", + offset: 0, + span: { start: 78, end: 93, line: 7 }, + }, + { + op: "push", + segment: "constant", + offset: 1, + span: { start: 94, end: 109, line: 8 }, + }, + { op: "eq", span: { start: 110, end: 112, line: 9 } }, + { + op: "if-goto", + label: "BASE_CASE", + span: { start: 113, end: 130, line: 10 }, + }, + { + op: "push", + segment: "argument", + offset: 0, + span: { start: 131, end: 146, line: 11 }, + }, + { + op: "push", + segment: "argument", + offset: 0, + span: { start: 147, end: 162, line: 12 }, + }, + { + op: "push", + segment: "constant", + offset: 1, + span: { start: 163, end: 178, line: 13 }, + }, + { op: "sub", span: { start: 179, end: 182, line: 14 } }, + { + op: "call", + name: "factorial", + nArgs: 1, + span: { start: 183, end: 199, line: 15 }, + }, + { + op: "call", + name: "mult", + nArgs: 2, + span: { start: 200, end: 211, line: 16 }, + }, + { op: "return", span: { start: 212, end: 218, line: 17 } }, + { + op: "label", + label: "BASE_CASE", + span: { start: 219, end: 234, line: 18 }, + }, + { + op: "push", + segment: "constant", + offset: 1, + span: { start: 235, end: 250, line: 19 }, + }, + { op: "return", span: { start: 251, end: 257, line: 20 } }, + ], +} satisfies Vm; + +test.each([ + ["Simple Add", SIMPLE_ADD, SIMPLE_ADD_PARSED], + ["Figure 7.3a", FIG7_3A, FIG7_3A_PARSED], + ["Figure 7.3b", FIG7_3B, FIG7_3B_PARSED], + ["Figure 8.1", FIG8_1, FIG8_1_PARSED], + ["Figure 8.2", FIG8_2, FIG8_2_PARSED], + ["Figure 8.4", FIG8_4, FIG8_4_PARSED], +])("VM Parser: %s", (_name, fig, parsed) => { + const match = grammar.match(fig); + expect(match).toHaveSucceeded(); + expect(VM.semantics(match).vm).toStrictEqual(parsed); +}); + +test.each([ + ["call mult", 'Line 1, col 10: expected "%B", ".", a digit, or "%X"'], + [ + "push invalid", + 'Line 1, col 6: expected "temp", "pointer", "that", "this", "constant", "static", "local", or "argument"', + ], +])("VM Parser Error: '%s'", (bad, message) => { + const match = grammar.match(bad); + expect(match).toHaveFailed(message); +}); diff --git a/web-ide-main/simulator/src/languages/vm.ts b/web-ide-main/simulator/src/languages/vm.ts new file mode 100644 index 0000000..4a57a46 --- /dev/null +++ b/web-ide-main/simulator/src/languages/vm.ts @@ -0,0 +1,260 @@ +/** Reads tst files to apply and perform test runs. */ + +import { grammar as ohmGrammar } from "ohm-js"; +import { baseSemantics, grammars, makeParser, Span, span } from "./base.js"; + +import vmGrammar from "./grammars/vm.ohm.js"; +export const grammar = ohmGrammar(vmGrammar, grammars); +export const vmSemantics = grammar.extendSemantics(baseSemantics); + +export interface Vm { + instructions: VmInstruction[]; +} + +export type Segment = + | "argument" + | "local" + | "static" + | "constant" + | "this" + | "that" + | "pointer" + | "temp"; + +export type VmInstruction = + | StackInstruction + | OpInstruction + | FunctionInstruction + | CallInstruction + | ReturnInstruction + | GotoInstruction + | LabelInstruction; + +export interface StackInstruction { + op: "push" | "pop"; + segment: Segment; + offset: number; + span?: Span; +} +export interface OpInstruction { + op: "add" | "sub" | "neg" | "lt" | "gt" | "eq" | "and" | "or" | "not"; + span?: Span; +} +export interface FunctionInstruction { + op: "function"; + name: string; + nVars: number; + span?: Span; +} +export interface CallInstruction { + op: "call"; + name: string; + nArgs: number; + span?: Span; +} +export interface ReturnInstruction { + op: "return"; + span?: Span; +} +export interface LabelInstruction { + op: "label"; + label: string; + span?: Span; +} +export interface GotoInstruction { + op: "goto" | "if-goto"; + label: string; + span?: Span; +} + +vmSemantics.addAttribute< + | "push" + | "pop" + | "function" + | "call" + | "return" + | "goto" + | "if-goto" + | "label" + | "add" + | "sub" + | "neg" + | "lt" + | "gt" + | "eq" + | "and" + | "or" + | "not" +>("op", { + push(_a, _b) { + return "push"; + }, + pop(_a, _b) { + return "pop"; + }, + function(_a, _b) { + return "function"; + }, + call(_a, _b) { + return "call"; + }, + return(_a) { + return "return"; + }, + goto(_a, _b) { + return "goto"; + }, + ifGoto(_a, _b) { + return "if-goto"; + }, + label(_a, _b) { + return "label"; + }, + Add(_) { + return "add"; + }, + Sub(_) { + return "sub"; + }, + Neg(_) { + return "neg"; + }, + Eq(_) { + return "eq"; + }, + Lt(_) { + return "lt"; + }, + Gt(_) { + return "gt"; + }, + And(_) { + return "and"; + }, + Or(_) { + return "or"; + }, + Not(_) { + return "not"; + }, +}); + +vmSemantics.addAttribute< + | "argument" + | "local" + | "static" + | "constant" + | "this" + | "that" + | "pointer" + | "temp" +>("segment", { + argument(_a, _b) { + return "argument"; + }, + local(_a, _b) { + return "local"; + }, + static(_a, _b) { + return "static"; + }, + constant(_a, _b) { + return "constant"; + }, + this(_a, _b) { + return "this"; + }, + that(_a, _b) { + return "that"; + }, + pointer(_a, _b) { + return "pointer"; + }, + temp(_a, _b) { + return "temp"; + }, +}); + +vmSemantics.addAttribute("instruction", { + StackInstruction({ op }, { segment }, value) { + return { + op: op as "push" | "pop", + segment, + offset: Number(value.sourceString), + span: span(this.source), + }; + }, + OpInstruction({ op }) { + return { + op: op as + | "add" + | "sub" + | "neg" + | "lt" + | "gt" + | "eq" + | "and" + | "or" + | "not", + span: span(this.source), + }; + }, + FunctionInstruction(_, { name }, nVars) { + return { + op: "function", + name, + nVars: Number(nVars.sourceString), + span: span(this.source), + }; + }, + CallInstruction(_, { name }, nArgs) { + return { + op: "call", + name, + nArgs: Number(nArgs.sourceString), + span: span(this.source), + }; + }, + ReturnInstruction(_) { + return { op: "return", span: span(this.source) }; + }, + // LabelInstruction = Label Name + LabelInstruction(_, { name: label }) { + return { op: "label", label, span: span(this.source) }; + }, + // GotoInstruction = (Goto | IfGoto) Name + GotoInstruction({ op }, { name: label }) { + return { + op: op as "goto" | "if-goto", + label, + span: span(this.source), + }; + }, + VmInstructionLine(inst, _) { + return inst.instruction; + }, +}); + +vmSemantics.addAttribute("vm", { + Vm(_, lines, last) { + const instructions = lines.children.map((node) => node.instruction) ?? []; + return { + instructions: last.child(0) + ? [...instructions, last.child(0).instruction] + : instructions, + }; + }, +}); + +vmSemantics.addAttribute("root", { + Root({ vm }) { + return vm; + }, +}); + +export const VM = { + grammar: vmGrammar, + semantics: vmSemantics, + parser: grammar, + parse: makeParser(grammar, vmSemantics), +}; diff --git a/web-ide-main/simulator/src/loader.ts b/web-ide-main/simulator/src/loader.ts new file mode 100644 index 0000000..af52191 --- /dev/null +++ b/web-ide-main/simulator/src/loader.ts @@ -0,0 +1,30 @@ +import { unwrap } from "@davidsouther/jiffies/lib/esm/result.js"; +import { ASM } from "./languages/asm.js"; +import { int2, parseTwosInt } from "./util/twos.js"; + +export async function loadAsm(source: string): Promise { + const asm = unwrap(ASM.parse(source)); + ASM.passes.fillLabel(asm); + return ASM.passes.emit(asm); +} + +export async function loadHack(source: string): Promise { + return source + .split("\n") + .filter((line) => line.trim() !== "") + .map(int2); +} + +export function loadHackSync(source: string): number[] { + return source + .split("\n") + .filter((line) => line.trim() !== "") + .map(int2); +} + +export async function loadBlob(bytes: string): Promise { + return bytes + .split("\n") + .filter((line) => line.trim() !== "") + .map(parseTwosInt); +} diff --git a/web-ide-main/simulator/src/output.test.ts b/web-ide-main/simulator/src/output.test.ts new file mode 100644 index 0000000..0d59fbd --- /dev/null +++ b/web-ide-main/simulator/src/output.test.ts @@ -0,0 +1,115 @@ +import { cleanState } from "@davidsouther/jiffies/lib/esm/scope/state.js"; +import { Output } from "./output.js"; +import { TestOutputInstruction } from "./test/instruction.js"; +import { Test } from "./test/tst.js"; + +class OutputTest extends Test { + private readonly vars: Map; + + constructor(init: [string, number | string][]) { + super(); + this.vars = new Map(init); + } + + hasVar(variable: string | number): boolean { + return this.vars.has(`${variable}`); + } + getVar(variable: string | number): number | string { + return this.vars.get(`${variable}`) ?? 0; + } + getWidth(variable: string, offset?: number | undefined): number { + return 1; + } + setVar(variable: string, value: number): void { + this.vars.set(`${variable}`, value); + } +} + +describe("Test Output Handler", () => { + const state = cleanState( + () => ({ + test: new OutputTest([ + ["time", "14+"], + ["a", 1], + ["b", 20], + ["in", 0], + ["out", -1], + ["address", 1234], + ]), + }), + beforeEach, + ); + + it("outputs padded values", () => { + const outA = new Output("a", "D", 1, 3, 3); + const a = outA.print(state.test); + + expect(a).toEqual(" 1 "); + }); + + it("outputs 16 bit values", () => { + const outB = new Output("b", "B", 16, 1, 1); + const b = outB.print(state.test); + expect(b).toEqual(" 0000000000010100 "); + }); + + it("outputs a line", () => { + state.test.outputList([ + { id: "a", style: "D", len: 1, lpad: 2, rpad: 2 }, + { id: "b", style: "X", len: 6, lpad: 1, rpad: 1 }, + { id: "in", style: "B", len: 2, lpad: 2, rpad: 2 }, + { id: "out", style: "B", len: 4, lpad: 2, rpad: 2 }, + ]); + state.test.addInstruction(new TestOutputInstruction()); + state.test.run(); + + expect(state.test.log()).toEqual("| 1 | 0x0014 | 00 | 1111 |\n"); + }); + + it("outputs 16 bit", () => { + const test = new OutputTest([ + ["a", 0b0001001000110100], + ["b", 0b1001100001110110], + ]); + test.outputList([ + { id: "a", style: "B", len: 16, lpad: 1, rpad: 1 }, + { id: "b", style: "B", len: 16, lpad: 1, rpad: 1 }, + ]); + + test.addInstruction(new TestOutputInstruction()); + test.run(); + + expect(test.log()).toEqual("| 0001001000110100 | 1001100001110110 |\n"); + }); + + it("outputs a header for 16 bit", () => { + const outB = new Output("b", "B", 16, 1, 1); + const b = outB.header(state.test); + expect(b).toEqual(" b "); + }); + + it("truncates a narrow header", () => { + const wideOut = new Output("addressM", "D", 5, 0, 0); + + const wide = wideOut.header(state.test); + expect(wide).toEqual("addre"); + }); + + it("does not center %S", () => { + const outTime = new Output("time", "S", 6, 1, 1); + const time = outTime.print(state.test); + expect(`'${time}'`).toEqual("' 14+ '"); + }); + + it("outputs builtin header with no index", () => { + const outPC = new Output("PC", "D", 4, 0, 0, true, -1); + const header = outPC.header(state.test); + expect(header).toEqual("PC[]"); + }); + + it("outputs builtin header with index", () => { + const outPC = new Output("RAM16K", "D", 7, 1, 1, true, 2); + const header = outPC.header(state.test); + expect(header).toEqual("RAM16K[2]"); + }); +}); diff --git a/web-ide-main/simulator/src/output.ts b/web-ide-main/simulator/src/output.ts new file mode 100644 index 0000000..ed7ca8a --- /dev/null +++ b/web-ide-main/simulator/src/output.ts @@ -0,0 +1,109 @@ +import { assert } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { Test } from "./test/tst.js"; +import { bin, dec, hex } from "./util/twos.js"; + +export class Output { + private readonly fmt: "B" | "X" | "D" | "S"; + private readonly lPad: number; + private readonly rPad: number; + private readonly len: number; + private readonly index: number; + private readonly builtin: boolean; + + // new Output(inst.id, inst.style, inst.width, inst.lpad, inst.rpad) + constructor( + private variable: string, + format = "%B1.1.1", + len?: number, + lPad?: number, + rPad?: number, + builtin?: boolean, + index?: number, + ) { + if ( + format.startsWith("%") && + len === undefined && + lPad === undefined && + rPad === undefined + ) { + const { fmt, lPad, rPad, len } = format.match( + /^%(?[BDXS])(?\d+)\.(?\d+)\.(?\d+)$/, + )?.groups as { + fmt: "B" | "X" | "D" | "S"; + lPad: string; + rPad: string; + len: string; + }; + this.fmt = fmt; + this.lPad = parseInt(lPad); + this.rPad = parseInt(rPad); + this.len = parseInt(len); + this.builtin = false; + this.index = -1; + } else { + assert(["B", "X", "D", "S"].includes(format[0])); + this.fmt = format[0] as "B" | "X" | "D" | "S"; + this.len = len ?? 3; + this.lPad = lPad ?? 1; + this.rPad = rPad ?? 1; + this.builtin = builtin ?? false; + this.index = index ?? -1; + } + } + + header(test: Test) { + let variable = `${this.variable}`; + if (this.builtin) { + const index = this.index >= 0 ? this.index : ""; + variable = `${variable}[${index}]`; + } + if (variable.length > this.len + this.lPad + this.rPad) { + return variable.substring(0, this.len + this.lPad + this.rPad); + } + return this.padCenter(variable); + } + + print(test: Test) { + const val = test.getVar(this.variable, this.index); + if (this.fmt === "S") { + return this.padLeft(val as string); + } + + const fmt = { B: bin, D: dec, X: hex }[this.fmt]; + const value = fmt(val as number); + if (this.fmt === "D") { + return this.padRight(value); + } else { + return this.padLeft(value.slice(value.length - this.len)); + } + } + + private padCenter(value: string) { + const space = this.lPad + this.len + this.rPad; + const leftSpace = Math.floor((space - value.length) / 2); + const rightSpace = space - leftSpace - value.length; + const padLeft = leftSpace + value.length; + const padRight = padLeft + rightSpace; + value = value.padStart(padLeft); + value = value.padEnd(padRight); + return value; + } + + private padLeft(value: string) { + value = value.substring(0, this.len); + const padRight = this.rPad + this.len; + const padLeft = this.lPad + padRight; + value = value.padEnd(padRight); + value = value.padStart(padLeft); + return value; + } + + private padRight(value: string) { + value = value.substring(0, this.len); + const padLeft = this.lPad + this.len; + const padRight = this.rPad + padLeft; + value = value.padStart(padLeft); + value = value.padEnd(padRight); + return value; + } +} diff --git a/web-ide-main/simulator/src/projects/all.test.ts b/web-ide-main/simulator/src/projects/all.test.ts new file mode 100644 index 0000000..172dac6 --- /dev/null +++ b/web-ide-main/simulator/src/projects/all.test.ts @@ -0,0 +1,159 @@ +import { assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { + FileSystem, + ObjectFileSystemAdapter, +} from "@davidsouther/jiffies/lib/esm/fs.js"; +import { Ok, unwrap } from "@davidsouther/jiffies/lib/esm/result.js"; +import { + ASM_PROJECTS, + CHIP_PROJECTS, + VM_PROJECTS, +} from "@nand2tetris/projects/base.js"; +import { ChipProjects, VmProjects } from "@nand2tetris/projects/full.js"; +import { Max } from "@nand2tetris/projects/samples/hack.js"; +import { + FILES as ASM_FILES, + ASM_SOLS, +} from "@nand2tetris/projects/samples/project_06/index.js"; +import { ChipProjects as ChipProjectsSols } from "@nand2tetris/projects/testing/index.js"; +import { build } from "../chip/builder.js"; +import { Chip } from "../chip/chip.js"; +import { compare } from "../compare.js"; +import { ASM, Asm } from "../languages/asm.js"; +import { CMP, Cmp } from "../languages/cmp.js"; +import { HDL, HdlParse } from "../languages/hdl.js"; +import { TST, Tst } from "../languages/tst.js"; +import { VM } from "../languages/vm.js"; +import { ChipTest } from "../test/chiptst.js"; +import { VMTest } from "../test/vmtst.js"; +import { Vm } from "../vm/vm.js"; + +const PROJECTS = new Set(["01", "03", "07", "08"]); +const SKIP = new Set([]); +const INCLUDE = new Set(["And", "And16", "Mux8Way16", "Bit"]); + +describe("Chip Projects", () => { + describe.each(Object.keys(CHIP_PROJECTS).filter((k) => PROJECTS.has(k)))( + "project %s", + (project) => { + it.each( + CHIP_PROJECTS[project as keyof typeof CHIP_PROJECTS] + .filter((k) => !SKIP.has(k)) + .filter((k) => INCLUDE.has(k)), + )("Chip %s", async (chipName) => { + const chipProject = { + // @ts-ignore + ...assertExists(ChipProjects[project]), + // @ts-ignore + ...assertExists(ChipProjectsSols[project]), + }; + const hdlFile = chipProject.SOLS[chipName]?.[`${chipName}.hdl`]; + const tstFile = chipProject.CHIPS?.[`${chipName}.tst`]; + const cmpFile = chipProject.CHIPS?.[`${chipName}.cmp`]; + + expect(hdlFile).toBeDefined(); + expect(tstFile).toBeDefined(); + expect(cmpFile).toBeDefined(); + + const hdl = HDL.parse(hdlFile); + expect(hdl).toBeOk(); + const tst = TST.parse(tstFile); + expect(tst).toBeOk(); + + const chip = await build({ parts: Ok(hdl as Ok) }); + expect(chip).toBeOk(); + const test = unwrap(ChipTest.from(Ok(tst as Ok))).with( + Ok(chip as Ok), + ); + + if (chipName === "Computer") { + test.setFileSystem( + new FileSystem(new ObjectFileSystemAdapter({ "Max.hack": Max })), + ); + } + + await test.run(); + + const outFile = test.log(); + + const cmp = CMP.parse(cmpFile); + expect(cmp).toBeOk(); + const out = CMP.parse(outFile); + expect(out).toBeOk(); + + const diffs = compare(Ok(cmp as Ok), Ok(out as Ok)); + expect(diffs).toHaveNoDiff(); + }); + }, + ); +}); + +describe("ASM Projects", () => { + describe.each(Object.keys(ASM_PROJECTS))("project %s", (project) => { + it.each(Object.keys(ASM_FILES))("%s", (file_name) => { + const source = ASM_FILES[file_name as keyof typeof ASM_FILES]; + const parsed = ASM.parse(source); + expect(parsed).toBeOk(); + const asm = Ok(parsed as Ok); + ASM.passes.fillLabel(asm); + const filled = ASM.passes.emit(asm); + expect(filled).toEqual(ASM_SOLS[file_name as keyof typeof ASM_FILES]); + }); + }); +}); + +describe("Vm Projects", () => { + describe.each(Object.keys(VM_PROJECTS).filter((k) => PROJECTS.has(k)))( + "project %s", + (project) => { + it.each( + VM_PROJECTS[project as keyof typeof VM_PROJECTS].filter( + (k) => !SKIP.has(k), + ), + )("VM Program %s", async (vmName) => { + const vmProject = { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + ...assertExists(VmProjects[project]), + }; + + const tstFile = vmProject.VMS[vmName]?.[`${vmName}VME.tst`]; + const cmpFile = vmProject.VMS[vmName]?.[`${vmName}.cmp`]; + + let vmCode = ""; + for (const filename of Object.keys(vmProject.VMS[vmName])) { + if (filename.endsWith(".vm")) { + const vmFile = vmProject.VMS[vmName]?.[filename]; + expect(vmFile).toBeDefined(); + vmCode += vmFile; + } + } + + expect(tstFile).toBeDefined(); + expect(cmpFile).toBeDefined(); + + const parsed = VM.parse(vmCode); + expect(parsed).toBeOk(); + const tst = TST.parse(tstFile); + expect(tst).toBeOk(); + + const vm = await Vm.build(unwrap(parsed).instructions); + expect(vm).toBeOk(); + const test = unwrap(VMTest.from(unwrap(tst))).with(unwrap(vm)); + + await test.run(); + + const outFile = test.log(); + + const cmp = CMP.parse(cmpFile); + expect(cmp).toBeOk(); + const out = CMP.parse(outFile); + expect(out).toBeOk(); + + const diffs = compare(unwrap(cmp), unwrap(out)); + expect(diffs).toHaveNoDiff(); + }); + }, + ); +}); diff --git a/web-ide-main/simulator/src/projects/runner.ts b/web-ide-main/simulator/src/projects/runner.ts new file mode 100644 index 0000000..b42f7fa --- /dev/null +++ b/web-ide-main/simulator/src/projects/runner.ts @@ -0,0 +1,137 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { + Err, + isErr, + isOk, + Ok, + Result, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import { + type Assignment, + AssignmentStubs, +} from "@nand2tetris/projects/base.js"; +import type { Runner, RunResult } from "@nand2tetris/runner/types.js"; +import { build as buildChip } from "../chip/builder.js"; +import { Chip } from "../chip/chip.js"; +import { CompilationError } from "../languages/base.js"; +import { HDL, HdlParse } from "../languages/hdl.js"; +import { TST, Tst } from "../languages/tst.js"; +import { ChipTest } from "../test/chiptst.js"; + +export interface AssignmentFiles extends Assignment { + hdl: string; + tst: string; + cmp: string; +} + +export interface AssignmentParse extends AssignmentFiles { + maybeParsedHDL: Result; + maybeParsedTST: Result; +} + +export interface AssignmentBuild extends AssignmentParse { + maybeChip: Result; + maybeTest: Result; +} + +export interface AssignmentRun extends AssignmentBuild { + pass: boolean; + out: string; + shadow?: RunResult; +} + +export const hasTest = ({ + name, + ext, +}: { + name: string; + ext: string; +}): boolean => + AssignmentStubs[name as keyof typeof AssignmentStubs] !== undefined && + [".hdl", ".tst"].includes(ext); + +/** Try parsing the loaded files. */ +export const maybeParse = (file: AssignmentFiles): AssignmentParse => { + const maybeParsedHDL = HDL.parse(file.hdl); + const maybeParsedTST = TST.parse(file.tst); + return { ...file, maybeParsedHDL, maybeParsedTST }; +}; + +/** After parsing the assignment, compile the Chip and Tst. */ +export const maybeBuild = + (fs: FileSystem) => + async (file: AssignmentParse): Promise => { + let maybeChip: Result; + if (isOk(file.maybeParsedHDL)) { + const maybeBuilt = await buildChip({ + parts: Ok(file.maybeParsedHDL), + fs, + }); + if (isErr(maybeBuilt)) { + maybeChip = Err(new Error(Err(maybeBuilt).message)); + } else { + maybeChip = maybeBuilt; + } + } else { + maybeChip = Err(new Error("HDL Was not parsed")); + } + const maybeTest = isOk(file.maybeParsedTST) + ? ChipTest.from(Ok(file.maybeParsedTST)) + : Err(new Error("TST Was not parsed")); + + return { ...file, maybeChip, maybeTest }; + }; + +/** If the assignment parsed, run it! */ +export const tryRun = + (fs: FileSystem) => + async (assignment: AssignmentBuild): Promise => { + if (isErr(assignment.maybeChip)) { + return { + ...assignment, + pass: false, + out: Err(assignment.maybeChip).message, + }; + } + if (isErr(assignment.maybeTest)) { + return { + ...assignment, + pass: false, + out: Err(assignment.maybeTest).message, + }; + } + const test = Ok(assignment.maybeTest) + .with(Ok(assignment.maybeChip)) + .setFileSystem(fs); + await test.run(); + const out = test.log(); + const pass = out.trim() === assignment.cmp.trim(); + return { ...assignment, out, pass }; + }; + +/** Parse & execute a Nand2tetris assignment, possibly also including the Java output in shadow mode. */ +export const runner = (fs: FileSystem, ideRunner?: Runner) => { + const tryRunWithFs = tryRun(fs); + const maybeBuildWithFs = maybeBuild(fs); + return async (assignment: AssignmentFiles): Promise => { + const jsRunner = async () => + tryRunWithFs(await maybeBuildWithFs(await maybeParse(assignment))); + const javaRunner = async () => ideRunner?.hdl(assignment); + + const [jsRun, shadow] = await Promise.all([jsRunner(), javaRunner()]); + return { ...jsRun, shadow }; + }; +}; + +/** Run all tests for a given Nand2Tetris project. */ +export async function runTests( + files: Array, + loadAssignment: (file: Assignment) => Promise, + fs: FileSystem, + ideRunner?: Runner, +): Promise { + const run = runner(fs, ideRunner); + return Promise.all( + files.map(loadAssignment).map(async (assignment) => run(await assignment)), + ); +} diff --git a/web-ide-main/simulator/src/setupTests.ts b/web-ide-main/simulator/src/setupTests.ts new file mode 100644 index 0000000..21fd35b --- /dev/null +++ b/web-ide-main/simulator/src/setupTests.ts @@ -0,0 +1,101 @@ +import { display } from "@davidsouther/jiffies/lib/esm/display.js"; +import { + Err, + isErr, + isOk, + Ok, + Result, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import type { MatchResult } from "ohm-js"; +import { Diff } from "./compare.js"; + +interface CustomMatchers { + toBeOk(expected?: T): R; + toBeErr(expected?: T): R; +} + +interface OhmMatchers { + toHaveSucceeded(): R; + toHaveFailed(message: string): R; +} + +interface CmpMatchers { + toHaveNoDiff(): R; +} + +declare global { + // biome-ignore lint/style/noNamespace: add some setup stuff + namespace jest { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + type Expect = CustomMatchers; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + interface Matchers + extends CustomMatchers, + OhmMatchers, + CmpMatchers {} + interface InverseAsymmetricMatchers extends CustomMatchers, OhmMatchers {} + } +} + +expect.extend({ + toBeErr(result: Result, expected?: Err) { + if (isOk(result)) { + return { + pass: false, + message: () => + `Expected Err(${display(expected)}), got Ok(${display(Err(result))})`, + }; + } else { + if (expected) { + expect(Err(result)).toMatchObject(Err(expected) as Error); + } + } + return { + pass: true, + message: () => `Err(${display(Err(result))}) is expected`, + }; + }, + toBeOk(result: Result, expected?: Ok) { + if (isErr(result)) { + return { + pass: false, + message: () => + `Expected Ok(${display(expected)}), got Err(${display(Err(result))})`, + }; + } else { + if (expected) { + expect(Ok(result)).toMatchObject(Ok(expected) as object); + } + } + return { + pass: true, + message: () => `Ok(${display(Ok(result))}) is expected`, + }; + }, + toHaveSucceeded(match: MatchResult) { + if (match.succeeded()) { + return { pass: true, message: () => "Match succeeded" }; + } else { + return { pass: false, message: () => match.message ?? "Match failed" }; + } + }, + toHaveFailed(match: MatchResult, message: string) { + expect(match.failed()).toBe(true); + expect(match.shortMessage).toBe(message); + return { + pass: true, + message: () => "Failed to parse with correct message", + }; + }, + toHaveNoDiff(diffs: Diff[]) { + expect( + diffs.map(({ a, b, col, row }) => `${a} <> ${b} (${row}:${col})`), + ).toEqual([]); + return { + pass: true, + message: () => "There were no diffs", + }; + }, +}); diff --git a/web-ide-main/simulator/src/test/builder.ts b/web-ide-main/simulator/src/test/builder.ts new file mode 100644 index 0000000..67663a0 --- /dev/null +++ b/web-ide-main/simulator/src/test/builder.ts @@ -0,0 +1,154 @@ +import { checkExhaustive } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { Err, Ok, Result } from "@davidsouther/jiffies/lib/esm/result.js"; +import { Span } from "../languages/base.js"; +import { + Tst, + TstCommand, + TstOperation, + TstStatement, + TstWhileStatement, +} from "../languages/tst.js"; +import { + TestEvalInstruction, + TestTickInstruction, + TestTockInstruction, +} from "./chiptst.js"; +import { TestResetRamInstruction, TestTickTockInstruction } from "./cputst.js"; +import { + Condition, + TestBreakInstruction, + TestClearEchoInstruction, + TestCompareToInstruction, + TestEchoInstruction, + TestInstruction, + TestLoadInstruction, + TestLoadROMInstruction, + TestOutputFileInstruction, + TestOutputInstruction, + TestOutputListInstruction, + TestRepeatInstruction, + TestSetInstruction, + TestStopInstruction, + TestWhileInstruction, +} from "./instruction.js"; +import { Test } from "./tst.js"; +import { TestVMStepInstruction } from "./vmtst.js"; + +export function isTstCommand(line: TstStatement): line is TstCommand { + return (line as TstCommand).op !== undefined; +} + +function isTstWhileStatement(line: TstStatement): line is TstWhileStatement { + return (line as TstWhileStatement).condition !== undefined; +} + +function makeInstruction(inst: TstOperation) { + const { op } = inst; + switch (op) { + case "tick": + return new TestTickInstruction(); + case "tock": + return new TestTockInstruction(); + case "ticktock": + return new TestTickTockInstruction(); + case "eval": + return new TestEvalInstruction(); + case "vmstep": + return new TestVMStepInstruction(); + case "output": + return new TestOutputInstruction(); + case "set": + return new TestSetInstruction(inst.id, inst.value, inst.index); + case "output-list": + return new TestOutputListInstruction(inst.spec); + case "echo": + return new TestEchoInstruction(inst.message); + case "clear-echo": + return new TestClearEchoInstruction(); + case "loadRom": + return new TestLoadROMInstruction(inst.file); + case "load": + return new TestLoadInstruction(inst.file); + case "output-file": + return new TestOutputFileInstruction(inst.file); + case "compare-to": + return new TestCompareToInstruction(inst.file); + case "resetRam": + return new TestResetRamInstruction(); + default: + checkExhaustive(op, `Unknown tst operation ${op}`); + } +} + +export function fill( + test: T, + tst: Tst, + requireLoad = true, +): Result { + let span: Span | undefined; + let stepInstructions: TestInstruction[] = []; + + let base: T | TestWhileInstruction | TestRepeatInstruction = test; + let commands: TstCommand[] = []; + + let hasLoad = false; + + for (const line of tst.lines) { + if (isTstCommand(line)) { + base = test; + commands = [line]; + } else { + const repeat = isTstWhileStatement(line) + ? new TestWhileInstruction( + new Condition( + line.condition.left, + line.condition.right, + line.condition.op, + ), + ) + : new TestRepeatInstruction(line.count); + repeat.span = line.span; + test.addInstruction(repeat); + + base = repeat; + commands = line.statements; + } + + for (const command of commands) { + if (command.op.op == "load") { + hasLoad = true; + } + const inst = makeInstruction(command.op); + if (inst !== undefined) { + if (span === undefined) { + span = line.span; + } else { + span.end = line.span.end; + } + + base.addInstruction(inst); + stepInstructions.push(inst); + } + if (command.separator != ",") { + if (command.separator == ";") { + base.addInstruction(new TestStopInstruction(span ?? command.span)); + } else if (command.separator == "!") { + base.addInstruction(new TestBreakInstruction(span ?? command.span)); + } + for (const inst of stepInstructions) { + inst.span = span ?? command.span; + } + span = undefined; + stepInstructions = []; + } + } + } + + if (requireLoad && !hasLoad) { + return Err(new Error("A test script must have a load command")); + } + + test.reset(); + + return Ok(test); +} diff --git a/web-ide-main/simulator/src/test/chiptst.test.ts b/web-ide-main/simulator/src/test/chiptst.test.ts new file mode 100644 index 0000000..9b393eb --- /dev/null +++ b/web-ide-main/simulator/src/test/chiptst.test.ts @@ -0,0 +1,213 @@ +import { unwrap } from "@davidsouther/jiffies/lib/esm/result.js"; +import { Computer } from "../chip/builtins/computer/computer.js"; +import { Nand } from "../chip/builtins/logic/nand.js"; +import { TstRepeat } from "../languages/tst.js"; +import { + ChipTest, + TestEvalInstruction, + TestTickInstruction, + TestTockInstruction, +} from "./chiptst.js"; +import { + TestCompoundInstruction, + TestOutputInstruction, + TestSetInstruction, +} from "./instruction.js"; + +describe("Chip Test", () => { + describe("Builtins", () => { + it("can set Memory", async () => { + const computer = new Computer(); + const test = new ChipTest().with(computer); + + test.addInstruction(new TestSetInstruction("RAM16K", 0x1234, 2)); + await test.run(); + + expect(computer.get("RAM16K", 2)?.busVoltage).toBe(0x1234); + }); + + it("can read memory", async () => { + const computer = new Computer(); + const test = new ChipTest().with(computer); + test.outputList([ + { + id: "RAM16K", + style: "D", + len: 4, + lpad: 0, + rpad: 0, + builtin: true, + address: 2, + }, + ]); + + test.addInstruction(new TestSetInstruction("RAM16K", 1234, 2)); + test.addInstruction(new TestOutputInstruction()); + await test.run(); + + expect(test.log()).toEqual(`|1234|\n`); + }); + }); + + describe("Full tests", () => { + it("creates a simulator test", async () => { + const test = new ChipTest().with(new Nand()); + test.outputList( + ["a", "b", "out"].map((v) => { + return { id: v }; + }), + ); + + let statement: TestCompoundInstruction; + statement = new TestCompoundInstruction(); + test.addInstruction(statement); + [ + new TestSetInstruction("a", 0), + new TestSetInstruction("b", 0), + new TestEvalInstruction(), + new TestOutputInstruction(), + ].forEach((i) => statement.addInstruction(i)); + + statement = new TestCompoundInstruction(); + test.addInstruction(statement); + [ + new TestSetInstruction("a", 1), + new TestSetInstruction("b", 1), + new TestEvalInstruction(), + new TestOutputInstruction(), + ].forEach((i) => statement.addInstruction(i)); + + statement = new TestCompoundInstruction(); + test.addInstruction(statement); + [ + new TestSetInstruction("a", 1), + new TestSetInstruction("b", 0), + new TestEvalInstruction(), + new TestOutputInstruction(), + ].forEach((i) => statement.addInstruction(i)); + + statement = new TestCompoundInstruction(); + test.addInstruction(statement); + [ + new TestSetInstruction("a", 0), + new TestSetInstruction("b", 1), + new TestEvalInstruction(), + new TestOutputInstruction(), + ].forEach((i) => statement.addInstruction(i)); + + await test.run(); + expect(test.log()).toEqual( + `| 0 | 0 | 1 |\n| 1 | 1 | 0 |\n| 1 | 0 | 1 |\n| 0 | 1 | 1 |\n`, + ); + }); + + it("tick tocks a clock", async () => { + const test = new ChipTest(); //.with(new DFF()); + test.outputList([{ id: "time", style: "S", len: 4, lpad: 0, rpad: 0 }]); + for (let i = 0; i < 5; i++) { + const statement = new TestCompoundInstruction(); + test.addInstruction(statement); + statement.addInstruction(new TestTickInstruction()); + statement.addInstruction(new TestOutputInstruction()); + statement.addInstruction(new TestTockInstruction()); + statement.addInstruction(new TestOutputInstruction()); + } + for (let i = 0; i < 2; i++) { + const statement = new TestCompoundInstruction(); + test.addInstruction(statement); + statement.addInstruction(new TestEvalInstruction()); + statement.addInstruction(new TestOutputInstruction()); + } + for (let i = 0; i < 3; i++) { + const statement = new TestCompoundInstruction(); + test.addInstruction(statement); + statement.addInstruction(new TestTickInstruction()); + statement.addInstruction(new TestTockInstruction()); + statement.addInstruction(new TestOutputInstruction()); + } + + await test.run(); + + expect(test.log().trim().split("\n")).toEqual( + [ + "0+", + "1", + "1+", + "2", + "2+", + "3", + "3+", + "4", + "4+", + "5", + "5", + "5", + "6", + "7", + "8", + ].map((i) => `|${i.padEnd(4, " ")}|`), + ); + }); + + it("tick tocks a clock with a repeat", async () => { + const repeat: TstRepeat = { + count: 5, + statements: [ + { + op: { op: "tick" }, + separator: ",", + span: { start: 0, end: 27, line: 1 }, + }, + { + op: { op: "output" }, + separator: ",", + span: { start: 0, end: 27, line: 1 }, + }, + { + op: { op: "tock" }, + separator: ",", + span: { start: 0, end: 27, line: 1 }, + }, + { + op: { op: "output" }, + separator: ";", + span: { start: 0, end: 27, line: 1 }, + }, + ], + span: { + line: 1, + start: 0, + end: 27, + }, + }; + + const maybeTest = ChipTest.from( + { + lines: [repeat], + }, + { requireLoad: false }, + ); + expect(maybeTest).toBeOk(); + const test = unwrap(maybeTest); + test.outputList([{ id: "time", style: "S", len: 4, lpad: 0, rpad: 0 }]); + + await test.run(); + + expect(test.log().trim().split("\n")).toEqual( + ["0+", "1", "1+", "2", "2+", "3", "3+", "4", "4+", "5"].map( + (i) => `|${i.padEnd(4, " ")}|`, + ), + ); + }); + }); + + it("has a first step", () => { + const test = new ChipTest(); //.with(new DFF()); + const statement = new TestSetInstruction("a", 1); + test.addInstruction(statement); + + test.reset(); + + expect(test.currentStep).toBeDefined(); + }); +}); diff --git a/web-ide-main/simulator/src/test/chiptst.ts b/web-ide-main/simulator/src/test/chiptst.ts new file mode 100644 index 0000000..c03ced9 --- /dev/null +++ b/web-ide-main/simulator/src/test/chiptst.ts @@ -0,0 +1,160 @@ +import { Result } from "@davidsouther/jiffies/lib/esm/result.js"; +import { Bus, Chip, HIGH, LOW, Low } from "../chip/chip.js"; +import { Clock } from "../chip/clock.js"; +import { Tst } from "../languages/tst.js"; +import { Action } from "../types.js"; +import { fill } from "./builder.js"; +import { TestInstruction } from "./instruction.js"; +import { Test } from "./tst.js"; + +export class ChipTest extends Test { + private chip: Chip = new Low(); + private doLoad?: (path: string) => Promise; + + get chipId(): number { + return this.chip.id; + } + + private clock = Clock.get(); + + static from( + tst: Tst, + options: { + dir?: string; + setStatus?: Action; + loadAction?: (path: string) => Promise; + compareTo?: Action; + requireLoad?: boolean; + } = {}, + ): Result { + const test = new ChipTest(options); + + return fill(test, tst, options.requireLoad); + } + + constructor({ + dir, + setStatus, + loadAction, + compareTo, + }: { + dir?: string; + setStatus?: Action; + loadAction?: (path: string) => Promise; + compareTo?: Action; + } = {}) { + super(dir, setStatus, compareTo); + this.doLoad = loadAction; + } + + with(chip: Chip): this { + this.chip = chip; + return this; + } + + override async load(filename?: string): Promise { + if (!this.dir) return; + const chip = await this.doLoad?.( + filename ? `${this.dir}/${filename}` : this.dir, + ); + if (chip) { + this.chip = chip; + } + } + + hasVar(variable: string | number): boolean { + if (variable === "time") { + return true; + } + variable = `${variable}`; + // Look up built-in chip state variables + return this.chip.hasIn(variable) || this.chip.hasOut(variable); + } + + getVar(variable: string | number, offset?: number): number | string { + variable = `${variable}`; + if (variable === "time") { + return this.clock.toString(); + } + const pin = this.chip.get(variable, offset); + if (!pin) return 0; + return pin instanceof Bus ? pin.busVoltage : pin.voltage(); + } + + getWidth(variable: string, offset?: number): number { + const pin = this.chip.get(variable, offset); + if (!pin) return 0; + return pin.width; + } + + setVar(variable: string, value: number, offset?: number): void { + // Look up built-in chip state variables + const pinOrBus = this.chip.get(variable, offset); + if (pinOrBus instanceof Bus) { + pinOrBus.busVoltage = value; + } else { + pinOrBus?.pull(value === 0 ? LOW : HIGH); + } + } + + eval(): void { + this.chip.eval(); + } + + tick(): void { + this.chip.eval(); + this.clock.tick(); + } + + tock(): void { + this.chip.eval(); + this.clock.tock(); + } + + override async loadROM(filename: string) { + await this.chip.load(this.fs, [this.dir ?? "", filename].join("/")); + } + + override async run() { + this.clock.reset(); + await super.run(); + } +} + +export interface ChipTestInstruction extends TestInstruction { + _chipTestInstruction_: true; + do(test: ChipTest): Promise; +} + +export class TestEvalInstruction implements ChipTestInstruction { + readonly _chipTestInstruction_ = true; + async do(test: ChipTest) { + test.eval(); + } + + *steps() { + yield this; + } +} + +export class TestTickInstruction implements ChipTestInstruction { + readonly _chipTestInstruction_ = true; + async do(test: ChipTest) { + test.tick(); + } + + *steps() { + yield this; + } +} + +export class TestTockInstruction implements ChipTestInstruction { + readonly _chipTestInstruction_ = true; + async do(test: ChipTest) { + test.tock(); + } + + *steps() { + yield this; + } +} diff --git a/web-ide-main/simulator/src/test/cputst.ts b/web-ide-main/simulator/src/test/cputst.ts new file mode 100644 index 0000000..8b04187 --- /dev/null +++ b/web-ide-main/simulator/src/test/cputst.ts @@ -0,0 +1,187 @@ +import { assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { Result } from "@davidsouther/jiffies/lib/esm/result.js"; +import { CPU } from "../cpu/cpu.js"; +import { ROM } from "../cpu/memory.js"; +import { Tst } from "../languages/tst.js"; +import { Action, AsyncAction } from "../types.js"; +import { fill, isTstCommand } from "./builder.js"; +import { TestInstruction } from "./instruction.js"; +import { Test } from "./tst.js"; + +export class CPUTest extends Test { + cpu: CPU; + private ticks = 0; + private doLoad?: AsyncAction; + fileLoaded = false; + hasLoad = false; + + static from( + tst: Tst, + options: { + dir?: string; + rom?: ROM; + doEcho?: Action; + doLoad?: AsyncAction; + compareTo?: Action; + requireLoad?: boolean; + } = {}, + ): Result { + const test = new CPUTest(options); + + test.hasLoad = tst.lines.some( + (line) => isTstCommand(line) && line.op.op == "load", + ); + + return fill(test, tst, options.requireLoad); + } + + constructor({ + dir, + rom = new ROM(), + doEcho, + doLoad, + compareTo, + }: { + dir?: string; + rom?: ROM; + doEcho?: Action; + doLoad?: AsyncAction; + compareTo?: Action; + } = {}) { + super(dir, doEcho, compareTo); + this.doLoad = doLoad; + this.cpu = new CPU({ ROM: rom }); + this.reset(); + } + + override async step() { + if (!this.hasLoad && this.cpu.ROM.isEmpty()) { + throw new Error( + "Cannot execute the test without first loading an .asm or .hack file", + ); + } + return super.step(); + } + + override async load(filename?: string): Promise { + if (!filename && !this.dir) return; + const dir = assertExists(this.dir?.split("/").slice(0, -1).join("/")); + const rom = await this.doLoad?.(filename ? `${dir}/${filename}` : dir); + if (rom) { + this.cpu = new CPU({ ROM: rom }); + } + } + + override reset(): this { + super.reset(); + this.cpu.reset(); + this.ticks = 0; + return this; + } + + hasVar(variable: string | number): boolean { + if (typeof variable === "number") { + return false; + } + // A: Current value of the address register (unsigned 15-bit); + // D: Current value of the data register (16-bit); + // PC: Current value of the Program Counter (unsigned 15-bit); + // RAM[i]: Current value of RAM location i (16-bit); + // time: Number of time units (also called clock cycles, or ticktocks) that elapsed since the simulation started (a read-only system variable). + if ( + variable === "A" || + variable === "D" || + variable === "PC" || + variable === "time" || + variable.startsWith("RAM") + ) { + return true; + } + return false; + } + + getVar(variable: string | number, offset?: number): number { + switch (variable) { + case "A": + return this.cpu.A; + case "D": + return this.cpu.D; + case "PC": + return this.cpu.PC; + case "time": + return this.ticks; + case "RAM": + // Exact RAM with offset + return offset === undefined ? 0 : this.cpu.RAM.get(offset); + } + if (typeof variable === "number") return 0; + if (variable.startsWith("RAM")) { + // RAM with implicit offset, EG: RAM[123] + const num = Number(variable.substring(4, variable.length - 1)); + return this.cpu.RAM.get(num); + } + return 0; + } + + getWidth(variable: string, offset?: number): number { + return 16; + } + + setVar(variable: string, value: number, index?: number): void { + // A: Current value of the address register (unsigned 15-bit); + // D: Current value of the data register (16-bit); + // PC: Current value of the Program Counter (unsigned 15-bit); + // RAM[i]: Current value of RAM location i (16-bit); + switch (variable) { + case "A": + this.cpu.setA(value); + break; + case "D": + this.cpu.setD(value); + break; + case "PC": + this.cpu.setPC(value); + break; + case "RAM": + this.cpu.RAM.set(index ?? 0, value); + break; + } + return; + } + + ticktock(): void { + this.ticks += 1; + this.cpu.tick(); + } + + override async loadROM(filename: string): Promise { + await this.cpu.ROM.load(this.fs, filename); + } +} + +export interface CPUTestInstruction extends TestInstruction { + _cpuTestInstruction_: true; + do(test: CPUTest): Promise; +} + +export class TestTickTockInstruction implements CPUTestInstruction { + readonly _cpuTestInstruction_ = true; + async do(test: CPUTest) { + test.ticktock(); + } + + *steps() { + yield this; + } +} + +export class TestResetRamInstruction implements CPUTestInstruction { + readonly _cpuTestInstruction_ = true; + async do(test: CPUTest) { + test.cpu.RAM.reset(); + } + + *steps() { + yield this; + } +} diff --git a/web-ide-main/simulator/src/test/instruction.ts b/web-ide-main/simulator/src/test/instruction.ts new file mode 100644 index 0000000..df4d831 --- /dev/null +++ b/web-ide-main/simulator/src/test/instruction.ts @@ -0,0 +1,293 @@ +import { Span } from "../languages/base.js"; +import { TstOutputSpec } from "../languages/tst.js"; +import { Test } from "./tst.js"; + +export interface TestInstruction { + span?: Span; + do(test: Test): Promise; + steps(test: Test): IterableIterator; +} + +export class TestControlInstruction implements TestInstruction { + span: Span; + + constructor(span: Span) { + this.span = span; + } + + async do() { + return; + } + *steps() { + yield this; + } +} + +export class TestStopInstruction extends TestControlInstruction {} +export class TestBreakInstruction extends TestControlInstruction {} + +export class TestSetInstruction implements TestInstruction { + constructor( + private variable: string, + private value: number, + private index?: number | undefined, + ) {} + + async do(test: Test) { + test.setVar(this.variable, this.value, this.index); + } + + *steps() { + yield this; + } +} + +export class TestOutputInstruction implements TestInstruction { + async do(test: Test) { + test.output(); + } + + *steps() { + yield this; + } +} + +export interface OutputParams { + id: string; + style?: "B" | "D" | "S" | "X"; + len?: number; + lpad?: number; + rpad?: number; + builtin?: boolean; + address?: number; +} + +export class TestOutputListInstruction implements TestInstruction { + private outputs: OutputParams[] = []; + + constructor(specs: TstOutputSpec[] = []) { + for (const spec of specs) { + this.addOutput(spec); + } + } + + addOutput(inst: TstOutputSpec) { + this.outputs.push({ + id: inst.id, + style: inst.format?.style ?? "B", + len: inst.format?.width ?? -1, + lpad: inst.format?.lpad ?? 1, + rpad: inst.format?.rpad ?? 1, + builtin: inst.builtin, + address: inst.address, + }); + } + + async do(test: Test) { + test.outputList(this.outputs); + test.header(); + } + + *steps() { + yield this; + } +} + +export class TestCompoundInstruction implements TestInstruction { + protected readonly instructions: TestInstruction[] = []; + span?: Span; + + addInstruction(instruction: TestInstruction) { + this.instructions.push(instruction); + } + + async do(test: Test) { + for (const instruction of this.instructions) { + instruction.do(test); + } + } + + *steps(_test: Test): Generator { + yield this; + } +} + +export class TestRepeatInstruction extends TestCompoundInstruction { + constructor(public readonly repeat: number) { + super(); + } + + override async do() { + return undefined; + } + + private *innerSteps(test: Test): Generator { + for (const instruction of this.instructions) { + yield* instruction.steps(test) as Generator; + } + } + + override *steps(test: Test): Generator { + if (this.repeat === -1) { + yield this; + while (true) { + yield* this.innerSteps(test); + } + } else { + for (let i = 0; i < this.repeat; i++) { + yield this; + yield* this.innerSteps(test); + } + } + } +} + +export class Condition { + constructor( + public readonly x: string | number, + public readonly y: string | number, + public readonly op: "<" | "<=" | "=" | ">=" | ">" | "<>", + ) {} + + check(test: Test): boolean { + const x = test.hasVar(this.x) ? test.getVar(this.x) : this.x; + const y = test.hasVar(this.y) ? test.getVar(this.y) : this.y; + + if (typeof x === "string" || typeof y === "string") { + switch (this.op) { + case "=": + return `${x}` === `${y}`; + case "<>": + return `${x}` !== `${y}`; + } + } else { + switch (this.op) { + case "<": + return x < y; + case "<=": + return x <= y; + case ">": + return x > y; + case ">=": + return x >= y; + case "=": + return x === y; + case "<>": + return x !== y; + } + } + return false; + } +} + +export class TestWhileInstruction extends TestCompoundInstruction { + constructor(public readonly condition: Condition) { + super(); + } + + override *steps(test: Test): Generator { + while (this.condition.check(test)) { + yield this; + for (const instruction of this.instructions) { + yield* instruction.steps(test) as Generator; + } + } + } +} + +export class TestEchoInstruction implements TestInstruction { + constructor(public readonly content: string) {} + async do(test: Test) { + test.echo(this.content); + } + + *steps() { + yield this; + } +} + +export class TestClearEchoInstruction implements TestInstruction { + async do(test: Test) { + test.clearEcho(); + } + + *steps() { + yield this; + } +} + +export class TestLoadROMInstruction implements TestInstruction { + constructor(readonly file: string) {} + async do(test: Test) { + await test.loadROM(this.file); + } + + *steps() { + yield this; + } +} + +export class TestLoadInstruction implements TestInstruction { + constructor(readonly file?: string) {} + + async do(test: Test) { + await test.load(this.file); + } + + *steps() { + yield this; + } +} + +export class TestCompareToInstruction implements TestInstruction { + constructor(readonly file?: string) {} + + async do(test: Test) { + if (this.file) { + await test.compareTo(this.file); + } + } + + *steps() { + yield this; + } +} + +export class TestOutputFileInstruction implements TestInstruction { + constructor(readonly file?: string) {} + + async do(test: Test) { + if (this.file) { + test.outputFile(this.file); + } + } + + *steps() { + yield this; + } +} + +export class TestBreakpointInstruction implements TestInstruction { + constructor( + readonly variable: string, + readonly value: number, + ) {} + + async do(test: Test) { + test.addBreakpoint(this.variable, this.value); + } + + *steps() { + yield this; + } +} + +export class TestClearBreakpointsInstruction implements TestInstruction { + async do(test: Test) { + test.clearBreakpoints(); + } + + *steps() { + yield this; + } +} diff --git a/web-ide-main/simulator/src/test/tst.ts b/web-ide-main/simulator/src/test/tst.ts new file mode 100644 index 0000000..be614f6 --- /dev/null +++ b/web-ide-main/simulator/src/test/tst.ts @@ -0,0 +1,176 @@ +import { assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { Output } from "../output.js"; +import { Action } from "../types.js"; +import { + OutputParams, + TestBreakInstruction, + TestInstruction, + TestStopInstruction, +} from "./instruction.js"; + +export const DEFAULT_TIME_WIDTH = 7; + +export abstract class Test { + protected readonly instructions: (IS | TestInstruction)[] = []; + protected _outputList: Output[] = []; + protected _log = ""; + fs: FileSystem = new FileSystem(); + protected doEcho?: Action; + protected doCompareTo?: Action; + protected dir?: string; + protected outputFileName?: string; + + constructor( + path?: string, + doEcho?: Action, + doCompareTo?: Action, + ) { + this.doEcho = doEcho; + this.doCompareTo = doCompareTo; + this.dir = path; + } + + setFileSystem(fs: FileSystem): this { + this.fs = fs; + return this; + } + + echo(_content: string) { + this.doEcho?.(_content); + return; + } + clearEcho() { + this.doEcho?.(""); + return; + } + + async loadROM(_filename?: string): Promise { + return undefined; + } + async load(_filename?: string): Promise { + return undefined; + } + + async compareTo(filename: string): Promise { + this.doCompareTo?.(filename); + } + outputFile(filename: string): void { + this.outputFileName = filename; + } + + private createOutputs(params: OutputParams[]): Output[] { + return params.map((param) => { + if (param.len === -1) { + if (param.id === "time") { + param.len = DEFAULT_TIME_WIDTH; + param.style = "S"; + } else { + const width = this.getWidth(param.id, param.address); + if (param.style === "B") { + param.len = width; + } else if (param.style === "D") { + param.len = Math.ceil(Math.log(width)); + } else if (param.style === "X") { + param.len = Math.ceil(width / 4); + } + } + } + return new Output( + param.id, + param.style, + param.len, + param.lpad, + param.rpad, + param.builtin, + param.address, + ); + }); + } + + outputList(params: OutputParams[]): void { + this._outputList = this.createOutputs(params); + } + + addInstruction(instruction: IS | TestInstruction): void { + this.instructions.push(instruction); + } + + reset(): this { + this._steps = (function* (test) { + for (const instruction of test.instructions) { + yield* instruction.steps(test); + } + })(this); + this._step = this._steps.next(); + this._log = ""; + return this; + } + + private _steps!: IterableIterator; + private _step!: IteratorResult; + + get steps(): Iterator { + if (this._steps === undefined) { + this.reset(); + this._steps = assertExists(this._steps, "Reset did not initialize steps"); + this._step = assertExists(this._step, "Reset did not find first step"); + } + return this._steps; + } + + get currentStep(): IS | TestInstruction | undefined { + return this._step?.value; + } + + get done(): boolean { + return this._step?.done ?? false; + } + + async step() { + while (!this._step.done) { + await this._step.value.do(this); + this._step = this.steps.next(); + + if (this._step.value instanceof TestStopInstruction) { + this._step = this.steps.next(); + return false; + } else if (this._step.value instanceof TestBreakInstruction) { + return true; + } + } + return true; + } + + async run() { + this.reset(); + while (!(await this.step())); + } + + protected readonly breakpoints: Map = new Map(); + addBreakpoint(variable: string, value: number) { + this.breakpoints.set(variable, value); + } + clearBreakpoints() { + this.breakpoints.clear(); + } + + output() { + const values = this._outputList.map((output) => output.print(this)); + this._log += `|${values.join("|")}|\n`; + } + + header() { + const values = this._outputList.map((output) => output.header(this)); + this._log += `|${values.join("|")}|\n`; + } + + log() { + return this._log; + } + + abstract hasVar(variable: string | number): boolean; + abstract getVar(variable: string | number, offset?: number): number | string; + abstract setVar(variable: string, value: number, offset?: number): void; + abstract getWidth(variable: string, offset?: number): number; +} diff --git a/web-ide-main/simulator/src/test/vmtst.test.ts b/web-ide-main/simulator/src/test/vmtst.test.ts new file mode 100644 index 0000000..75fc187 --- /dev/null +++ b/web-ide-main/simulator/src/test/vmtst.test.ts @@ -0,0 +1,38 @@ +import { + FileSystem, + ObjectFileSystemAdapter, +} from "@davidsouther/jiffies/lib/esm/fs.js"; +import { unwrap } from "@davidsouther/jiffies/lib/esm/result.js"; +import { VM_PROJECTS } from "@nand2tetris/projects/base.js"; +import { resetFiles } from "@nand2tetris/projects/full.js"; +import { TST } from "../languages/tst.js"; +import { VMTest } from "./vmtst.js"; + +async function prepare(project: "07" | "08", name: string): Promise { + const fs = new FileSystem(new ObjectFileSystemAdapter({})); + await resetFiles(fs); + fs.cd(`/projects/${project}/${name}`); + const vm_tst = await fs.readFile(name + "VME.tst"); + const tst = unwrap(TST.parse(vm_tst)); + const test = unwrap(VMTest.from(tst)).using(fs); + await test.load(); + return test; +} + +describe("VM Test Runner", () => { + test.each(VM_PROJECTS["07"])("07 VM Test Runner %s", async (name) => { + const test = await prepare("07", name); + + for (let i = 0; i < 100; i++) { + await test.step(); + } + }); + + test.each(VM_PROJECTS["08"])("08 VM Test Runner %s", async (name) => { + const test = await prepare("08", name); + + for (let i = 0; i < 100; i++) { + test.step(); + } + }); +}); diff --git a/web-ide-main/simulator/src/test/vmtst.ts b/web-ide-main/simulator/src/test/vmtst.ts new file mode 100644 index 0000000..b3ecfe0 --- /dev/null +++ b/web-ide-main/simulator/src/test/vmtst.ts @@ -0,0 +1,167 @@ +import { assertExists } from "@davidsouther/jiffies/lib/esm/assert.js"; +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { Result } from "@davidsouther/jiffies/lib/esm/result.js"; +import { RAM } from "../cpu/memory.js"; +import { Tst } from "../languages/tst.js"; +import { Segment } from "../languages/vm.js"; +import { Action, AsyncAction } from "../types.js"; +import { Vm } from "../vm/vm.js"; +import { fill } from "./builder.js"; +import { TestInstruction } from "./instruction.js"; +import { Test } from "./tst.js"; + +export interface VmFile { + name: string; + content: string; +} + +export class VMTest extends Test { + vm: Vm = new Vm(); + + private doLoad?: AsyncAction; + + static from( + tst: Tst, + options: { + dir?: string; + doLoad?: AsyncAction; + doEcho?: Action; + compareTo?: Action; + } = {}, + ): Result { + const test = new VMTest(options); + return fill(test, tst); + } + + constructor({ + dir, + doEcho, + doLoad, + compareTo, + }: { + dir?: string; + doEcho?: Action; + doLoad?: AsyncAction; + compareTo?: Action; + } = {}) { + super(dir, doEcho, compareTo); + this.doLoad = doLoad; + } + + using(fs: FileSystem): this { + this.fs = fs; + return this; + } + + with(vm: Vm) { + this.vm = vm; + return this; + } + + override async load(filename?: string): Promise { + if (!this.dir) return; + const dir = assertExists(this.dir?.split("/").slice(0, -1).join("/")); + const vm = await this.doLoad?.(filename ? `${dir}/${filename}` : dir); + if (vm) { + this.vm = vm; + } + } + + hasVar(variable: string | number, index?: number): boolean { + if (typeof variable !== "string") { + index = variable; + variable = "RAM"; + } + if ( + variable === "RAM" && + index !== undefined && + index > 0 && + index < RAM.SIZE + ) { + return true; + } + return [ + "argument", + "local", + "static", + "constant", + "this", + "that", + "pointer", + "temp", + ].includes(variable.toLowerCase()); + } + + getVar(variable: string | number, index?: number): number { + if (typeof variable !== "string") { + index = variable; + variable = "RAM"; + } + if (variable === "RAM" && index !== undefined) { + return this.vm.RAM.get(index); + } + return this.vm.memory.getSegment(variable as Segment, index ?? 0); + } + + getWidth(variable: string, offset?: number): number { + return 16; + } + + setVar(variable: string, value: number, index?: number): void { + if (typeof variable !== "string") { + index = variable; + variable = "RAM"; + } + if (variable === "RAM" && index !== undefined) { + this.vm.RAM.set(index, value); + return; + } + if (index !== undefined) { + this.vm.memory.setSegment(variable as Segment, index, value); + } else { + switch (variable.toLowerCase()) { + case "sp": + this.vm.memory.SP = value; + break; + case "arg": + case "argument": + this.vm.memory.ARG = value; + this.vm.segmentInitializations["argument"].initialized = true; + break; + case "lcl": + case "local": + this.vm.memory.LCL = value; + this.vm.segmentInitializations["local"].initialized = true; + break; + case "this": + this.vm.memory.THIS = value; + this.vm.invocation.thisInitialized = true; + break; + case "that": + this.vm.memory.THAT = value; + this.vm.invocation.thatInitialized = true; + break; + } + } + } + + vmstep(): void { + this.vm.step(); + } +} + +export interface VMTestInstruction extends TestInstruction { + _vmTestInstruction_: true; + do(test: VMTest): Promise; +} + +export class TestVMStepInstruction implements VMTestInstruction { + readonly _vmTestInstruction_ = true; + async do(test: VMTest) { + test.vmstep(); + } + + *steps() { + yield this; + } +} diff --git a/web-ide-main/simulator/src/testing/fill.ts b/web-ide-main/simulator/src/testing/fill.ts new file mode 100644 index 0000000..91cf608 --- /dev/null +++ b/web-ide-main/simulator/src/testing/fill.ts @@ -0,0 +1,82 @@ +import { CPU } from "../cpu/cpu.js"; +import { SCREEN_OFFSET } from "../cpu/memory.js"; + +const colorfn = () => (Math.random() * 0xffff) & 0xffff; + +export const TickScreen = (cpu: CPU) => { + let row = 0; + let col = 0; + let color = colorfn(); + return () => { + const index = SCREEN_OFFSET + col + row * 32; + cpu.RAM.set(index, color); + col += 1; + if (col >= 32) { + col = 0; + row += 1; + color = colorfn(); + if (row >= 256) { + row = 0; + } + } + }; +}; + +export const JACK = ` +R2 = 0; +while (true) { + R2 = !R2 + R0 = 32; + while (R0-->0) { + R1 = 256; + while (R1-->0) { + SCREEN[R1 * 32 + R1] = R2; + } + } +} +`; + +export const VM = ` +push constant 0 ; pop local 2 ; // R2 = 0; +label loop // while (true) { + push local 2; not; pop local 2; // R2 = !R2 + push constant 31 ; pop local 0 ; R0 = 32; + label row // while (R0-->0) { + push constant 255 ; pop local 1; // R1 = 256; + label col // while (R1-->0) { + push local 2; + push constant SCREEN ; push local 1 ; + push local 0; push constant 32; + call mul 2 ; add ; add ; + pop pointer 1; pop that 0 // SCREEN[R0 * 32 + R1] = R2; + push local 1 ; push constant 1; sub ; pop local 1; + push R1 ; if-goto col // } + push local 0 ; push constant 1; sub ; pop local 0; + push R0 ; if-goto row // } +goto loop; //} +`; + +export const ASM = ` +@R2 M=0 // R2 = 0 +(OUTER) + @R2 D=M M=!D // R2 = !R2 + @32 D=A @R0 M=D // R0 = 32 + (ROW) @R0 D=M @R3 M=D @R0 M=D-1 @ROW_END D;JEQ // while R0 --> 0 + @256 D=A @R1 M=D // R1 = 256 + (COL) @R1 D=M @R3 M=D @R1 M=D-1 @COL_END D;JEQ // while R1 --> 0 + @R5 M=0 + @32 D=A @R3 M=D // R3 = 32 + @R1 D=M @R4 M=D // R4 = R1 + (MUL) + @R3 D=M @MUL_END D;JEQ // while R3 > 0 + @R3 D=M @R5 D=D+M // R5 += R3 + @R3 M=M-1 // R3 -= 1 + @MUL 0;JMP + (MUL_END) // R5 = 32 * R1 + @R1 D=M @R5 D=M+D @SCREEN D=A+D @R3 M=D // R3 = R1 + R5 + SCREEN + @R2 D=M @R3 M=D // SCREEN + (R1 * 32 + R1) = R2; + (COL_END) + (ROW_END) +(OUTER_END) +`; +export const HACK = ``; diff --git a/web-ide-main/simulator/src/testing/mult.ts b/web-ide-main/simulator/src/testing/mult.ts new file mode 100644 index 0000000..f33b481 --- /dev/null +++ b/web-ide-main/simulator/src/testing/mult.ts @@ -0,0 +1,72 @@ +export const JACK = ` +while (R0 > 0) { + R2 = R2 + R1 + R0 = R0 - 1 +}`; + +export const VM = ` +(_loop_start) + push constant 0 + push arg 0 + eq + jump-eq _loop_end + + push arg 1 + push local 0 + add + pop local 0 + + push arg 0 + push constant 1 + sub + pop arg 0 + + jump _loop_start + +(_loop_end) + jump loop_end +`; + +export const ASM = ` +@R2 +M=0 +(LOOP) + @R0 + D=M + @END + D;JEQ + + @R1 + D=M + @R2 + D=D+M + M=D + + @R0 + M=M-1 + @LOOP + 0;JMP +(END) + @END + 0;JMP +`; + +export const HACK = new Int16Array([ + 0x0002, // @R2 + 0xda88, // M=0 + 0x0000, // (LOOP) @R0 + 0xfc10, // D=M + 0x000f, // @END + 0xd302, // D;JEQ + 0x0001, // @R1 + 0xfc10, // D=M + 0x0002, // @R2 + 0xf090, // D=D+M + 0xd308, // M=D + 0x0000, // @R0 + 0xfc88, // M=M-1 + 0x0002, // @LOOP + 0xda87, // 0;JMP + 0x000f, // (END) @END + 0xda87, // 0;JMP +]); diff --git a/web-ide-main/simulator/src/timer.ts b/web-ide-main/simulator/src/timer.ts new file mode 100644 index 0000000..d79a138 --- /dev/null +++ b/web-ide-main/simulator/src/timer.ts @@ -0,0 +1,99 @@ +import { Clock } from "./chip/clock.js"; + +export const MAX_STEPS = 1000; + +const clock = Clock.get(); + +const BUDGET = 8; // ms allowed per tick + +export abstract class Timer { + frame() { + this.tick(); + this.finishFrame(); + } + + /// Update the simulation state, but DO NOT perform any UI changes. + + // Note: This used to by synchronous for performance reasons, + // but it caused a problem where a 'ROM32k load' test instruction would not resolve before the next ones, + // causing the Computer chip to run bad instructions and fail the test script + abstract tick(): Promise; + + /// UI Updates are allowed in finishFrame. + finishFrame() { + clock.frame(); + } + + abstract reset(): void; + + abstract toggle(): void; + + _steps = 1; // How many steps to take per update + _steps_actual = 1; + get steps() { + return this._steps; + } + set steps(value: number) { + this._steps = value; + this._steps_actual = value; + } + + _speed = 60; // how often to update, in ms + get speed() { + return this._speed; + } + set speed(value: number) { + this._speed = value; + } + + get running() { + return this.#running; + } + + #running = false; + #sinceLastFrame = 0; + #lastUpdate = 0; + #run = async () => { + if (!this.#running) { + return; + } + const now = Date.now(); + const delta = now - this.#lastUpdate; + this.#lastUpdate = now; + this.#sinceLastFrame += delta; + if (this.#sinceLastFrame > this.speed) { + let done = false; + let steps = Math.min(this._steps, this._steps_actual); + + const startTime = performance.now(); + while (!done && steps-- > 0) { + done = await this.tick(); + } + const endTime = performance.now(); + + // Dynamically adjust steps to stay within BUDGET ms per update, to avoid blocking the main thread. + const duration = endTime - startTime; + this._steps_actual *= BUDGET / duration; + this._steps_actual = Math.ceil(this._steps_actual); + + this.finishFrame(); + if (done) { + this.stop(); + } + this.#sinceLastFrame -= this.speed; + } + requestAnimationFrame(this.#run); + }; + + start() { + this.#running = true; + this.#lastUpdate = Date.now() - this.speed; + this.#run(); + this.toggle(); + } + + stop() { + this.#running = false; + this.toggle(); + } +} diff --git a/web-ide-main/simulator/src/types.ts b/web-ide-main/simulator/src/types.ts new file mode 100644 index 0000000..babadae --- /dev/null +++ b/web-ide-main/simulator/src/types.ts @@ -0,0 +1,2 @@ +export type Action = (value: T) => void; +export type AsyncAction = (value: T) => Promise; diff --git a/web-ide-main/simulator/src/util/asm.test.ts b/web-ide-main/simulator/src/util/asm.test.ts new file mode 100644 index 0000000..73f5bdb --- /dev/null +++ b/web-ide-main/simulator/src/util/asm.test.ts @@ -0,0 +1,30 @@ +import { ASSIGN, COMMANDS, JUMP } from "../cpu/alu.js"; +import { asm, makeC } from "./asm.js"; + +describe("asm", () => { + it("converts int16 to asm", () => { + expect(asm(0x0000)).toBe("@0"); + expect(asm(12)).toBe("@12"); + + expect(asm(0b1110_101010_000_000)).toBe("0"); + expect(asm(0b1111_110000_010_000)).toBe("D=M"); + expect(asm(0b1110_001110_010_101)).toBe("D=D-1;JNE"); + expect(asm(0b1110_101010_000_111)).toBe("0;JMP"); + expect(asm(0b1111_110010_011_000)).toBe("MD=M-1"); + }); + + it("makes C instruction", () => { + expect( + makeC(true, COMMANDS.getOp("D"), ASSIGN.asm["M"], JUMP.asm[""]), + ).toBe(0b111_1_001100_001_000); + expect( + makeC(true, COMMANDS.getOp("D-M"), ASSIGN.asm["D"], JUMP.asm[""]), + ).toBe(0b111_1_010011_010_000); + expect( + makeC(false, COMMANDS.getOp("D"), ASSIGN.asm[""], JUMP.asm["JGT"]), + ).toBe(0b111_0_001100_000_001); + expect( + makeC(false, COMMANDS.getOp("0"), ASSIGN.asm[""], JUMP.asm["JMP"]), + ).toBe(0b111_0_101010_000_111); + }); +}); diff --git a/web-ide-main/simulator/src/util/asm.ts b/web-ide-main/simulator/src/util/asm.ts new file mode 100644 index 0000000..6371127 --- /dev/null +++ b/web-ide-main/simulator/src/util/asm.ts @@ -0,0 +1,116 @@ +import { + ASSIGN, + ASSIGN_OP, + COMMANDS, + COMMANDS_ASM, + COMMANDS_OP, + isAssignAsm, + isCommandAsm, + isJumpAsm, + JUMP, + JUMP_OP, +} from "../cpu/alu.js"; + +export type CommandOps = keyof typeof COMMANDS.op; +export type JumpOps = keyof typeof JUMP.op; +export type StoreOps = keyof typeof ASSIGN.op; + +export function asm(op: number): string { + if (op & 0x8000) { + return cInstruction(op); + } + return aInstruction(op); +} + +function cInstruction(op: number): string { + op = op & 0xffff; // Clear high order bits + const mop = (op & 0x1000) >> 12; + const cop: CommandOps = ((op & 0b0000111111000000) >> 6) as CommandOps; + const sop: StoreOps = ((op & 0b0000000000111000) >> 3) as StoreOps; + const jop: JumpOps = (op & 0b0000000000000111) as JumpOps; + + if (COMMANDS.op[cop] === undefined) { + // Invalid commend + return "#ERR"; + } + + let command = COMMANDS.op[cop]; + if (mop) { + command = command.replace(/A/g, "M") as COMMANDS_ASM; + } + + const store = ASSIGN.op[sop]; + const jump = JUMP.op[jop]; + + let instruction: string = command; + if (store) { + instruction = `${store}=${instruction}`; + } + if (jump) { + instruction = `${instruction};${jump}`; + } + + return instruction; +} + +function aInstruction(op: number): string { + return "@" + (op & 0x7fff).toString(10); +} + +export function op(asm: string): number { + if (asm[0] === "@") { + return aop(asm); + } else { + return cop(asm); + } +} + +function aop(asm: string): number { + return parseInt(asm.substring(1), 10); +} + +function cop(asm: string): number { + const firstPass = asm.match( + /(?:(?.+)=)?(.+)(?:;(?.+))?/, + ); + const { assignExists, jumpExists } = firstPass?.groups ?? {}; + + const parts = asm.match( + /(?:(?[AMD]{1,3})=)?(?[-+!01ADM&|]{1,3})(?:;(?JGT|JLT|JGE|JLE|JEQ|JMP))?/, + ); + let { assign, jump } = parts?.groups ?? {}; + const { operation } = parts?.groups ?? {}; + + assign = assign ?? (assignExists ? undefined : ""); + jump = jump ?? (jumpExists ? undefined : ""); + if ( + parts?.[0] != asm || // match is not exhaustive + !isAssignAsm(assign) || + !isJumpAsm(jump) || + !isCommandAsm(operation) + ) { + // TODO: This should return Result<> instead of throw + throw new Error("Invalid c instruction"); + } + + const mode = operation.includes("M"); + const aop = ASSIGN.asm[assign]; + const jop = JUMP.asm[jump]; + const cop = COMMANDS.getOp(operation); + + return makeC(mode, cop, aop, jop); +} + +export function makeC( + isM: boolean, + op: COMMANDS_OP, + assign: ASSIGN_OP, + jmp: JUMP_OP, +): number { + const C = 0xe000; + const A = isM ? 0x1000 : 0; + const O = op << 6; + const D = assign << 3; + const J = jmp; + return C + A + O + D + J; +} diff --git a/web-ide-main/simulator/src/util/twos.test.ts b/web-ide-main/simulator/src/util/twos.test.ts new file mode 100644 index 0000000..71d5a7e --- /dev/null +++ b/web-ide-main/simulator/src/util/twos.test.ts @@ -0,0 +1,68 @@ +import { bin, dec, hex, int2, int10, int16, nand16 } from "./twos.js"; + +describe("twos", () => { + it("formats as base 16", () => { + // expect(bin(0)).toBe("0000 0000 0000 0000"); + // expect(bin(1)).toBe("0000 0000 0000 0001"); + // expect(bin(-1)).toBe("1111 1111 1111 1111"); + // expect(bin(256)).toBe("0000 0001 0000 0000"); + expect(bin(0)).toBe("0000000000000000"); + expect(bin(1)).toBe("0000000000000001"); + expect(bin(-1)).toBe("1111111111111111"); + expect(bin(256)).toBe("0000000100000000"); + + expect(bin(6, 4)).toBe("0110"); + + expect(dec(0)).toBe("0"); + expect(dec(1)).toBe("1"); + expect(dec(-1)).toBe("-1"); + expect(dec(33413)).toBe("-32123"); + expect(dec(0x8000)).toBe("-32768"); + expect(dec(256)).toBe("256"); + + expect(hex(0)).toBe("0x0000"); + expect(hex(1)).toBe("0x0001"); + expect(hex(-1)).toBe("0xFFFF"); + expect(hex(256)).toBe("0x0100"); + }); + + it("parses to integer", () => { + expect(int2("0000000000000000")).toBe(0); + expect(int2("0000000000000001")).toBe(1); + expect(int2("1111111111111111")).toBe(65535); + expect(int2("0000000100000000")).toBe(256); + expect(int2("0000 0000 0000 0000")).toBe(0); + expect(int2("0000 0000 0000 0001")).toBe(1); + expect(int2("1111 1111 1111 1111")).toBe(65535); + expect(int2("0000 0001 0000 0000")).toBe(256); + + expect(int10("0")).toBe(0); + expect(int10("1")).toBe(1); + expect(int10("-1")).toBe(65535); + expect(int10("-32123")).toBe(33413); + expect(int10("-32768")).toBe(0x8000); + expect(int10("256")).toBe(256); + + expect(int16("0x0000")).toBe(0); + expect(int16("0x0001")).toBe(1); + expect(int16("0xffff")).toBe(65535); + expect(int16("0xFFFF")).toBe(65535); + expect(int16("0x0100")).toBe(256); + }); + + it("nands 16 bit numbers", () => { + expect(nand16(0b0, 0b0)).toBe(0b1111_1111_1111_1111); + expect(nand16(0b1, 0b0)).toBe(0b1111_1111_1111_1111); + expect(nand16(0b0, 0b1)).toBe(0b1111_1111_1111_1111); + expect(nand16(0b1, 0b1)).toBe(0b1111_1111_1111_1110); + expect(nand16(0b1010_1010_1010_1010, 0b0101_0101_0101_0101)).toBe( + 0b1111_1111_1111_1111, + ); + expect(nand16(0b1111_0000_1111_0000, 0b1111_0000_0000_1111)).toBe( + 0b0000_1111_1111_1111, + ); + expect(nand16(0b1111_1111_0000_1111_0000, 0b1111_1111_0000_0000_1111)).toBe( + 0b0000_1111_1111_1111, + ); + }); +}); diff --git a/web-ide-main/simulator/src/util/twos.ts b/web-ide-main/simulator/src/util/twos.ts new file mode 100644 index 0000000..bdd0d65 --- /dev/null +++ b/web-ide-main/simulator/src/util/twos.ts @@ -0,0 +1,129 @@ +const Hex = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "A", + "B", + "C", + "D", + "E", + "F", +]; + +export function chars(i: number): string { + return Hex[i] ?? "X"; +} + +export function bits(i: number): string { + switch (i) { + case 0x0: + return "0000"; + case 0x1: + return "0001"; + case 0x2: + return "0010"; + case 0x3: + return "0011"; + case 0x4: + return "0100"; + case 0x5: + return "0101"; + case 0x6: + return "0110"; + case 0x7: + return "0111"; + case 0x8: + return "1000"; + case 0x9: + return "1001"; + case 0xa: + return "1010"; + case 0xb: + return "1011"; + case 0xc: + return "1100"; + case 0xd: + return "1101"; + case 0xe: + return "1110"; + case 0xf: + return "1111"; + default: + return "erro"; + } +} + +export function int(n: string, radix: number): number { + const i = parseInt(n.replace(/[^\d a-f A-F +-.]/g, ""), radix); + return i & 0xffff; +} + +export function int16(i: string): number { + return int(i, 16); +} + +export function int10(i: string): number { + return int(i, 10); +} + +export function int2(i: string): number { + return int(i.replaceAll(" ", ""), 2); +} + +export function parseTwosInt(i: string): number { + if (i.toUpperCase().includes("X")) { + return int16(i); + } + return int10(i); +} + +export function hex(i: number): string { + const hu = chars((i & 0xf000) >> 12); + const hl = chars((i & 0x0f00) >> 8); + const lu = chars((i & 0x00f0) >> 4); + const ll = chars(i & 0x000f); + + return `0x${hu}${hl}${lu}${ll}`; +} + +export function bin(i: number, precision = 16): string { + const hu = bits((i & 0xf000) >> 12); + const hl = bits((i & 0x0f00) >> 8); + const lu = bits((i & 0x00f0) >> 4); + const ll = bits(i & 0x000f); + + // return `${hu} ${hl} ${lu} ${ll}`; + return `${hu}${hl}${lu}${ll}`.substring(16 - precision); // Match the book's formatting +} + +export function dec(i: number): string { + i = i & 0xffff; + if (i === 0x8000) { + return "-32768"; + } + if (i & 0x8000) { + i = (~i + 1) & 0x7fff; + return `-${i}`; + } + return `${i}`; +} + +export function unsigned(i: number): string { + i = i & 0xffff; + return `${i}`; +} + +export function nand16(a: number, b: number): number { + a = a & 0xffff; + b = b & 0xffff; + let c = ~(a & b); + c = c & 0xffff; + return c; +} diff --git a/web-ide-main/simulator/src/vm/builtins.test.ts b/web-ide-main/simulator/src/vm/builtins.test.ts new file mode 100644 index 0000000..c96d7fd --- /dev/null +++ b/web-ide-main/simulator/src/vm/builtins.test.ts @@ -0,0 +1,75 @@ +import { unwrap } from "@davidsouther/jiffies/lib/esm/result.js"; +import { Vm } from "./vm.js"; + +describe("builtins", () => { + describe("Math", () => { + test("multiply", () => { + const vm = unwrap( + Vm.build([ + { op: "push", segment: "constant", offset: 7 }, + { op: "push", segment: "constant", offset: 8 }, + { op: "call", name: "Math.multiply", nArgs: 2 }, + ]), + ); + + vm.step(); + vm.step(); + vm.step(); + expect(vm.read([0, 256])).toEqual([257, 56]); + }); + test("divide", () => { + const vm = unwrap( + Vm.build([ + { op: "push", segment: "constant", offset: 10 }, + { op: "push", segment: "constant", offset: 5 }, + { op: "call", name: "Math.divide", nArgs: 2 }, + ]), + ); + + vm.step(); + vm.step(); + vm.step(); + expect(vm.read([0, 256])).toEqual([257, 2]); + }); + test("min", () => { + const vm = unwrap( + Vm.build([ + { op: "push", segment: "constant", offset: 11 }, + { op: "push", segment: "constant", offset: 4 }, + { op: "call", name: "Math.min", nArgs: 2 }, + ]), + ); + + vm.step(); + vm.step(); + vm.step(); + expect(vm.read([0, 256])).toEqual([257, 4]); + }); + test("max", () => { + const vm = unwrap( + Vm.build([ + { op: "push", segment: "constant", offset: 11 }, + { op: "push", segment: "constant", offset: 4 }, + { op: "call", name: "Math.max", nArgs: 2 }, + ]), + ); + + vm.step(); + vm.step(); + vm.step(); + expect(vm.read([0, 256])).toEqual([257, 11]); + }); + test("sqrt", () => { + const vm = unwrap( + Vm.build([ + { op: "push", segment: "constant", offset: 36 }, + { op: "call", name: "Math.sqrt", nArgs: 1 }, + ]), + ); + + vm.step(); + vm.step(); + expect(vm.read([0, 256])).toEqual([257, 6]); + }); + }); +}); diff --git a/web-ide-main/simulator/src/vm/builtins.ts b/web-ide-main/simulator/src/vm/builtins.ts new file mode 100644 index 0000000..cd1554e --- /dev/null +++ b/web-ide-main/simulator/src/vm/builtins.ts @@ -0,0 +1,504 @@ +import { + ReturnType, + Subroutine, + SubroutineType, + Type, +} from "../languages/jack.js"; +import { VmMemory } from "./memory.js"; +import { ERRNO } from "./os/errors.js"; +import { OS } from "./os/os.js"; +import { BACKSPACE, DOUBLE_QUOTES, NEW_LINE } from "./os/string.js"; + +export type VmBuiltinFunction = (memory: VmMemory, os: OS) => number; + +export interface VmBuiltin { + func: VmBuiltinFunction; + type: SubroutineType; + args: Type[]; + returnType: ReturnType; +} + +function getArgs(memory: VmMemory, n: number) { + const args = []; + for (let i = 0; i < n; i++) { + args.push(memory.get(memory.SP - n + i)); + } + return args; +} + +export function overridesOsCorrectly(cls: string, subroutine: Subroutine) { + const builtin = VM_BUILTINS[`${cls}.${subroutine.name.value}`]; + + return ( + builtin && + builtin.args.length == subroutine.parameters.length && + builtin.args.every( + (arg, index) => arg == subroutine.parameters[index].type.value, + ) && + builtin.returnType == subroutine.returnType.value + ); +} + +export function makeInterface(name: string, builtin: VmBuiltin) { + return `${builtin.returnType} ${name}(${builtin.args.join(",")}`; +} + +export const VM_BUILTINS: Record = { + "Math.init": { + func: (_, __) => 0, + args: [], + returnType: "void", + type: "function", + }, + "Math.multiply": { + func: (memory, _) => { + const [a, b] = getArgs(memory, 2); + return (a * b) & 0xffff; + }, + args: ["int", "int"], + returnType: "int", + type: "function", + }, + "Math.divide": { + func: (memory, os) => { + const [a, b] = getArgs(memory, 2); + if (b == 0) { + os.sys.error(ERRNO.DIVIDE_BY_ZERO); + return 0; + } + return Math.floor(a / b) & 0xffff; + }, + args: ["int", "int"], + returnType: "int", + type: "function", + }, + "Math.min": { + func: (memory, _) => { + const [a, b] = getArgs(memory, 2); + return Math.min(a, b) & 0xffff; + }, + args: ["int", "int"], + returnType: "int", + type: "function", + }, + "Math.max": { + func: (memory, _) => { + const [a, b] = getArgs(memory, 2); + return Math.max(a, b) & 0xffff; + }, + args: ["int", "int"], + returnType: "int", + type: "function", + }, + "Math.sqrt": { + func: (memory, os) => { + const [x] = getArgs(memory, 1); + if (x < 0) { + os.sys.error(ERRNO.SQRT_NEG); + return 0; + } + return Math.floor(Math.sqrt(x)) & 0xffff; + }, + args: ["int"], + returnType: "int", + type: "function", + }, + "Math.abs": { + func: (memory, _) => { + const [x] = getArgs(memory, 1); + return Math.abs(x) & 0xffff; + }, + args: ["int"], + returnType: "int", + type: "function", + }, + "Screen.init": { + func: (_, __) => 0, + args: [], + returnType: "void", + type: "function", + }, + "Screen.clearScreen": { + func: (_, os) => { + os.screen.clear(); + return 0; + }, + args: [], + returnType: "void", + type: "function", + }, + "Screen.setColor": { + func: (memory, os) => { + const [color] = getArgs(memory, 1); + os.screen.color = color !== 0; + return 0; + }, + args: ["boolean"], + returnType: "void", + type: "function", + }, + "Screen.drawPixel": { + func: (memory, os) => { + const [x, y] = getArgs(memory, 2); + os.screen.drawPixel(x, y); + return 0; + }, + args: ["int", "int"], + returnType: "void", + type: "function", + }, + "Screen.drawLine": { + func: (memory, os) => { + const [x1, y1, x2, y2] = getArgs(memory, 4); + os.screen.drawLine(x1, y1, x2, y2); + return 0; + }, + args: ["int", "int", "int", "int"], + returnType: "void", + type: "function", + }, + "Screen.drawRectangle": { + func: (memory, os) => { + const [x1, y1, x2, y2] = getArgs(memory, 4); + os.screen.drawRect(x1, y1, x2, y2); + return 0; + }, + args: ["int", "int", "int", "int"], + returnType: "void", + type: "function", + }, + "Screen.drawCircle": { + func: (memory, os) => { + const [x, y, r] = getArgs(memory, 3); + os.screen.drawCircle(x, y, r); + return 0; + }, + args: ["int", "int", "int"], + returnType: "void", + type: "function", + }, + "Memory.init": { + func: (_, __) => 0, + args: [], + returnType: "void", + type: "function", + }, + "Memory.peek": { + func: (memory, _) => { + const [address] = getArgs(memory, 1); + return memory.get(address); + }, + args: ["int"], + returnType: "int", + type: "function", + }, + "Memory.poke": { + func: (memory, _) => { + const [address, value] = getArgs(memory, 2); + memory.set(address, value); + return 0; + }, + args: ["int", "int"], + returnType: "void", + type: "function", + }, + "Memory.alloc": { + func: (memory, os) => { + const [size] = getArgs(memory, 1); + return os.memory.alloc(size); + }, + args: ["int"], + returnType: "Array", + type: "function", + }, + "Memory.deAlloc": { + func: (memory, os) => { + const [address] = getArgs(memory, 1); + os.memory.deAlloc(address); + return 0; + }, + args: ["Array"], + returnType: "void", + type: "function", + }, + "Array.init": { + func: (_, __) => 0, + args: [], + returnType: "void", + type: "function", + }, + "Array.new": { + func: (memory, os) => { + const [size] = getArgs(memory, 1); + if (size <= 0) { + os.sys.error(ERRNO.ARRAY_SIZE_NOT_POSITIVE); + return 0; + } + return os.memory.alloc(size); + }, + args: ["int"], + returnType: "Array", + type: "constructor", + }, + "Array.dispose": { + func: (memory, os) => { + const [pointer] = getArgs(memory, 1); + os.memory.deAlloc(pointer); + return 0; + }, + args: [], + returnType: "void", + type: "method", + }, + "String.init": { + func: (_, __) => 0, + args: [], + returnType: "void", + type: "function", + }, + "String.new": { + func: (memory, os) => { + const [length] = getArgs(memory, 1); + return os.string.new(length); + }, + args: ["int"], + returnType: "String", + type: "constructor", + }, + "String.dispose": { + func: (memory, os) => { + const [pointer] = getArgs(memory, 1); + os.string.dispose(pointer); + return 0; + }, + args: [], + returnType: "void", + type: "method", + }, + "String.length": { + func: (memory, os) => { + const [pointer] = getArgs(memory, 1); + return os.string.length(pointer); + }, + args: [], + returnType: "int", + type: "method", + }, + "String.charAt": { + func: (memory, os) => { + const [pointer, index] = getArgs(memory, 2); + return os.string.charAt(pointer, index); + }, + args: ["int"], + returnType: "char", + type: "method", + }, + "String.setCharAt": { + func: (memory, os) => { + const [pointer, index, value] = getArgs(memory, 3); + os.string.setCharAt(pointer, index, value); + return 0; + }, + args: ["int", "char"], + returnType: "void", + type: "method", + }, + "String.appendChar": { + func: (memory, os) => { + const [pointer, value] = getArgs(memory, 2); + return os.string.appendChar(pointer, value); + }, + args: ["char"], + returnType: "String", + type: "method", + }, + "String.eraseLastChar": { + func: (memory, os) => { + const [pointer] = getArgs(memory, 1); + os.string.eraseLastChar(pointer); + return 0; + }, + args: [], + returnType: "void", + type: "method", + }, + "String.intValue": { + func: (memory, os) => { + const [pointer] = getArgs(memory, 1); + return os.string.intValue(pointer); + }, + args: [], + returnType: "int", + type: "method", + }, + "String.setInt": { + func: (memory, os) => { + const [pointer, value] = getArgs(memory, 2); + os.string.setInt(pointer, value); + return 0; + }, + args: ["int"], + returnType: "void", + type: "method", + }, + "String.backSpace": { + func: (_, __) => { + return BACKSPACE; + }, + args: [], + returnType: "char", + type: "function", + }, + "String.doubleQuote": { + func: (_, __) => { + return DOUBLE_QUOTES; + }, + args: [], + returnType: "char", + type: "function", + }, + "String.newLine": { + func: (_, __) => { + return NEW_LINE; + }, + args: [], + returnType: "char", + type: "function", + }, + "Output.init": { + func: (_, __) => 0, + args: [], + returnType: "void", + type: "function", + }, + "Output.moveCursor": { + func: (memory, os) => { + const [i, j] = getArgs(memory, 2); + os.output.moveCursor(i, j); + return 0; + }, + args: ["int", "int"], + returnType: "void", + type: "function", + }, + "Output.printChar": { + func: (memory, os) => { + const [code] = getArgs(memory, 1); + os.output.printChar(code); + return 0; + }, + args: ["char"], + returnType: "void", + type: "function", + }, + "Output.printString": { + func: (memory, os) => { + const [pointer] = getArgs(memory, 1); + os.output.printString(pointer); + return 0; + }, + args: ["String"], + returnType: "void", + type: "function", + }, + "Output.printInt": { + func: (memory, os) => { + const [value] = getArgs(memory, 1); + os.output.printInt(value); + return 0; + }, + args: ["int"], + returnType: "void", + type: "function", + }, + "Output.println": { + func: (_, os) => { + os.output.println(); + return 0; + }, + args: [], + returnType: "void", + type: "function", + }, + "Output.backSpace": { + func: (_, os) => { + os.output.backspace(); + return 0; + }, + args: [], + returnType: "void", + type: "function", + }, + "Keyboard.init": { + func: (_, __) => 0, + args: [], + returnType: "void", + type: "function", + }, + "Keyboard.keyPressed": { + func: (_, os) => { + return os.keyboard.keyPressed(); + }, + args: [], + returnType: "char", + type: "function", + }, + "Keyboard.readChar": { + func: (_, os) => { + os.keyboard.readChar(); + return 0; + }, + args: [], + returnType: "char", + type: "function", + }, + "Keyboard.readLine": { + func: (memory, os) => { + const [message] = getArgs(memory, 1); + os.keyboard.readLine(message); + return 0; + }, + args: ["String"], + returnType: "String", + type: "function", + }, + "Keyboard.readInt": { + func: (memory, os) => { + const [message] = getArgs(memory, 1); + os.keyboard.readInt(message); + return 0; + }, + args: ["String"], + returnType: "int", + type: "function", + }, + "Sys.halt": { + func: (_, os) => { + os.sys.halt(); + return 0; + }, + args: [], + returnType: "void", + type: "function", + }, + "Sys.error": { + func: (memory, os) => { + const [code] = getArgs(memory, 1); + os.sys.error(code); + return 0; + }, + args: ["int"], + returnType: "void", + type: "function", + }, + "Sys.wait": { + func: (memory, os) => { + const [ms] = getArgs(memory, 1); + os.sys.wait(ms); + return 0; + }, + args: ["int"], + returnType: "void", + type: "function", + }, +}; diff --git a/web-ide-main/simulator/src/vm/memory.ts b/web-ide-main/simulator/src/vm/memory.ts new file mode 100644 index 0000000..e983a04 --- /dev/null +++ b/web-ide-main/simulator/src/vm/memory.ts @@ -0,0 +1,263 @@ +import { + Err, + isErr, + Ok, + Result, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import { RAM } from "../cpu/memory.js"; +import { Segment } from "../languages/vm.js"; +import { VmFrame } from "./vm.js"; + +export const SP = 0; +export const LCL = 1; +export const ARG = 2; +export const THIS = 3; +export const THAT = 4; +export const TEMP = 5; +export const STATIC = 16; + +export class VmMemory extends RAM { + strict = true; + get SP(): number { + return this.get(SP); + } + set SP(value: number) { + this.set(SP, value); + } + get LCL(): number { + return this.get(LCL); + } + set LCL(value: number) { + this.set(LCL, value); + } + get ARG(): number { + return this.get(ARG); + } + set ARG(value: number) { + this.set(ARG, value); + } + get THIS(): number { + return this.get(THIS); + } + set THIS(value: number) { + this.set(THIS, value); + } + get THAT(): number { + return this.get(THAT); + } + set THAT(value: number) { + this.set(THAT, value); + } + + get statics() { + const statics = []; + for (let i = 16; i < 256; i++) { + statics.push(this.get(i)); + } + return statics; + } + + constructor() { + super(); + this.set(SP, 256); + } + + baseSegment(segment: Segment, offset: number): Result { + if (this.strict && (offset < 0 || offset > 32767)) + return Err( + new Error( + `Illegal offset value ${offset} (must be between 0 and 32767)`, + ), + ); + switch (segment) { + case "argument": + return Ok(this.ARG + offset); + case "constant": + return Ok(offset); + case "local": + return Ok(this.LCL + offset); + case "pointer": + if (this.strict && offset > 1) + throw new Error( + `pointer out of bounds access (pointer can be 0 for this, 1 for that, but got ${offset}`, + ); + return Ok(offset === 0 ? THIS : THAT); + case "static": + if (this.strict && offset > 255 - 16) + return Err(new Error(`Cannot access statics beyond 239: ${offset}`)); + return Ok(16 + offset); + case "temp": + if (this.strict && offset > 7) + return Err( + new Error( + `Temp out of bounds access (temp can be 0 to 7, but got ${offset}`, + ), + ); + return Ok(5 + offset); + case "that": + return Ok(this.THAT + offset); + case "this": + return Ok(this.THIS + offset); + } + } + + getSegment(segment: Segment, offset: number): number { + if (segment === "constant") { + if (this.strict && (offset < 0 || offset > 32767)) + throw new Error( + `Illegal offset value ${offset} (must be between 0 and 32767)`, + ); + return offset; + } + const base = this.baseSegment(segment, offset); + if (isErr(base)) { + throw Err(base); + } + return this.get(Ok(base)); + } + setSegment(segment: Segment, offset: number, value: number) { + const base = this.baseSegment(segment, offset); + if (isErr(base)) { + throw Err(base); + } + this.set(Ok(base), value); + } + + argument(offset: number): number { + return this.getSegment("argument", offset); + } + local(offset: number): number { + return this.getSegment("local", offset); + } + static(offset: number): number { + return this.getSegment("static", offset); + } + constant(offset: number): number { + return this.getSegment("constant", offset); + } + this(offset: number): number { + return this.getSegment("this", offset); + } + that(offset: number): number { + return this.getSegment("that", offset); + } + pointer(offset: number): number { + return this.getSegment("pointer", offset); + } + temp(offset: number): number { + return this.getSegment("temp", offset); + } + + push(value: number) { + const sp = this.SP; + this.set(sp, value); + this.set(0, sp + 1); + } + pop(): number { + if (this.strict && this.SP === 256) + throw new Error(`Cannot pop the stack below 256 in strict mode`); + this.set(0, this.SP - 1); + const value = this.get(this.SP); + return value; + } + // Stack frame, from figure 8.3, is: + // [ARG] Arg0 Arg1... RET LCL ARG THIS THAT [LCL] Local0 Local1... [SP] + pushFrame(ret: number, nArgs: number, nLocals: number): number { + const base = this.SP; + const arg = base - nArgs; + this.set(base, ret); + this.set(base + 1, this.LCL); + this.set(base + 2, this.ARG); + this.set(base + 3, this.THIS); + this.set(base + 4, this.THAT); + + this.set(ARG, arg); + this.set(LCL, base + 5); + + const sp = base + 5; + // Technically this happens in the function, but the VM will handle it for free + for (let i = 0; i < nLocals; i++) { + this.set(sp + i, 0); + } + this.set(SP, sp + nLocals); + return base; + } + + popFrame(): number { + const frame = this.LCL; + const ret = this.get(frame - 5); + const value = this.pop(); + this.set(this.ARG, value); + this.set(SP, this.ARG + 1); + this.set(THAT, this.get(frame - 1)); + this.set(THIS, this.get(frame - 2)); + this.set(ARG, this.get(frame - 3)); + this.set(LCL, this.get(frame - 4)); + return ret; + } + + getFrame( + base: number, // The address of the frame, the RET address + argN: number, // The number of arguments to this frame + localN: number, // The number of locals in this frame + thisN: number, // The number of items in `this` + thatN: number, // the number of items in `that` + nextFrame: number, + ): VmFrame { + const arg = base - argN; + const lcl = base + 5; + const stk = lcl + localN; + const stackN = nextFrame - stk; + const args = [...this.map((_, v) => v, arg, arg + argN)]; + const locals = [...this.map((_, v) => v, lcl, lcl + localN)]; + const stack = [...this.map((_, v) => v, stk, stk + stackN)]; + const this_ = [...this.map((_, v) => v, this.THIS, this.THIS + thisN)]; + const that = [...this.map((_, v) => v, this.THAT, this.THAT + thatN)]; + return { + args: { base: arg, count: argN, values: args }, + locals: { base: lcl, count: localN, values: locals }, + stack: { base: stk, count: stackN, values: stack }, + this: { base: stk, count: thisN, values: this_ }, + that: { base: stk, count: thatN, values: that }, + frame: { + RET: this.get(base), + LCL: this.LCL, + ARG: this.ARG, + THIS: this.THIS, + THAT: this.THAT, + }, + }; + } + + getVmState(staticN = 240) { + const temps = [...this.map((_, v) => v, 5, 13)]; + const internal = [...this.map((_, v) => v, 13, 16)]; + const statics = [...this.map((_, v) => v, 16, 16 + staticN)]; + return { + ["0: SP"]: this.SP, + ["1: LCL"]: this.LCL, + ["2: ARG"]: this.ARG, + ["3: THIS"]: this.THIS, + ["4: THAT"]: this.THAT, + temps, + internal, + static: statics, + }; + } + + binOp(fn: (a: number, b: number) => number) { + const a = this.get(this.SP - 2); + const b = this.get(this.SP - 1); + const v = fn(a, b) & 0xffff; + this.set(this.SP - 2, v); + this.set(SP, this.SP - 1); + } + unOp(fn: (a: number) => number) { + const a = this.get(this.SP - 1); + const v = fn(a) & 0xffff; + this.set(this.SP - 1, v); + } + comp(fn: (a: number, b: number) => boolean) { + this.binOp((a, b) => (fn(a, b) ? -1 : 0)); + } +} diff --git a/web-ide-main/simulator/src/vm/os/errors.ts b/web-ide-main/simulator/src/vm/os/errors.ts new file mode 100644 index 0000000..9f2aec7 --- /dev/null +++ b/web-ide-main/simulator/src/vm/os/errors.ts @@ -0,0 +1,24 @@ +export enum ERRNO { + SYS_WAIT_DURATION_NOT_POSITIVE = 1, + ARRAY_SIZE_NOT_POSITIVE = 2, + DIVIDE_BY_ZERO = 3, + SQRT_NEG = 4, + ALLOC_SIZE_NOT_POSITIVE = 5, + HEAP_OVERFLOW = 6, + ILLEGAL_PIXEL_COORD = 7, + ILLEGAL_LINE_COORD = 8, + ILLEGAL_RECT_COORD = 9, + ILLEGAL_CENTER_COORD = 12, + ILLEGAL_RADIUS = 13, + STRING_LENGTH_NEG = 14, + GET_CHAR_INDEX_OUT_OF_BOUNDS = 15, + SET_CHAR_INDEX_OUT_OF_BOUNDS = 16, + STRING_FULL = 17, + STRING_EMPTY = 18, + STRING_INSUFFICIENT_CAPACITY = 19, + ILLEGAL_CURSOR_LOCATION = 20, +} + +export function isSysError(errno: number): errno is ERRNO { + return Object.values(ERRNO).includes(errno as ERRNO); +} diff --git a/web-ide-main/simulator/src/vm/os/font.ts b/web-ide-main/simulator/src/vm/os/font.ts new file mode 100644 index 0000000..d50cf52 --- /dev/null +++ b/web-ide-main/simulator/src/vm/os/font.ts @@ -0,0 +1,1251 @@ +export const CHARACTER_NUM = 126; +export const FONT = createFont(); + +/* Character bitmaps are 8x11 boolean pixel values. See Fig 12.9. */ +type Bitmap = boolean[][]; + +function createBitmap(rows: string[]): Bitmap { + return rows.map((row) => row.split("").map((c) => c == "โ–ˆ")); +} + +export function createFont(): Bitmap[] { + const font: Bitmap[] = new Array(CHARACTER_NUM); + + font[32] = createBitmap([ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + ]); // + font[33] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // ! + font[34] = createBitmap([ + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆ โ–ˆ ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + ]); // " + font[35] = createBitmap([ + " ", + " โ–ˆ โ–ˆ ", + " โ–ˆ โ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆ โ–ˆ ", + " โ–ˆ โ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆ โ–ˆ ", + " โ–ˆ โ–ˆ ", + " ", + " ", + ]); // # + font[36] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + ]); // $ + font[37] = createBitmap([ + " ", + " ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // % + font[38] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // & + font[39] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + ]); // ' + font[40] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // ( + font[41] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // ) + font[42] = createBitmap([ + " ", + " ", + " ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + " ", + ]); // * + font[43] = createBitmap([ + " ", + " ", + " ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + " ", + ]); // + + font[44] = createBitmap([ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + ]); // , + font[45] = createBitmap([ + " ", + " ", + " ", + " ", + " ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + " ", + " ", + " ", + ]); // - + font[46] = createBitmap([ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // . + font[47] = createBitmap([ + " ", + " ", + " โ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆ ", + " ", + " ", + ]); // / + font[48] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // 0 + font[49] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // 1 + font[50] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // 2 + font[51] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // 3 + font[52] = createBitmap([ + " โ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆ โ–ˆโ–ˆ ", + "โ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // 4 + font[53] = createBitmap([ + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // 5 + font[54] = createBitmap([ + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // 6 + font[55] = createBitmap([ + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // 7 + font[56] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // 8 + font[57] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // 9 + font[58] = createBitmap([ + " ", + " ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + " ", + ]); // : + font[59] = createBitmap([ + " ", + " ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // ; + font[60] = createBitmap([ + " ", + " ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // < + font[61] = createBitmap([ + " ", + " ", + " ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + " ", + " ", + ]); // = + font[62] = createBitmap([ + " ", + " ", + "โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + " ", + " ", + ]); // > + font[64] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // @ + font[63] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // ? + font[65] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // A + font[66] = createBitmap([ + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // B + font[67] = createBitmap([ + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // C + font[68] = createBitmap([ + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // D + font[69] = createBitmap([ + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // E + font[70] = createBitmap([ + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + " ", + " ", + ]); // F + font[71] = createBitmap([ + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆ ", + " ", + " ", + ]); // G + font[72] = createBitmap([ + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // H + font[73] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // I + font[74] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // J + font[75] = createBitmap([ + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // K + font[76] = createBitmap([ + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // L + font[77] = createBitmap([ + "โ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // M + font[78] = createBitmap([ + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // N + font[79] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // O + font[80] = createBitmap([ + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + " ", + " ", + ]); // P + font[81] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + ]); // Q + font[82] = createBitmap([ + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // R + font[83] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // S + font[84] = createBitmap([ + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆ โ–ˆโ–ˆ โ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // T + font[85] = createBitmap([ + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // U + font[86] = createBitmap([ + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // V + font[87] = createBitmap([ + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆ โ–ˆ ", + " ", + " ", + ]); // W + font[88] = createBitmap([ + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // X + font[89] = createBitmap([ + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // Y + font[90] = createBitmap([ + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // Z + font[91] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // [ + font[92] = createBitmap([ + " ", + " ", + "โ–ˆ ", + "โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆ ", + " ", + " ", + ]); // \ + font[93] = createBitmap([ + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // ] + font[94] = createBitmap([ + " โ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + ]); // ^ + font[95] = createBitmap([ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + ]); // _ + font[96] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + ]); // ` + font[97] = createBitmap([ + " ", + " ", + " ", + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // a + font[98] = createBitmap([ + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // b + font[99] = createBitmap([ + " ", + " ", + " ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // c + font[100] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // d + font[101] = createBitmap([ + " ", + " ", + " ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // e + font[102] = createBitmap([ + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // f + font[103] = createBitmap([ + " ", + " ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + ]); // g + font[104] = createBitmap([ + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // h + font[105] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // i + font[106] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + ]); // j + font[107] = createBitmap([ + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // k + font[108] = createBitmap([ + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // l + font[109] = createBitmap([ + " ", + " ", + " ", + "โ–ˆ โ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ โ–ˆ ", + "โ–ˆโ–ˆ โ–ˆ โ–ˆ ", + " ", + " ", + ]); // m + font[110] = createBitmap([ + " ", + " ", + " ", + "โ–ˆ โ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // n + font[111] = createBitmap([ + " ", + " ", + " ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // o + font[112] = createBitmap([ + " ", + " ", + " ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + " ", + ]); // p + font[113] = createBitmap([ + " ", + " ", + " ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + ]); // q + font[114] = createBitmap([ + " ", + " ", + " ", + "โ–ˆ โ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // r + font[115] = createBitmap([ + " ", + " ", + " ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // s + font[116] = createBitmap([ + " โ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // t + font[117] = createBitmap([ + " ", + " ", + " ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // u + font[118] = createBitmap([ + " ", + " ", + " ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // v + font[119] = createBitmap([ + " ", + " ", + " ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆ โ–ˆ ", + " ", + " ", + ]); // w + font[120] = createBitmap([ + " ", + " ", + " ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + ]); // x + font[121] = createBitmap([ + " ", + " ", + " ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + ]); // y + font[122] = createBitmap([ + " ", + " ", + " ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆ โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // z + font[123] = createBitmap([ + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // { + font[124] = createBitmap([ + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " ", + " ", + ]); // | + font[125] = createBitmap([ + "โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + " โ–ˆโ–ˆ ", + "โ–ˆโ–ˆโ–ˆ ", + " ", + " ", + ]); // } + font[126] = createBitmap([ + " โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆ โ–ˆโ–ˆ โ–ˆ ", + "โ–ˆ โ–ˆโ–ˆ ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + ]); // ~ + + return font; +} diff --git a/web-ide-main/simulator/src/vm/os/keyboard.ts b/web-ide-main/simulator/src/vm/os/keyboard.ts new file mode 100644 index 0000000..76fcb90 --- /dev/null +++ b/web-ide-main/simulator/src/vm/os/keyboard.ts @@ -0,0 +1,151 @@ +import { KEYBOARD_OFFSET } from "../../cpu/memory.js"; +import { VmMemory } from "../memory.js"; +import { OS } from "./os.js"; +import { BACKSPACE, NEW_LINE } from "./string.js"; + +export class KeyboardLib { + private memory: VmMemory; + private os: OS; + private animationFrameId: number | undefined = undefined; + private cancel = false; + + constructor(memory: VmMemory, os: OS) { + this.memory = memory; + this.os = os; + } + + keyPressed() { + return this.memory.get(KEYBOARD_OFFSET); + } + + private readCharLoop(resolve: (value: number) => void) { + let pressed = false; + let c = 0; + + const loop = () => { + if (this.cancel) { + return; + } + + let exit = false; + + if (!this.os.paused) { + if (!pressed && this.keyPressed() !== 0) { + pressed = true; + c = this.keyPressed(); + } + if (pressed && this.keyPressed() === 0) { + exit = true; + resolve(c); + } + } + + if (!exit) { + this.animationFrameId = requestAnimationFrame(loop); + } + }; + + loop(); + } + + readChar() { + this.os.sys.block(); + this.os.output.drawCursor(); + + new Promise((resolve) => { + this.readCharLoop(resolve); + }).then((c) => { + this.os.output.printChar(c); + this.os.sys.release(c); + }); + } + + private readLineLoop(resolve: (value: number) => void) { + const str = this.os.string.new(100); + if (this.os.sys.halted) { + resolve(0); + } + let pressed = false; + let c = 0; + + const loop = () => { + if (this.cancel) { + return; + } + + let exit = false; + + if (!this.os.paused) { + if (!pressed && this.keyPressed() != 0) { + pressed = true; + c = this.keyPressed(); + } + if (pressed && this.keyPressed() == 0) { + pressed = false; + // key was released + if (c == BACKSPACE) { + if (this.os.string.length(str) > 0) { + this.os.output.backspace(); + } + this.os.string.eraseLastChar(str); + } else if (c == NEW_LINE) { + resolve(str); + exit = true; + } else { + this.os.string.appendChar(str, c); + if (this.os.sys.halted) { + resolve(0); + } + this.os.output.printChar(c); + this.os.output.drawCursor(); + } + } + } + + if (!exit) { + this.animationFrameId = requestAnimationFrame(loop); + } + }; + + loop(); + } + + readLine(messagePointer: number) { + this.os.sys.block(); + this.os.output.printString(messagePointer); + this.os.output.drawCursor(); + + new Promise((resolve) => { + this.readLineLoop(resolve); + }).then((str) => { + if (!this.os.sys.halted) { + this.os.output.clearChar(); + this.os.output.println(); + } + this.os.sys.release(str); + }); + } + + readInt(messagePointer: number) { + this.os.sys.block(); + this.os.output.printString(messagePointer); + this.os.output.drawCursor(); + + new Promise((resolve) => { + this.readLineLoop(resolve); + }).then((str) => { + if (!this.os.sys.halted) { + this.os.output.clearChar(); + this.os.output.println(); + } + this.os.sys.release(this.os.string.intValue(str)); + }); + } + + dispose() { + this.cancel = true; + if (this.animationFrameId) { + cancelAnimationFrame(this.animationFrameId); + } + } +} diff --git a/web-ide-main/simulator/src/vm/os/memory.ts b/web-ide-main/simulator/src/vm/os/memory.ts new file mode 100644 index 0000000..9d81061 --- /dev/null +++ b/web-ide-main/simulator/src/vm/os/memory.ts @@ -0,0 +1,69 @@ +import { VmMemory } from "../memory.js"; +import { ERRNO } from "./errors.js"; +import { OS } from "./os.js"; + +const HEAP_BASE = 2048; +const HEAP_SIZE = 14334; + +export class MemoryLib { + private memory: VmMemory; + private os: OS; + private freeListPtr: number; + + public constructor(memory: VmMemory, os: OS) { + this.memory = memory; + this.os = os; + this.freeListPtr = HEAP_BASE; + this.memory.set(HEAP_BASE, 0); + this.memory.set(HEAP_BASE + 1, HEAP_SIZE); + } + + alloc(size: number): number { + if (size <= 0) { + this.os.sys.error(ERRNO.ARRAY_SIZE_NOT_POSITIVE); + return 0; + } + + let blockPtr = this.freeListPtr; + do { + const nextFreeList = this.memory.get(blockPtr); + const blockSize = this.memory.get(blockPtr + 1); + if (blockSize >= size + 2) { + // We can fit this required size and overhead in this block. + this.memory.set(blockPtr + 1, size); + + const newBlockPtr = blockPtr + 2 + size; + const newBlockSize = blockSize - size - 2; + this.memory.set(newBlockPtr, nextFreeList); + this.memory.set(newBlockPtr + 1, newBlockSize); + if (this.freeListPtr === blockPtr) { + // Move freelist pointer to the new block. + this.freeListPtr = newBlockPtr; + } + return blockPtr + 2; + } else { + // We can't fit this required size and overhead in this block. + blockPtr = nextFreeList; + } + } while (blockPtr !== 0); + + this.os.sys.error(ERRNO.HEAP_OVERFLOW); + return 0; + } + + deAlloc(address: number) { + const deallocBlockPtr = address - 2; + // This will be the last block in the free list. + this.memory.set(deallocBlockPtr, 0); + + let blockPtr = this.freeListPtr; + do { + const nextBlockPtr = this.memory.get(blockPtr); + if (nextBlockPtr === 0) { + this.memory.set(blockPtr, deallocBlockPtr); + return; + } + blockPtr = nextBlockPtr; + } while (blockPtr !== 0); + } +} diff --git a/web-ide-main/simulator/src/vm/os/os.ts b/web-ide-main/simulator/src/vm/os/os.ts new file mode 100644 index 0000000..e6ebaa8 --- /dev/null +++ b/web-ide-main/simulator/src/vm/os/os.ts @@ -0,0 +1,34 @@ +import { VmMemory } from "../memory.js"; +import { KeyboardLib } from "./keyboard.js"; +import { MemoryLib } from "./memory.js"; +import { OutputLib } from "./output.js"; +import { ScreenLib } from "./screen.js"; +import { StringLib } from "./string.js"; +import { SysLib } from "./sys.js"; + +export class OS { + private vmMemory: VmMemory; + screen: ScreenLib; + memory: MemoryLib; + string: StringLib; + output: OutputLib; + keyboard: KeyboardLib; + sys: SysLib; + + paused = false; + + constructor(memory: VmMemory) { + this.vmMemory = memory; + this.screen = new ScreenLib(this.vmMemory, this); + this.memory = new MemoryLib(this.vmMemory, this); + this.string = new StringLib(this.vmMemory, this); + this.output = new OutputLib(this); + this.keyboard = new KeyboardLib(this.vmMemory, this); + this.sys = new SysLib(this); + } + + dispose() { + this.keyboard.dispose(); + this.sys.dispose(); + } +} diff --git a/web-ide-main/simulator/src/vm/os/output.ts b/web-ide-main/simulator/src/vm/os/output.ts new file mode 100644 index 0000000..d3157b1 --- /dev/null +++ b/web-ide-main/simulator/src/vm/os/output.ts @@ -0,0 +1,119 @@ +import { ERRNO } from "./errors.js"; +import { FONT } from "./font.js"; +import { OS } from "./os.js"; +import { BLACK, Color, WHITE } from "./screen.js"; +import { intToCharArray } from "./string.js"; + +const MAX_WIDTH = 64; +const MAX_HEIGHT = 22; + +export class OutputLib { + private os: OS; + + private col = 0; + private row = 0; + private lastColor = false; + + constructor(os: OS) { + this.os = os; + } + + private setColor(color: Color) { + this.lastColor = this.os.screen.color; + this.os.screen.color = color; + } + + private restoreColor() { + this.os.screen.color = this.lastColor; + } + + clearChar() { + this.setColor(WHITE); + this.os.screen.drawRect( + this.col * 8, + this.row * 11, + (this.col + 1) * 8, + (this.row + 1) * 11, + ); + this.restoreColor(); + } + + moveCursor(i: number, j: number) { + if (i < 0 || i > MAX_HEIGHT || j < 0 || j > MAX_WIDTH) { + this.os.sys.error(ERRNO.ILLEGAL_CURSOR_LOCATION); + return; + } + this.row = i; + this.col = j; + this.drawCursor(); + } + + println() { + this.row = this.row == MAX_HEIGHT ? 0 : this.row + 1; + this.col = 0; + } + + drawCursor() { + this.clearChar(); + this.setColor(BLACK); + this.os.screen.drawRect( + this.col * 8 + 2, + this.row * 11 + 2, + (this.col + 1) * 8 - 2, + (this.row + 1) * 11 - 2, + ); + this.restoreColor(); + } + + printChar(code: number) { + const bitmap = FONT[code]; + if (bitmap) { + this.clearChar(); + this.setColor(BLACK); + for (let row = 0; row < bitmap.length; row++) { + for (let col = 0; col < bitmap[row].length; col++) { + if (bitmap[row][col]) { + this.os.screen.drawPixel(this.col * 8 + col, this.row * 11 + row); + } + } + } + this.restoreColor(); + } + + this.col += 1; + if (this.col == MAX_WIDTH) { + this.println(); + } + } + + printString(pointer: number) { + for (let i = 0; i < this.os.string.length(pointer); i++) { + this.printChar(this.os.string.charAt(pointer, i)); + } + } + + printJsString(str: string) { + for (const char of str) { + this.printChar(char.charCodeAt(0)); + } + } + + printInt(value: number) { + for (const c of intToCharArray(value)) { + this.printChar(c); + } + } + + backspace() { + this.clearChar(); + this.col -= 1; + if (this.col < 0) { + this.col = 0; + this.row -= 1; + if (this.row < 0) { + this.row = 0; + } + } + this.drawCursor(); + } +} diff --git a/web-ide-main/simulator/src/vm/os/screen.ts b/web-ide-main/simulator/src/vm/os/screen.ts new file mode 100644 index 0000000..10999ae --- /dev/null +++ b/web-ide-main/simulator/src/vm/os/screen.ts @@ -0,0 +1,127 @@ +import { SCREEN_COLS, SCREEN_ROWS, SCREEN_SIZE } from "../../cpu/memory.js"; +import { VmMemory } from "../memory.js"; +import { ERRNO } from "./errors.js"; +import { OS } from "./os.js"; + +const BLANK_SCREEN = new Array(SCREEN_SIZE).fill(0); +const MAX_R = 181; + +export type Color = boolean; +export const BLACK: Color = true; +export const WHITE: Color = false; + +export class ScreenLib { + private memory: VmMemory; + private os: OS; + + color: Color = BLACK; + + constructor(memory: VmMemory, os: OS) { + this.memory = memory; + this.os = os; + } + + clear() { + this.memory.screen.loadBytes(BLANK_SCREEN); + } + + private outOfBounds(col: number, row: number) { + return col < 0 || col > SCREEN_COLS * 16 || row < 0 || row > SCREEN_ROWS; + } + + drawPixel(col: number, row: number) { + if (this.outOfBounds(col, row)) { + this.os.sys.error(ERRNO.ILLEGAL_PIXEL_COORD); + return; + } + const address = row * 32 + Math.floor(col / 16); + let value = this.memory.screen.get(address); + const rem = col % 16; + if (this.color) { + value |= 1 << rem; + } else { + value &= ~(1 << rem); + } + this.memory.screen.set(address, value); + } + + drawLine(x1: number, y1: number, x2: number, y2: number) { + if (this.outOfBounds(x1, y1) || this.outOfBounds(x2, y2)) { + this.os.sys.error(ERRNO.ILLEGAL_LINE_COORD); + return; + } + if (x1 == x2) { + this.drawVerticalLine(x1, y1, y2); + } else if (y1 == y2) { + this.drawHorizontalLine(y1, x1, x2); + } else { + this.drawGeneralLine(x1, y1, x2, y2); + } + } + + private drawHorizontalLine(y: number, x1: number, x2: number) { + for (let x = Math.min(x1, x2); x <= Math.max(x1, x2); x++) { + this.drawPixel(x, y); + } + } + + private drawVerticalLine(x: number, y1: number, y2: number) { + for (let y = Math.min(y1, y2); y <= Math.max(y1, y2); y++) { + this.drawPixel(x, y); + } + } + + private drawGeneralLine(x1: number, y1: number, x2: number, y2: number) { + const dx = Math.abs(x2 - x1); + const dy = Math.abs(y2 - y1); + + let a = 0; + let b = 0; + let diff = 0; + + const sx = x1 < x2 ? 1 : -1; + const sy = y1 < y2 ? 1 : -1; + + while (a <= dx && b <= dy) { + this.drawPixel(x1 + sx * a, y1 + sy * b); + if (diff < 0) { + a = a + 1; + diff = diff + dy; + } else { + b = b + 1; + diff = diff - dx; + } + } + } + + drawRect(x1: number, y1: number, x2: number, y2: number) { + if (this.outOfBounds(x1, y1) || this.outOfBounds(x2, y2)) { + this.os.sys.error(ERRNO.ILLEGAL_RECT_COORD); + return; + } + for (let x = x1; x <= x2; x++) { + for (let y = y1; y <= y2; y++) { + this.drawPixel(x, y); + } + } + } + + drawCircle(x: number, y: number, r: number) { + if (this.outOfBounds(x, y)) { + this.os.sys.error(ERRNO.ILLEGAL_CENTER_COORD); + return; + } + if (r > MAX_R) { + this.os.sys.error(ERRNO.ILLEGAL_RADIUS); + return; + } + for (let dy = -r; dy <= r; dy++) { + this.drawLine( + x - Math.floor(Math.sqrt(r * r - dy * dy)), + y + dy, + x + Math.floor(Math.sqrt(r * r - dy * dy)), + y + dy, + ); + } + } +} diff --git a/web-ide-main/simulator/src/vm/os/string.ts b/web-ide-main/simulator/src/vm/os/string.ts new file mode 100644 index 0000000..b05d25f --- /dev/null +++ b/web-ide-main/simulator/src/vm/os/string.ts @@ -0,0 +1,137 @@ +import { VmMemory } from "../memory.js"; +import { ERRNO } from "./errors.js"; +import { OS } from "./os.js"; + +export const NEW_LINE = 128; +export const BACKSPACE = 129; +export const DOUBLE_QUOTES = 34; + +function isDigit(char: number) { + return char >= 48 && char <= 57; +} + +function toInt(char: number) { + return char - 48; +} + +export function intToCharArray(value: number) { + return value + .toString() + .split("") + .map((c) => c.charCodeAt(0)); +} + +export class StringLib { + private memory: VmMemory; + private os: OS; + + constructor(memory: VmMemory, os: OS) { + this.memory = memory; + this.os = os; + } + + new(size: number) { + if (size < 0) { + this.os.sys.error(ERRNO.STRING_LENGTH_NEG); + } + const pointer = this.os.memory.alloc(size + 3); // +3 to save length, maxLength, charArray Ptr + if (this.os.sys.halted) { + // alloc returned with an error + return 0; + } + + this.memory.set(pointer, size); // set maxLength = size + this.memory.set(pointer + 1, 0); // set length = 0 + this.memory.set(pointer + 2, this.os.memory.alloc(size)); // set charArrayPtr. + return pointer; + } + + dispose(pointer: number) { + this.os.memory.deAlloc(pointer); + } + + private maxLength(pointer: number) { + return this.memory.get(pointer); + } + + length(pointer: number) { + return this.memory.get(pointer + 1); + } + + private setLength(pointer: number, length: number) { + this.memory.set(pointer + 1, length); + } + + private charArrayPointer(pointer: number) { + return this.memory.get(pointer + 2); + } + + charAt(pointer: number, index: number) { + if (index < 0 || index >= this.length(pointer)) { + this.os.sys.error(ERRNO.GET_CHAR_INDEX_OUT_OF_BOUNDS); + return 0; + } + return this.memory.get(this.charArrayPointer(pointer) + index); + } + + setCharAt(pointer: number, index: number, value: number) { + if (index < 0 || index >= this.length(pointer)) { + this.os.sys.error(ERRNO.SET_CHAR_INDEX_OUT_OF_BOUNDS); + return; + } + this.memory.set(this.charArrayPointer(pointer) + index, value); + } + + // This returns the string pointer to allow compilation of string literals as described in the book, + // i.e. to a series of instructions of the form: + // call string.new 1 + // repeat: + // push constant + // call String.appendChar 2 + appendChar(pointer: number, value: number) { + const length = this.length(pointer); + if (length == this.maxLength(pointer)) { + this.os.sys.error(ERRNO.STRING_FULL); + return 0; + } + this.setLength(pointer, length + 1); + this.setCharAt(pointer, length, value); + return pointer; + } + + eraseLastChar(pointer: number) { + const length = this.length(pointer); + if (length == 0) { + this.os.sys.error(ERRNO.STRING_EMPTY); + return; + } + this.setLength(pointer, length - 1); + } + + intValue(pointer: number) { + const digits = []; + const neg = this.charAt(pointer, 0) == 45; // minus sign + const start = neg ? 1 : 0; + for (let i = start; i < this.length(pointer); i++) { + if (isDigit(this.charAt(pointer, i))) { + digits.push(toInt(this.charAt(pointer, i))); + } else { + break; + } + } + const value = digits.reduce((acc, digit) => acc * 10 + digit, 0); + return neg ? -value : value; + } + + setInt(pointer: number, value: number) { + const chars = intToCharArray(value); + if (chars.length > this.maxLength(pointer)) { + this.os.sys.error(ERRNO.STRING_INSUFFICIENT_CAPACITY); + return; + } + this.setLength(pointer, 0); + for (const c of chars) { + this.appendChar(pointer, c); + } + } +} diff --git a/web-ide-main/simulator/src/vm/os/sys.ts b/web-ide-main/simulator/src/vm/os/sys.ts new file mode 100644 index 0000000..53a17c6 --- /dev/null +++ b/web-ide-main/simulator/src/vm/os/sys.ts @@ -0,0 +1,83 @@ +import { ERRNO } from "./errors.js"; +import { OS } from "./os"; + +export class SysLib { + private os: OS; + + private _blocked = false; + private _released = false; + private _returnValue = 0; + private _halted = false; + private _exitCode = 0; + + private cancelWait = false; + private animationFrameId: number | undefined; + + constructor(os: OS) { + this.os = os; + } + + get blocked() { + return this._blocked; + } + + get released() { + return this._released; + } + + get halted() { + return this._halted; + } + + get exitCode() { + return this._exitCode; + } + + block() { + this._blocked = true; + } + + release(returnValue?: number) { + this._blocked = false; + this._returnValue = returnValue ?? 0; + this._released = true; + } + + readReturnValue() { + this._released = false; + return this._returnValue; + } + + wait(ms: number) { + if (ms <= 0) { + this.error(ERRNO.SYS_WAIT_DURATION_NOT_POSITIVE); + return; + } + + this.block(); + + (async () => { + await new Promise((x) => setTimeout(x, ms)); + this.release(); + })(); + } + + halt() { + this._halted = true; + this._exitCode = 0; + } + + error(code: number) { + this.os.output.printJsString(`ERR${code}`); + this._halted = true; + this._exitCode = code; + } + + dispose() { + this.cancelWait = true; + + if (this.animationFrameId) { + cancelAnimationFrame(this.animationFrameId); + } + } +} diff --git a/web-ide-main/simulator/src/vm/vm.test.ts b/web-ide-main/simulator/src/vm/vm.test.ts new file mode 100644 index 0000000..c52b1a0 --- /dev/null +++ b/web-ide-main/simulator/src/vm/vm.test.ts @@ -0,0 +1,402 @@ +import { unwrap } from "@davidsouther/jiffies/lib/esm/result.js"; +import { vm as SIMPLE_FUNCTION } from "@nand2tetris/projects/project_08/20_simple_function.js"; +import { FIBONACCI } from "@nand2tetris/projects/samples/vm/fibonnaci.js"; +import { + BRANCHING_FUNCTION, + NESTED_FUNCTION, + STATIC, +} from "@nand2tetris/projects/samples/vm/vm.js"; +import { VM } from "../languages/vm.js"; +import { Vm } from "./vm.js"; + +test("Simple Adder VM", () => { + const vm = unwrap( + Vm.build([ + { op: "push", segment: "constant", offset: 7 }, + { op: "push", segment: "constant", offset: 8 }, + { op: "add" }, + ]), + ); + + expect(vm.read([0])).toEqual([256]); + vm.step(); // push 7 + expect(vm.read([0, 256])).toEqual([257, 7]); + vm.step(); // push 8 + expect(vm.read([0, 256, 257])).toEqual([258, 7, 8]); + vm.step(); // add + expect(vm.read([0, 256, 257])).toEqual([257, 15, 8]); + vm.step(); // goto __END + expect(vm.read([0, 256])).toEqual([257, 15]); + vm.step(); // goto __END + expect(vm.read([0, 256])).toEqual([257, 15]); +}); + +const BIT_TEST = ` +push constant 57 +push constant 31 +push constant 53 +add +push constant 112 +sub +neg +and +push constant 82 +or +not +`; + +test("Bit Ops", () => { + const { instructions } = unwrap(VM.parse(BIT_TEST)); + const vm = unwrap(Vm.build(instructions)); + + for (let i = 0; i < 11; i++) { + vm.step(); + } + + const stack = vm.read([0, 256]); + expect(stack).toEqual([257, -91]); +}); + +const STACK_TEST = ` +push constant 17 +push constant 17 +eq +push constant 17 +push constant 16 +eq +push constant 16 +push constant 17 +eq +push constant 892 +push constant 891 +lt +push constant 891 +push constant 892 +lt +push constant 891 +push constant 891 +lt +push constant 32767 +push constant 32766 +gt +push constant 32766 +push constant 32767 +gt +push constant 32766 +push constant 32766 +gt +push constant 57 +push constant 31 +push constant 53 +add +push constant 112 +sub +neg +and +push constant 82 +or +not +`; + +test("07 / Memory Access / Stack Test", () => { + const { instructions } = unwrap(VM.parse(STACK_TEST)); + const vm = unwrap(Vm.build(instructions)); + + for (let i = 0; i < 38; i++) { + vm.step(); + } + + const cells = [0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265]; + const values = [266, -1, 0, 0, 0, -1, 0, -1, 0, 0, -91]; + const stack = vm.read(cells); + const actual = cells.map((a, i) => [a, stack[i]]); + const expected = cells.map((a, i) => [a, values[i]]); + expect(actual).toEqual(expected); +}); + +const BASIC_TEST = ` +push constant 10 +pop local 0 +push constant 21 +push constant 22 +pop argument 2 +pop argument 1 +push constant 36 +pop this 6 +push constant 42 +push constant 45 +pop that 5 +pop that 2 +push constant 510 +pop temp 6 +push local 0 +push that 5 +add +push argument 1 +sub +push this 6 +push this 6 +add +sub +push temp 6 +add +`; + +test("07 / Memory Access / Basic Test", () => { + const { instructions } = unwrap(VM.parse(BASIC_TEST)); + const vm = unwrap(Vm.build(instructions)); + + vm.write([ + [0, 256], + [1, 300], + [2, 400], + [3, 3000], + [4, 3010], + ]); + vm.segmentInitializations["argument"].initialized = true; + vm.segmentInitializations["local"].initialized = true; + vm.invocation.thisInitialized = true; + vm.invocation.thatInitialized = true; + + for (let i = 0; i < 25; i++) { + vm.step(); + } + + const test = vm.read([256, 300, 401, 402, 3006, 3012, 3015, 11]); + expect(test).toEqual([472, 10, 21, 22, 36, 42, 45, 510]); +}); + +const POINTER_TEST = ` +push constant 3030 +pop pointer 0 +push constant 3040 +pop pointer 1 +push constant 32 +pop this 2 +push constant 46 +pop that 6 +push pointer 0 +push pointer 1 +add +push this 2 +sub +push that 6 +add +`; + +test("07 / Memory Access / Pointer Test", () => { + const { instructions } = unwrap(VM.parse(POINTER_TEST)); + const vm = unwrap(Vm.build(instructions)); + + vm.write([ + [0, 256], + [1, 300], + [2, 400], + [3, 3000], + [4, 3010], + ]); + vm.segmentInitializations["argument"].initialized = true; + vm.segmentInitializations["local"].initialized = true; + vm.invocation.thisInitialized = true; + vm.invocation.thatInitialized = true; + + for (let i = 0; i < 16; i++) { + vm.step(); + } + + const test = vm.read([256, 3, 4, 3032, 3046]); + expect(test).toEqual([6084, 3030, 3040, 32, 46]); +}); + +test("08 / Branching Function", () => { + const { instructions } = unwrap(VM.parse(BRANCHING_FUNCTION)); + const vm = unwrap(Vm.build(instructions)); + + vm.write([]); + + for (let i = 0; i < 100; i++) { + vm.step(); + } + + const test = vm.read([0, 256]); + expect(test).toEqual([257, 12]); +}); + +const LOOP_TEST = ` +push constant 0 +pop local 0 // initializes sum = 0 +label LOOP_START +push argument 0 +push local 0 +add +pop local 0 // sum = sum + counter +push argument 0 +push constant 1 +sub +pop argument 0 // counter-- +push argument 0 +if-goto LOOP_START // If counter != 0, goto LOOP_START +push local 0 +`; + +test("08 / Program Flow / Basic Loop", () => { + const { instructions } = unwrap(VM.parse(LOOP_TEST)); + const vm = unwrap(Vm.build(instructions)); + + vm.write([ + [0, 256], + [1, 300], + [2, 400], + [400, 3], + ]); + vm.segmentInitializations["argument"].initialized = true; + vm.segmentInitializations["local"].initialized = true; + + for (let i = 0; i < 33; i++) { + vm.step(); + } + + const test = vm.read([0, 256]); + expect(test).toEqual([257, 6]); +}); + +const FIBONACCI_SERIES = ` +push argument 1 +pop pointer 1 // that = argument[1] + +push constant 0 +pop that 0 // first element in the series = 0 +push constant 1 +pop that 1 // second element in the series = 1 + +push argument 0 +push constant 2 +sub +pop argument 0 // num_of_elements -= 2 (first 2 elements are set) + +label MAIN_LOOP_START + +push argument 0 +if-goto COMPUTE_ELEMENT // if num_of_elements > 0, goto COMPUTE_ELEMENT +goto END_PROGRAM // otherwise, goto END_PROGRAM + +label COMPUTE_ELEMENT + +push that 0 +push that 1 +add +pop that 2 // that[2] = that[0] + that[1] + +push pointer 1 +push constant 1 +add +pop pointer 1 // that += 1 + +push argument 0 +push constant 1 +sub +pop argument 0 // num_of_elements-- + +goto MAIN_LOOP_START + +label END_PROGRAM +`; + +test("08 / Program Flow / Fibonacci Series", () => { + const { instructions } = unwrap(VM.parse(FIBONACCI_SERIES)); + const vm = unwrap(Vm.build(instructions)); + + vm.write([ + [0, 256], + [1, 300], + [2, 400], + [400, 6], + [401, 3000], + ]); + vm.segmentInitializations["argument"].initialized = true; + vm.segmentInitializations["local"].initialized = true; + + for (let i = 0; i < 1000; i++) { + vm.step(); + } + + const test = vm.read([3000, 3001, 3002, 3003, 3004, 3005]); + expect(test).toEqual([0, 1, 1, 2, 3, 5]); +}); + +test("08 / Functions / SimpleFunction", () => { + const { instructions } = unwrap(VM.parse(SIMPLE_FUNCTION)); + const vm = unwrap(Vm.build(instructions)); + + expect(() => vm.vmStack()).not.toThrow("Assertion failed"); +}); + +test("08 / Functions / NestedCall", () => { + const { instructions } = unwrap(VM.parse(NESTED_FUNCTION)); + const vm = unwrap(Vm.build(instructions)); + + const init: [number, number][] = [ + [0, 261], + [1, 261], + [2, 256], + [3, 3000], + [4, 4000], + [5, -1], + [6, -1], + [256, 1234], + [257, -1], + [258, -2], + [259, -3], + [260, -4], + ]; + + for (let i = 261; i < 300; i++) { + init.push([i, -1]); + } + + vm.write(init); + vm.segmentInitializations["argument"].initialized = true; + vm.segmentInitializations["local"].initialized = true; + vm.invocation.thisInitialized = true; + vm.invocation.thatInitialized = true; + + for (let i = 0; i < 1000; i++) { + vm.step(); + } + + const test = vm.read([0, 1, 2, 3, 4, 5, 6]); + expect(test).toEqual([261, 261, 256, 4000, 5000, 135, 246]); +}); + +test("08 / Functions / Fib", () => { + const { instructions } = unwrap(VM.parse(FIBONACCI)); + const vm = unwrap(Vm.build(instructions)); + + for (let i = 0; i < 1000; i++) { + vm.step(); + } + + const test = vm.read([0, 256]); + expect(test).toEqual([257, 3]); +}); + +test("08 / Functions / Static", () => { + const { instructions } = unwrap(VM.parse(STATIC)); + const vm = unwrap(Vm.build(instructions)); + + for (let i = 0; i < 1000; i++) { + vm.step(); + } + + const test = vm.read([0, 256, 257]); + expect(test).toEqual([258, -2, 8]); +}); + +describe("debug frame views", () => { + test("top frame", () => { + const { instructions } = unwrap(VM.parse(FIBONACCI)); + const vm = unwrap(Vm.build(instructions)); + + expect(vm.vmStack().length).toBe(1); + }); +}); diff --git a/web-ide-main/simulator/src/vm/vm.ts b/web-ide-main/simulator/src/vm/vm.ts new file mode 100644 index 0000000..2d67f41 --- /dev/null +++ b/web-ide-main/simulator/src/vm/vm.ts @@ -0,0 +1,967 @@ +import { + Err, + isErr, + Ok, + Result, + unwrap, +} from "@davidsouther/jiffies/lib/esm/result.js"; +import { MemoryAdapter, RAM } from "../cpu/memory.js"; +import { CompilationError, createError, Span } from "../languages/base.js"; +import { + CallInstruction, + FunctionInstruction, + Segment, + StackInstruction, + VmInstruction, +} from "../languages/vm.js"; +import { VM_BUILTINS } from "./builtins.js"; +import { VmMemory } from "./memory.js"; +import { OS } from "./os/os.js"; + +interface VmFrameValues { + base: number; + count: number; + values: number[]; +} + +export interface VmFrame { + fn?: VmFunction; + locals: VmFrameValues; + args: VmFrameValues; + stack: VmFrameValues; + this: VmFrameValues; + that: VmFrameValues; + frame: { + RET: number; + ARG: number; + LCL: number; + THIS: number; + THAT: number; + }; + usedSegments?: Set; +} + +export type VmFunctions = Record; +export interface VmFunction { + name: string; + nVars: number; + labels: Record; + operations: VmInstruction[]; + opBase: number; +} + +interface VmFunctionInvocation { + function: string; + // The current operation offset in the function + opPtr: number; + // Base address of the frame in memory + frameBase: number; + // The number of args the function was called with + nArgs: number; + // Whether the THIS segment was initialized in this invocation + thisInitialized: boolean; + // Whether the THAT segment was initialized in this invocation + thatInitialized: boolean; + // The size of the memory block pointed to by the function's THIS (if exists) + thisN?: number; +} + +export const IMPLICIT = "__implicit"; + +export const SYS_INIT: VmFunction = { + name: "Sys.init", + labels: {}, + nVars: 0, + opBase: 0, + operations: [ + { op: "function", name: "Sys.init", nVars: 0 }, + { op: "call", name: "Math.init", nArgs: 0 }, + { op: "call", name: "String.init", nArgs: 0 }, + { op: "call", name: "Array.init", nArgs: 0 }, + { op: "call", name: "Output.init", nArgs: 0 }, + { op: "call", name: "Screen.init", nArgs: 0 }, + { op: "call", name: "Keyboard.init", nArgs: 0 }, + { op: "call", name: "Memory.init", nArgs: 0 }, + { op: "call", name: "Main.main", nArgs: 0 }, + ], +}; + +export interface ParsedVmFile { + name: string; + instructions: VmInstruction[]; +} + +interface SegmentStatus { + initialized: boolean; + n: number; +} + +export class Vm { + memory = new VmMemory(); + private os = new OS(this.memory); + functionMap: Record = {}; + executionStack: VmFunctionInvocation[] = []; + + entry = ""; + + segmentInitializations: Record<"local" | "argument", SegmentStatus> = { + local: { initialized: false, n: 0 }, + argument: { initialized: false, n: 0 }, + }; + + functions: VmFunction[] = []; + program: VmInstruction[] = []; + addedSysInit = false; + + private staticCount = 0; + protected statics: Record = {}; + + getStaticCount() { + return this.staticCount; + } + + private returnLine: number | undefined = undefined; + + private registerStatic(fnName: string, offset: number): number { + const fileName = fnName.split(".")[0]; + const statics = this.statics[fileName] ?? []; + this.statics[fileName] = statics; + const static_ = statics[offset] ?? this.staticCount++; + statics[offset] = static_; + return static_; + } + + private registerStatics() { + for (const fn of Object.values(this.functionMap)) { + for (const op of fn.operations) { + if ( + (op.op === "push" || op.op === "pop") && + (op as StackInstruction)?.segment === "static" + ) { + (op as StackInstruction).offset = this.registerStatic( + fn.name, + (op as StackInstruction).offset, + ); + } + } + } + } + + private static fileBasenameNoExtension(file: string): string { + // Files that are part of the web-ide are usually passed with folders but without extensions. + // e.g.: /projects/08/FibonacciElement/Sys + if (file.includes("/")) { + file = file.split("/").pop() ?? ""; + } + + // Local files on Windows are usually passed with extension. + // e.g.: Sys.vm + if (file.includes(".")) { + file = file.split(".")[0]; + } + + return file; + + // TODO: Check if this also works for Linux and MacOS + } + + private static validateFile(file: ParsedVmFile) { + for (const inst of file.instructions) { + if (inst.op == "function") { + const parts = inst.name.split("."); + if (parts.length != 2) { + return Err( + createError( + `Illegal subroutine name ${inst.name} (Expected .)`, + inst.span, + ), + ); + } + if (parts[0] != this.fileBasenameNoExtension(file.name)) { + return Err( + createError( + `File name ${file.name} doesn't match class name ${parts[0]} (at ${inst.name})`, + inst.span, + ), + ); + } + } + } + return Ok(); + } + + private static validateFiles(files: ParsedVmFile[]) { + const names: Set = new Set(); + + for (const file of files) { + if (names.has(file.name)) { + return Err(createError(`File ${file.name} already exists`)); + } + const result = this.validateFile(file); + if (isErr(result)) { + return result; + } + names.add(file.name); + } + return Ok(); + } + + private validateStackInstructions() { + for (const fn of Object.values(this.functionMap)) { + for (const inst of fn.operations) { + if (inst.op == "pop" || inst.op == "push") { + const base = this.memory.baseSegment(inst.segment, inst.offset); + if (isErr(base)) { + return Err(createError(Err(base).message, inst.span)); + } + } + } + } + return Ok(); + } + + private static validateFunctions( + instructions: VmInstruction[], + ): Result { + const functions: Set = new Set(); + const calls = []; + + for (const inst of instructions) { + if (inst.op == "function") { + if (inst.nVars < 0 || inst.nVars > 32767) { + return Err( + createError( + `Illegal number of local variables ${inst.nVars} (Expected 0-32767)`, + inst.span, + ), + ); + } + functions.add(inst.name); + } + if (inst.op == "call") { + if (inst.nArgs < 0 || inst.nArgs > 32767) { + return Err( + createError( + `Illegal number of arguments ${inst.nArgs} (Expected 0-32767)`, + inst.span, + ), + ); + } + calls.push(inst as CallInstruction); + } + } + + for (const call of calls) { + if (!functions.has(call.name)) { + const builtin = VM_BUILTINS[call.name]; + if (builtin) { + const expectedNArgs = + builtin.type == "method" + ? builtin.args.length + 1 + : builtin.args.length; + if (expectedNArgs != call.nArgs) { + return Err( + createError( + `OS function ${call.name} expects ${ + expectedNArgs + } arguments, not ${call.nArgs}`, + call.span, + ), + ); + } + } else { + return Err(createError(`Undefined function ${call.name}`, call.span)); + } + } + } + + return Ok(); + } + + static buildFromFiles(files: ParsedVmFile[]): Result { + let result = this.validateFiles(files); + if (isErr(result)) { + return result; + } + const instructions = files + .map((file) => file.instructions) + .reduce((list1, list2) => list1.concat(list2)); + result = this.validateFunctions(instructions); + if (isErr(result)) { + return result; + } + const vm = new Vm(); + const load = vm.load(instructions); + if (isErr(load)) return load; + return vm.bootstrap(); + } + + static build(instructions: VmInstruction[]): Result { + const result = this.validateFunctions(instructions); + if (isErr(result)) { + return result; + } + const vm = new Vm(); + const load = vm.load(instructions); + if (isErr(load)) return load; + return vm.bootstrap(); + } + + private static buildFunction( + instructions: VmInstruction[], + i: number, + ): Result<[VmFunction, number], CompilationError> { + if (instructions[i].op !== "function") + throw new Error( + "Only call buildFunction at the initial Function instruction", + ); + + const { name, nVars } = instructions[i] as FunctionInstruction; + const fn: VmFunction = { + name, + nVars, + labels: {}, + operations: [{ op: "function", name, nVars, span: instructions[i].span }], + opBase: 0, + }; + + const declaredLabels: Set = new Set(); + const usedLabels: Record = {}; + + i += 1; + instructions: while (i < instructions.length) { + switch (instructions[i].op) { + case "function": + break instructions; + case "add": + case "sub": + case "neg": + case "and": + case "or": + case "not": + case "gt": + case "lt": + case "eq": + fn.operations.push({ + op: instructions[i].op as + | "add" + | "sub" + | "neg" + | "lt" + | "gt" + | "eq" + | "and" + | "or" + | "not", + span: instructions[i].span, + }); + break; + case "push": + case "pop": + fn.operations.push({ + op: instructions[i].op as "push" | "pop", + segment: ( + instructions[i] as { + segment: + | "argument" + | "local" + | "static" + | "constant" + | "this" + | "that" + | "pointer" + | "temp"; + } + ).segment, + offset: (instructions[i] as { offset: number }).offset, + span: instructions[i].span, + }); + break; + case "call": + fn.operations.push({ + op: "call", + name: (instructions[i] as { name: string }).name, + nArgs: (instructions[i] as { nArgs: number }).nArgs, + span: instructions[i].span, + }); + break; + case "goto": + case "if-goto": { + const { label } = instructions[i] as { label: string }; + usedLabels[label] = instructions[i].span; + fn.operations.push({ + op: instructions[i].op as "goto" | "if-goto", + label, + span: instructions[i].span, + }); + break; + } + case "label": { + const { label } = instructions[i] as { label: string }; + declaredLabels.add(label); + if (fn.labels[label]) + return Err( + createError( + `Cannot redeclare label ${label} in function ${ + fn.name + } (previously at line ${fn.labels[label] + 1})`, + instructions[i].span, + ), + ); + fn.labels[label] = fn.operations.length; + fn.operations.push({ + op: "label", + label, + span: instructions[i].span, + }); + break; + } + case "return": { + fn.operations.push({ op: "return", span: instructions[i].span }); + break; + } + } + + i += 1; + } + + for (const label of Object.keys(usedLabels)) { + if (!declaredLabels.has(label)) { + return Err(createError(`Undeclared label ${label}`, usedLabels[label])); + } + } + + return Ok([fn, i]); + } + + get RAM(): RAM { + return this.memory; + } + + get Keyboard(): MemoryAdapter { + return this.memory.keyboard; + } + get Screen(): MemoryAdapter { + return this.memory.screen; + } + + get invocation(): VmFunctionInvocation { + const invocation = this.executionStack.at(-1); + if (invocation === undefined) { + return { + frameBase: 256, + function: IMPLICIT, + nArgs: 0, + opPtr: 0, + thisInitialized: false, + thatInitialized: false, + }; + } + return invocation; + } + + get currentFunction() { + return this.functionMap[this.invocation.function]; + } + + get operation() { + if (!this.currentFunction) { + return undefined; + } + if (this.invocation.opPtr > this.currentFunction.operations.length) + throw new Error( + `Current operation step beyond end of function operations (${this.invocation.opPtr} > ${this.currentFunction.operations.length})`, + ); + + return this.currentFunction.operations[this.invocation.opPtr]; + } + + load( + instructions: VmInstruction[], + reset = false, + ): Result { + if (reset) { + this.functionMap = {}; + this.statics = {}; + this.staticCount = 0; + } + + if (instructions[0]?.op !== "function") { + instructions.unshift({ op: "function", name: IMPLICIT, nVars: 0 }); + } + + let i = 0; + while (i < instructions.length) { + const buildFn = Vm.buildFunction(instructions, i); + + if (isErr(buildFn)) return buildFn; + const [fn, i_] = unwrap(buildFn); + if ( + this.functionMap[fn.name] && + this.memory.strict && + fn.name !== IMPLICIT && + fn.name !== SYS_INIT.name + ) { + return Err( + createError( + `VM Already has a function named ${fn.name}`, + instructions[0].span, + ), + ); + } + + this.functionMap[fn.name] = fn; + i = i_; + } + + const result = this.validateStackInstructions(); + if (isErr(result)) { + return result; + } + this.registerStatics(); + + if (reset) { + this.bootstrap(); + } + + return Ok(this); + } + + bootstrap() { + if (!this.functionMap[SYS_INIT.name] && this.functionMap["Main.main"]) { + this.functionMap[SYS_INIT.name] = SYS_INIT; + this.addedSysInit = true; + // TODO should this be an error from the compiler/OS? + } + + if (this.functionMap[SYS_INIT.name]) { + this.entry = SYS_INIT.name; + } else if (this.functionMap[IMPLICIT]) { + this.entry = IMPLICIT; + } else { + const fnNames = Object.keys(this.functionMap); + if (fnNames.length === 1) { + this.entry = fnNames[0]; + } + } + + if (this.functionMap[IMPLICIT] && this.functionMap[SYS_INIT.name]) { + return Err( + createError("Cannot use both bootstrap and an implicit function"), + ); + } + + if (this.entry === "") { + return Err(createError("Could not determine an entry point for VM")); + } + + this.functions = Object.values(this.functionMap); + this.functions.sort((a, b) => { + if (a.name === this.entry) return -1; + if (b.name === this.entry) return 1; + return 0; // Stable sort otherwise + }); + + let offset = 0; + this.program = this.functions.reduce((prog, fn) => { + if (fn.name != SYS_INIT.name) { + fn.opBase = offset; + } + offset += fn.operations.length; + return prog.concat(fn.operations); + }, [] as VmInstruction[]); + + this.reset(); + + return Ok(this); + } + + reset() { + this.executionStack = [ + { + function: this.entry, + opPtr: 1, + frameBase: 256, + nArgs: 0, + thisInitialized: false, + thatInitialized: false, + }, + ]; + this.memory.reset(); + this.memory.SP = 256; + this.segmentInitializations = { + local: { initialized: false, n: 0 }, + argument: { initialized: false, n: 0 }, + }; + + this.os.dispose(); + this.os = new OS(this.memory); + } + + private validateStackOp(op: StackInstruction) { + if (this.currentFunction?.name == this.entry) { + for (const segment of ["local", "argument"] as const) { + if (op.segment == segment) { + if (this.segmentInitializations[segment].initialized) { + // the size of that segment is always 1 + this.segmentInitializations[segment].n = Math.max( + op.offset + 1, + this.segmentInitializations[segment].n, + ); + return; + } else { + throw new Error( + `The ${segment} segment cannot be accessed since it was not initialized`, + ); + } + } + } + if (op.segment == "this" && this.invocation.thisInitialized) { + this.invocation.thisN = Math.max( + op.offset + 1, + this.invocation.thisN ?? 0, + ); + return; + } + } + if (op.segment == "argument" && op.offset >= this.invocation.nArgs) { + throw new Error("Argument offset out of bounds"); + } + if ( + op.segment == "local" && + op.offset >= this.functionMap[this.invocation.function]?.nVars + ) { + throw new Error("Local offset out of bounds"); + } + if (op.segment == "this" && !this.invocation.thisInitialized) { + throw new Error( + `The this segment cannot be accessed since it was not initialized`, + ); + } + if (op.segment == "that" && !this.invocation.thatInitialized) { + throw new Error( + `The that segment cannot be accessed since it was not initialized`, + ); + } + } + + setPaused(paused = true) { + this.os.paused = paused; + } + + step(): number | undefined { + if (this.os.sys.halted) { + return this.os.sys.exitCode; + } + if (this.os.sys.blocked) { + return; + } + if (this.os.sys.released && this.operation?.op == "call") { + const ret = this.os.sys.readReturnValue(); + const sp = this.memory.SP - this.operation.nArgs; + this.memory.set(sp, ret); + this.memory.SP = sp + 1; + this.invocation.opPtr += 1; + return; + } + + if (this.operation == undefined) { + this.os.sys.halt(); + return this.step(); + } + + const operation = this.operation; + + if (operation.op === "label") { + this.invocation.opPtr += 1; + return this.step(); + } + + switch (operation.op) { + case "push": { + this.validateStackOp(operation); + const value = this.memory.getSegment( + operation.segment, + operation.offset, + ); + this.memory.push(value); + break; + } + case "pop": { + this.validateStackOp(operation); + const value = this.memory.pop(); + this.memory.setSegment(operation.segment, operation.offset, value); + + // update THIS/THAT segment status + if (operation.segment == "pointer") { + if (operation.offset == 0) { + this.invocation.thisInitialized = true; + this.invocation.thisN = this.memory.get(this.memory.THIS - 1); + } else if (operation.offset == 1) { + this.invocation.thatInitialized = true; + } + } + break; + } + case "add": { + this.memory.binOp((a, b) => a + b); + break; + } + case "sub": { + this.memory.binOp((a, b) => a - b); + break; + } + case "neg": { + // neg by flipping the sign bit + this.memory.unOp((a) => -a); + break; + } + case "and": { + this.memory.binOp((a, b) => a & b); + break; + } + case "or": { + this.memory.binOp((a, b) => a | b); + break; + } + case "not": { + this.memory.unOp((a) => ~a); + break; + } + case "eq": { + this.memory.comp((a, b) => a === b); + break; + } + case "lt": { + this.memory.comp((a, b) => a < b); + break; + } + case "gt": { + this.memory.comp((a, b) => a > b); + break; + } + case "goto": { + this.goto(operation.label); + break; + } + case "if-goto": { + const check = this.memory.pop(); + if (check != 0) { + this.goto(operation.label); + } + break; + } + case "call": { + const fnName = operation.name; + if (this.functionMap[fnName]) { + const base = this.memory.pushFrame( + this.invocation.opPtr, + operation.nArgs, + this.functionMap[fnName].nVars, + ); + this.executionStack.push({ + function: fnName, + opPtr: 0, + nArgs: operation.nArgs, + frameBase: base, + thisInitialized: false, + thatInitialized: false, + }); + } else if (VM_BUILTINS[fnName]) { + const ret = VM_BUILTINS[fnName].func(this.memory, this.os); + if (this.os.sys.blocked) { + return; // we will handle the return when the OS is released + } + const sp = this.memory.SP - operation.nArgs; + this.memory.set(sp, ret); + this.memory.SP = sp + 1; + } + break; + } + case "return": { + const line = this.derivedLine(); + this.executionStack.pop(); + const ret = this.memory.popFrame(); + this.invocation.opPtr = ret; + if (this.executionStack.length === 0) { + this.returnLine = line; + return 0; + } + break; + } + } + this.invocation.opPtr += 1; + return; + } + + private goto(label: string) { + if (!this.currentFunction) { + return; + } + if (this.currentFunction.labels[label] === undefined) + throw new Error( + `Attempting GOTO to unknown label ${label} in ${this.currentFunction.name}`, + ); + this.invocation.opPtr = this.currentFunction.labels[label]; + } + + write(addresses: [number, number][]) { + addresses.map(([address, value]) => { + this.memory.set(address, value); + }); + } + + read(addresses: number[]): number[] { + return addresses.map((address) => this.memory.get(address)); + } + + vmStack(): VmFrame[] { + return this.executionStack.map((invocation, i) => { + const next = this.executionStack[i + 1]; + const end = next ? next.frameBase - next.nArgs : this.memory.get(0); + return this.makeFrame(invocation, end); + }); + } + + private getUsedSegments(invocation: VmFunctionInvocation) { + const usedSegments = new Set(); + + for (const inst of this.functionMap[invocation.function].operations) { + if (inst.op === "push" || inst.op == "pop") { + usedSegments.add(inst.segment); + } + } + + return usedSegments; + } + + makeFrame(invocation = this.invocation, nextFrame: number): VmFrame { + const fn = this.functionMap[invocation.function]; + if (fn.name === this.entry) { + const stackBase = 256 + fn.nVars; + const nextFrame = this.executionStack[1]; + const frameEnd = nextFrame + ? nextFrame.frameBase - nextFrame.nArgs + : this.memory.get(0); + const { ARG, LCL, THAT, THIS } = this.memory; + const nArg = this.segmentInitializations["argument"].n; + const nLocal = this.segmentInitializations["local"].n; + const nThis = this.invocation.thisN ?? 0; + const stackCount = frameEnd - stackBase; + return { + fn, + args: { + base: ARG, + count: nArg, + values: [...this.memory.map((_, v) => v, ARG, ARG + nArg)], + }, + locals: { + base: LCL, + count: nLocal, + values: [...this.memory.map((_, v) => v, LCL, LCL + nLocal)], + }, + stack: { + base: 256, + count: Math.max(0, stackCount), + values: + stackCount > 0 + ? [...this.memory.map((_, v) => v, stackBase, frameEnd)] + : [], + }, + this: { + base: THIS, + count: nThis, + values: [...this.memory.map((_, v) => v, THIS, THIS + nThis)], + }, + that: { + base: THAT, + count: 1, + values: [this.memory.THAT], + }, + frame: { + ARG, + LCL, + RET: 0xffff, + THAT, + THIS, + }, + usedSegments: this.getUsedSegments(invocation), + }; + } + const frame = this.memory.getFrame( + invocation.frameBase, + invocation.nArgs, + fn.nVars, + this.invocation.thisN ?? 0, + 1, + nextFrame, + ); + frame.fn = fn; + frame.usedSegments = this.getUsedSegments(invocation); + return frame; + } + + derivedLine(): number { + return this.operation?.span?.line ?? this.returnLine ?? 0; + } + + writeDebug(): string { + const line = this.derivedLine(); + const from = Math.max(line - 5, 0); + const to = Math.min(line + 3, this.program.length); + const lines = this.program.slice(from, to); + const prog = lines + .map((op, i) => `${i === line - from ? "->" : " "} ${writeOp(op)}`) + .join("\n"); + const frame = this.vmStack().at(-1); + if (frame) { + return prog + "\n\n" + writeFrame(frame); + } + return prog; + } +} + +export function writeFrame(frame: VmFrame): string { + return [ + `Frame: ${frame.fn?.name ?? "Unknown Fn"} ARG:${frame.frame.ARG} LCL:${ + frame.frame.LCL + }`, + `Args: ${writeFrameValues(frame.args)}`, + `Lcls: ${writeFrameValues(frame.locals)}`, + `Stck: ${writeFrameValues(frame.stack)}`, + ].join("\n"); +} + +function writeFrameValues(fv: VmFrameValues): string { + return `[${fv.base};${fv.count}][${fv.values.join(", ")}]`; +} + +function writeOp(op: VmInstruction): string { + switch (op.op) { + case "add": + case "and": + case "sub": + case "eq": + case "gt": + case "lt": + case "neg": + case "not": + case "or": + case "return": + return ` ${op.op}`; + case "goto": + return ` ${op.op} ${op.label}`; + case "if-goto": + return ` ${op.op} ${op.label}`; + case "label": + return `${op.op} ${op.label}`; + case "call": + return ` ${op.op} ${op.name} ${op.nArgs}`; + case "function": + return `${op.op} ${op.name} ${op.nVars}`; + case "pop": + return ` ${op.op} ${op.segment} ${op.offset}`; + case "push": + return ` ${op.op} ${op.segment} ${op.offset}`; + } +} diff --git a/web-ide-main/simulator/tsconfig.json b/web-ide-main/simulator/tsconfig.json new file mode 100644 index 0000000..1f131e8 --- /dev/null +++ b/web-ide-main/simulator/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "build", + "rootDir": "src", + "tsBuildInfoFile": "build/.tsbuildinfo" + }, + "include": ["src"] +} diff --git a/web-ide-main/stamp.sh b/web-ide-main/stamp.sh new file mode 100644 index 0000000..f6d700e --- /dev/null +++ b/web-ide-main/stamp.sh @@ -0,0 +1,36 @@ +#!/usr/bin/bash + +set -e # Exit on errors +set -x # Shell debugging + +# CURRENT and NEXT have the format YYYY.WW.REV, where YYYY is the current year, +# WW is the current week, and REV is the number of releases this week. +# The next revision compares the two, in this way +# - If NEXT is later than CURRENT in any fields, accept NEXT. +# - Otherwise, return CURRENT, with one added to REV. +# +# THIS FUNCTION IS NOT TRANSITIVE! It must be called with +# `compare_versions CURRENT NEXT` +compare_versions() { + if [[ "$1" < "$2" ]]; then + echo "$2" + else + IFS='.' read -r y1 w1 r1 <<<"$1" + r1=$((r1 + 1)) + echo "${y1}.${w1}.${r1}" + fi +} + +# compare_versions 2024.44.4 2024.44.0 # 2024.44.5 +# compare_versions 2024.44.4 2024.45.0 # 2024.45.0 +# compare_versions 2024.44.4 2025.1.0 # 2025.1.0 + +CURRENT=$(grep version package.json | awk -F\" '{print $4}') +NEXT=$(date +%Y.%W.0) +VERSION=$(compare_versions "$CURRENT" "$NEXT") +echo "Releasing $VERSION..." +npm version "$VERSION" --include-workspace-root --no-git-tag-version +sed "/version/ s/$CURRENT/$VERSION/" web/public/index.html > web/public/index.html.out ; mv web/public/index.html.out web/public/index.html +git --no-pager diff +git add . +git commit --message "Release ${VERSION}" diff --git a/web-ide-main/tsconfig.base.json b/web-ide-main/tsconfig.base.json new file mode 100644 index 0000000..9c6ece3 --- /dev/null +++ b/web-ide-main/tsconfig.base.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + // Workspace projects + "composite": true, + + // Assume browser environment & esm + "lib": ["es2022", "DOM", "DOM.Iterable"], + "target": "es2022", + "module": "ESNext", + "moduleResolution": "node", + "allowJs": true, + "checkJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": false, + "jsx": "react-jsx", + "sourceMap": true, + + // Checks and strictness + "strict": true, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + // "exactOptionalPropertyTypes": true, + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + // "noPropertyAccessFromIndexSignature": true, + // "noUncheckedIndexedAccess": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + + "incremental": true, + "declaration": true + } +} diff --git a/web-ide-main/tsconfig.json b/web-ide-main/tsconfig.json new file mode 100644 index 0000000..bf9e623 --- /dev/null +++ b/web-ide-main/tsconfig.json @@ -0,0 +1,12 @@ +{ + "references": [ + { "path": "./projects/tsconfig.json" }, + { "path": "./runner/tsconfig.json" }, + { "path": "./simulator/tsconfig.json" }, + { "path": "./cli/tsconfig.json" }, + { "path": "./components/tsconfig.json" }, + { "path": "./extension/tsconfig.json" }, + { "path": "./web/tsconfig.json" } + ], + "files": [] +} diff --git a/web-ide-main/web/.gitignore b/web-ide-main/web/.gitignore new file mode 100644 index 0000000..4a01248 --- /dev/null +++ b/web-ide-main/web/.gitignore @@ -0,0 +1 @@ +web-ide diff --git a/web-ide-main/web/package.json b/web-ide-main/web/package.json new file mode 100644 index 0000000..80cfe08 --- /dev/null +++ b/web-ide-main/web/package.json @@ -0,0 +1,107 @@ +{ + "name": "@nand2tetris/web", + "version": "0.0.0", + "private": true, + "description": "", + "author": "David Souther ", + "license": "ISC", + "homepage": "https://nand2tetris.github.io/web-ide", + "devDependencies": { + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@davidsouther/jiffies": "^2.2.5", + "@lingui/cli": "^4.11.1", + "@lingui/macro": "^4.11.1", + "@lingui/react": "^4.11.1", + "@monaco-editor/react": "^4.6.0", + "@nand2tetris/components": "file:../components", + "@nand2tetris/projects": "file:../projects", + "@nand2tetris/simulator": "file:../simulator", + "@rollup/plugin-node-resolve": "^15.2.3", + "@testing-library/jest-dom": "^6.4.5", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.2", + "@types/error-cause": "^1.0.4", + "@types/jest": "^29.5.12", + "@types/node": "^20.14.2", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/vscode": "^1.89.0", + "@vscode/vsce": "^2.27.0", + "gh-pages": "^6.1.1", + "immer": "^10.1.1", + "jszip": "^3.10.1", + "make-plural": "^7.4.0", + "ohm-js": "^17.1.0", + "raw-loader": "^4.0.2", + "raw.macro": "^0.5.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-ga4": "^2.1.0", + "react-markdown": "^9.0.1", + "react-router-dom": "^6.23.1", + "react-scripts": "^5.0.1", + "remark-gfm": "^4.0.0", + "rxjs": "^7.8.1", + "sass": "^1.77.4", + "source-map-explorer": "^2.5.3", + "web-vitals": "^2.1.4" + }, + "scripts": { + "analyze": "source-map-explorer 'build/static/js/*.js'", + "preanalyze": "npm run map-build", + "start": "react-scripts start", + "build": "cross-env GENERATE_SOURCEMAP=false react-scripts build", + "map-build": "react-scripts build", + "postbuild": "node ./scripts/predeploy.js", + "preserve-pwa": "npm run build ; ln -s build web-ide", + "serve-pwa": "python3 -m http.server", + "test": "react-scripts test", + "prebuild": "npm run extract && npm run lingui", + "extract": "lingui extract", + "lingui": "lingui compile --namespace es", + "predeploy": "npm run build", + "deploy": "gh-pages -d build" + }, + "browserslist": { + "production": [ + ">1%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "lingui": { + "locales": [ + "en", + "en-PL" + ], + "sourceLocale": "en", + "pseudoLocale": "en-PL", + "fallbackLocales": { + "en-PL": "en" + }, + "catalogs": [ + { + "path": "src/locales/{locale}/messages", + "include": [ + "src", + "public" + ] + } + ], + "format": "po" + }, + "jest": { + "moduleNameMapper": { + "^@nand2tetris/([^/]+)/(.*)": "/../node_modules/@nand2tetris/$1/build/$2", + "\\.css$": "identity-obj-proxy" + }, + "transformIgnorePatterns": [ + "node_modules/(?!@davidsouther)" + ] + } +} diff --git a/web-ide-main/web/public/.gitignore b/web-ide-main/web/public/.gitignore new file mode 100644 index 0000000..1f619d0 --- /dev/null +++ b/web-ide-main/web/public/.gitignore @@ -0,0 +1 @@ +pico.css diff --git a/web-ide-main/web/public/favicon.svg b/web-ide-main/web/public/favicon.svg new file mode 100644 index 0000000..cee1b79 --- /dev/null +++ b/web-ide-main/web/public/favicon.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/web-ide-main/web/public/index.html b/web-ide-main/web/public/index.html new file mode 100644 index 0000000..60f8030 --- /dev/null +++ b/web-ide-main/web/public/index.html @@ -0,0 +1,24 @@ + + + + + NAND2Tetris + + + + + + + + + + + + +
+ + diff --git a/web-ide-main/web/public/jet_brains_mono.ttf b/web-ide-main/web/public/jet_brains_mono.ttf new file mode 100644 index 0000000..65e8bfe Binary files /dev/null and b/web-ide-main/web/public/jet_brains_mono.ttf differ diff --git a/web-ide-main/web/public/logo_192.png b/web-ide-main/web/public/logo_192.png new file mode 100644 index 0000000..b14d590 Binary files /dev/null and b/web-ide-main/web/public/logo_192.png differ diff --git a/web-ide-main/web/public/logo_512.png b/web-ide-main/web/public/logo_512.png new file mode 100644 index 0000000..b7288cf Binary files /dev/null and b/web-ide-main/web/public/logo_512.png differ diff --git a/web-ide-main/web/public/manifest.json b/web-ide-main/web/public/manifest.json new file mode 100644 index 0000000..fd79e9f --- /dev/null +++ b/web-ide-main/web/public/manifest.json @@ -0,0 +1,42 @@ +{ + "short_name": "NAND2Tetris", + "name": "NAND2Tetris", + "icons": [ + { + "src": "favicon.svg", + "sizes": "32x32", + "type": "image/svg+xml" + }, + { + "src": "logo_192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo_512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "screenshots": [ + { + "src": "user_guide/01_chip_empty.png", + "sizes": "2660x2076", + "type": "image/png", + "form_factor": "wide", + "label": "Empty Chip" + }, + { + "src": "user_guide/01_chip_empty_mobile.png", + "sizes": "782x1692", + "type": "image/png", + "form_factor": "narrow", + "label": "Empty Chip (Mobile)" + } + ], + "start_url": ".", + "id": "/web-ide/", + "display": "standalone", + "theme_color": "rgb(16, 149, 193)", + "background_color": "#ffffff" +} diff --git a/web-ide-main/web/public/pico.min.css b/web-ide-main/web/public/pico.min.css new file mode 100644 index 0000000..b7bbabb --- /dev/null +++ b/web-ide-main/web/public/pico.min.css @@ -0,0 +1,5 @@ +@charset "UTF-8";/*! + * Pico CSS v1.5.13 (https://picocss.com) + * Copyright 2019-2024 - Licensed under MIT + */:root{--font-family:system-ui,-apple-system,"Segoe UI","Roboto","Ubuntu","Cantarell","Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--line-height:1.5;--font-weight:400;--font-size:16px;--border-radius:0.25rem;--border-width:1px;--outline-width:3px;--spacing:1rem;--typography-spacing-vertical:1.5rem;--block-spacing-vertical:calc(var(--spacing) * 2);--block-spacing-horizontal:var(--spacing);--grid-spacing-vertical:0;--grid-spacing-horizontal:var(--spacing);--form-element-spacing-vertical:0.75rem;--form-element-spacing-horizontal:1rem;--nav-element-spacing-vertical:1rem;--nav-element-spacing-horizontal:0.5rem;--nav-link-spacing-vertical:0.5rem;--nav-link-spacing-horizontal:0.5rem;--form-label-font-weight:var(--font-weight);--transition:0.2s ease-in-out;--modal-overlay-backdrop-filter:blur(0.25rem)}@media (min-width:576px){:root{--font-size:17px}}@media (min-width:768px){:root{--font-size:18px}}@media (min-width:992px){:root{--font-size:19px}}@media (min-width:1200px){:root{--font-size:20px}}@media (min-width:576px){body>footer,body>header,body>main,section{--block-spacing-vertical:calc(var(--spacing) * 2.5)}}@media (min-width:768px){body>footer,body>header,body>main,section{--block-spacing-vertical:calc(var(--spacing) * 3)}}@media (min-width:992px){body>footer,body>header,body>main,section{--block-spacing-vertical:calc(var(--spacing) * 3.5)}}@media (min-width:1200px){body>footer,body>header,body>main,section{--block-spacing-vertical:calc(var(--spacing) * 4)}}@media (min-width:576px){article{--block-spacing-horizontal:calc(var(--spacing) * 1.25)}}@media (min-width:768px){article{--block-spacing-horizontal:calc(var(--spacing) * 1.5)}}@media (min-width:992px){article{--block-spacing-horizontal:calc(var(--spacing) * 1.75)}}@media (min-width:1200px){article{--block-spacing-horizontal:calc(var(--spacing) * 2)}}dialog>article{--block-spacing-vertical:calc(var(--spacing) * 2);--block-spacing-horizontal:var(--spacing)}@media (min-width:576px){dialog>article{--block-spacing-vertical:calc(var(--spacing) * 2.5);--block-spacing-horizontal:calc(var(--spacing) * 1.25)}}@media (min-width:768px){dialog>article{--block-spacing-vertical:calc(var(--spacing) * 3);--block-spacing-horizontal:calc(var(--spacing) * 1.5)}}a{--text-decoration:none}a.contrast,a.secondary{--text-decoration:underline}small{--font-size:0.875em}h1,h2,h3,h4,h5,h6{--font-weight:700}h1{--font-size:2rem;--typography-spacing-vertical:3rem}h2{--font-size:1.75rem;--typography-spacing-vertical:2.625rem}h3{--font-size:1.5rem;--typography-spacing-vertical:2.25rem}h4{--font-size:1.25rem;--typography-spacing-vertical:1.874rem}h5{--font-size:1.125rem;--typography-spacing-vertical:1.6875rem}[type=checkbox],[type=radio]{--border-width:2px}[type=checkbox][role=switch]{--border-width:3px}tfoot td,tfoot th,thead td,thead th{--border-width:3px}:not(thead,tfoot)>*>td{--font-size:0.875em}code,kbd,pre,samp{--font-family:"Menlo","Consolas","Roboto Mono","Ubuntu Monospace","Noto Mono","Oxygen Mono","Liberation Mono",monospace,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}kbd{--font-weight:bolder}:root:not([data-theme=dark]),[data-theme=light]{--background-color:#fff;--color:hsl(205, 20%, 32%);--h1-color:hsl(205, 30%, 15%);--h2-color:#24333e;--h3-color:hsl(205, 25%, 23%);--h4-color:#374956;--h5-color:hsl(205, 20%, 32%);--h6-color:#4d606d;--muted-color:hsl(205, 10%, 50%);--muted-border-color:hsl(205, 20%, 94%);--primary:hsl(195, 85%, 41%);--primary-hover:hsl(195, 90%, 32%);--primary-focus:rgba(16, 149, 193, 0.125);--primary-inverse:#fff;--secondary:hsl(205, 15%, 41%);--secondary-hover:hsl(205, 20%, 32%);--secondary-focus:rgba(89, 107, 120, 0.125);--secondary-inverse:#fff;--contrast:hsl(205, 30%, 15%);--contrast-hover:#000;--contrast-focus:rgba(89, 107, 120, 0.125);--contrast-inverse:#fff;--mark-background-color:#fff2ca;--mark-color:#543a26;--ins-color:#388e3c;--del-color:#c62828;--blockquote-border-color:var(--muted-border-color);--blockquote-footer-color:var(--muted-color);--button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--form-element-background-color:transparent;--form-element-border-color:hsl(205, 14%, 68%);--form-element-color:var(--color);--form-element-placeholder-color:var(--muted-color);--form-element-active-background-color:transparent;--form-element-active-border-color:var(--primary);--form-element-focus-color:var(--primary-focus);--form-element-disabled-background-color:hsl(205, 18%, 86%);--form-element-disabled-border-color:hsl(205, 14%, 68%);--form-element-disabled-opacity:0.5;--form-element-invalid-border-color:#c62828;--form-element-invalid-active-border-color:#d32f2f;--form-element-invalid-focus-color:rgba(211, 47, 47, 0.125);--form-element-valid-border-color:#388e3c;--form-element-valid-active-border-color:#43a047;--form-element-valid-focus-color:rgba(67, 160, 71, 0.125);--switch-background-color:hsl(205, 16%, 77%);--switch-color:var(--primary-inverse);--switch-checked-background-color:var(--primary);--range-border-color:hsl(205, 18%, 86%);--range-active-border-color:hsl(205, 16%, 77%);--range-thumb-border-color:var(--background-color);--range-thumb-color:var(--secondary);--range-thumb-hover-color:var(--secondary-hover);--range-thumb-active-color:var(--primary);--table-border-color:var(--muted-border-color);--table-row-stripped-background-color:#f6f8f9;--code-background-color:hsl(205, 20%, 94%);--code-color:var(--muted-color);--code-kbd-background-color:var(--contrast);--code-kbd-color:var(--contrast-inverse);--code-tag-color:hsl(330, 40%, 50%);--code-property-color:hsl(185, 40%, 40%);--code-value-color:hsl(40, 20%, 50%);--code-comment-color:hsl(205, 14%, 68%);--accordion-border-color:var(--muted-border-color);--accordion-close-summary-color:var(--color);--accordion-open-summary-color:var(--muted-color);--card-background-color:var(--background-color);--card-border-color:var(--muted-border-color);--card-box-shadow:0.0145rem 0.029rem 0.174rem rgba(27, 40, 50, 0.01698),0.0335rem 0.067rem 0.402rem rgba(27, 40, 50, 0.024),0.0625rem 0.125rem 0.75rem rgba(27, 40, 50, 0.03),0.1125rem 0.225rem 1.35rem rgba(27, 40, 50, 0.036),0.2085rem 0.417rem 2.502rem rgba(27, 40, 50, 0.04302),0.5rem 1rem 6rem rgba(27, 40, 50, 0.06),0 0 0 0.0625rem rgba(27, 40, 50, 0.015);--card-sectionning-background-color:#fbfbfc;--dropdown-background-color:#fbfbfc;--dropdown-border-color:#e1e6eb;--dropdown-box-shadow:var(--card-box-shadow);--dropdown-color:var(--color);--dropdown-hover-background-color:hsl(205, 20%, 94%);--modal-overlay-background-color:rgba(213, 220, 226, 0.7);--progress-background-color:hsl(205, 18%, 86%);--progress-color:var(--primary);--loading-spinner-opacity:0.5;--tooltip-background-color:var(--contrast);--tooltip-color:var(--contrast-inverse);--icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button-inverse:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(198, 40, 40)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");--icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(56, 142, 60)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");color-scheme:light}@media only screen and (prefers-color-scheme:dark){:root:not([data-theme]){--background-color:#11191f;--color:hsl(205, 16%, 77%);--h1-color:hsl(205, 20%, 94%);--h2-color:#e1e6eb;--h3-color:hsl(205, 18%, 86%);--h4-color:#c8d1d8;--h5-color:hsl(205, 16%, 77%);--h6-color:#afbbc4;--muted-color:hsl(205, 10%, 50%);--muted-border-color:#1f2d38;--primary:hsl(195, 85%, 41%);--primary-hover:hsl(195, 80%, 50%);--primary-focus:rgba(16, 149, 193, 0.25);--primary-inverse:#fff;--secondary:hsl(205, 15%, 41%);--secondary-hover:hsl(205, 10%, 50%);--secondary-focus:rgba(115, 130, 140, 0.25);--secondary-inverse:#fff;--contrast:hsl(205, 20%, 94%);--contrast-hover:#fff;--contrast-focus:rgba(115, 130, 140, 0.25);--contrast-inverse:#000;--mark-background-color:#d1c284;--mark-color:#11191f;--ins-color:#388e3c;--del-color:#c62828;--blockquote-border-color:var(--muted-border-color);--blockquote-footer-color:var(--muted-color);--button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--form-element-background-color:#11191f;--form-element-border-color:#374956;--form-element-color:var(--color);--form-element-placeholder-color:var(--muted-color);--form-element-active-background-color:var(--form-element-background-color);--form-element-active-border-color:var(--primary);--form-element-focus-color:var(--primary-focus);--form-element-disabled-background-color:hsl(205, 25%, 23%);--form-element-disabled-border-color:hsl(205, 20%, 32%);--form-element-disabled-opacity:0.5;--form-element-invalid-border-color:#b71c1c;--form-element-invalid-active-border-color:#c62828;--form-element-invalid-focus-color:rgba(198, 40, 40, 0.25);--form-element-valid-border-color:#2e7d32;--form-element-valid-active-border-color:#388e3c;--form-element-valid-focus-color:rgba(56, 142, 60, 0.25);--switch-background-color:#374956;--switch-color:var(--primary-inverse);--switch-checked-background-color:var(--primary);--range-border-color:#24333e;--range-active-border-color:hsl(205, 25%, 23%);--range-thumb-border-color:var(--background-color);--range-thumb-color:var(--secondary);--range-thumb-hover-color:var(--secondary-hover);--range-thumb-active-color:var(--primary);--table-border-color:var(--muted-border-color);--table-row-stripped-background-color:rgba(115, 130, 140, 0.05);--code-background-color:#18232c;--code-color:var(--muted-color);--code-kbd-background-color:var(--contrast);--code-kbd-color:var(--contrast-inverse);--code-tag-color:hsl(330, 30%, 50%);--code-property-color:hsl(185, 30%, 50%);--code-value-color:hsl(40, 10%, 50%);--code-comment-color:#4d606d;--accordion-border-color:var(--muted-border-color);--accordion-active-summary-color:var(--primary);--accordion-close-summary-color:var(--color);--accordion-open-summary-color:var(--muted-color);--card-background-color:#141e26;--card-border-color:var(--card-background-color);--card-box-shadow:0.0145rem 0.029rem 0.174rem rgba(0, 0, 0, 0.01698),0.0335rem 0.067rem 0.402rem rgba(0, 0, 0, 0.024),0.0625rem 0.125rem 0.75rem rgba(0, 0, 0, 0.03),0.1125rem 0.225rem 1.35rem rgba(0, 0, 0, 0.036),0.2085rem 0.417rem 2.502rem rgba(0, 0, 0, 0.04302),0.5rem 1rem 6rem rgba(0, 0, 0, 0.06),0 0 0 0.0625rem rgba(0, 0, 0, 0.015);--card-sectionning-background-color:#18232c;--dropdown-background-color:hsl(205, 30%, 15%);--dropdown-border-color:#24333e;--dropdown-box-shadow:var(--card-box-shadow);--dropdown-color:var(--color);--dropdown-hover-background-color:rgba(36, 51, 62, 0.75);--modal-overlay-background-color:rgba(36, 51, 62, 0.8);--progress-background-color:#24333e;--progress-color:var(--primary);--loading-spinner-opacity:0.5;--tooltip-background-color:var(--contrast);--tooltip-color:var(--contrast-inverse);--icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button-inverse:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(0, 0, 0)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(183, 28, 28)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");--icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(46, 125, 50)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");color-scheme:dark}}[data-theme=dark]{--background-color:#11191f;--color:hsl(205, 16%, 77%);--h1-color:hsl(205, 20%, 94%);--h2-color:#e1e6eb;--h3-color:hsl(205, 18%, 86%);--h4-color:#c8d1d8;--h5-color:hsl(205, 16%, 77%);--h6-color:#afbbc4;--muted-color:hsl(205, 10%, 50%);--muted-border-color:#1f2d38;--primary:hsl(195, 85%, 41%);--primary-hover:hsl(195, 80%, 50%);--primary-focus:rgba(16, 149, 193, 0.25);--primary-inverse:#fff;--secondary:hsl(205, 15%, 41%);--secondary-hover:hsl(205, 10%, 50%);--secondary-focus:rgba(115, 130, 140, 0.25);--secondary-inverse:#fff;--contrast:hsl(205, 20%, 94%);--contrast-hover:#fff;--contrast-focus:rgba(115, 130, 140, 0.25);--contrast-inverse:#000;--mark-background-color:#d1c284;--mark-color:#11191f;--ins-color:#388e3c;--del-color:#c62828;--blockquote-border-color:var(--muted-border-color);--blockquote-footer-color:var(--muted-color);--button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--form-element-background-color:#11191f;--form-element-border-color:#374956;--form-element-color:var(--color);--form-element-placeholder-color:var(--muted-color);--form-element-active-background-color:var(--form-element-background-color);--form-element-active-border-color:var(--primary);--form-element-focus-color:var(--primary-focus);--form-element-disabled-background-color:hsl(205, 25%, 23%);--form-element-disabled-border-color:hsl(205, 20%, 32%);--form-element-disabled-opacity:0.5;--form-element-invalid-border-color:#b71c1c;--form-element-invalid-active-border-color:#c62828;--form-element-invalid-focus-color:rgba(198, 40, 40, 0.25);--form-element-valid-border-color:#2e7d32;--form-element-valid-active-border-color:#388e3c;--form-element-valid-focus-color:rgba(56, 142, 60, 0.25);--switch-background-color:#374956;--switch-color:var(--primary-inverse);--switch-checked-background-color:var(--primary);--range-border-color:#24333e;--range-active-border-color:hsl(205, 25%, 23%);--range-thumb-border-color:var(--background-color);--range-thumb-color:var(--secondary);--range-thumb-hover-color:var(--secondary-hover);--range-thumb-active-color:var(--primary);--table-border-color:var(--muted-border-color);--table-row-stripped-background-color:rgba(115, 130, 140, 0.05);--code-background-color:#18232c;--code-color:var(--muted-color);--code-kbd-background-color:var(--contrast);--code-kbd-color:var(--contrast-inverse);--code-tag-color:hsl(330, 30%, 50%);--code-property-color:hsl(185, 30%, 50%);--code-value-color:hsl(40, 10%, 50%);--code-comment-color:#4d606d;--accordion-border-color:var(--muted-border-color);--accordion-active-summary-color:var(--primary);--accordion-close-summary-color:var(--color);--accordion-open-summary-color:var(--muted-color);--card-background-color:#141e26;--card-border-color:var(--card-background-color);--card-box-shadow:0.0145rem 0.029rem 0.174rem rgba(0, 0, 0, 0.01698),0.0335rem 0.067rem 0.402rem rgba(0, 0, 0, 0.024),0.0625rem 0.125rem 0.75rem rgba(0, 0, 0, 0.03),0.1125rem 0.225rem 1.35rem rgba(0, 0, 0, 0.036),0.2085rem 0.417rem 2.502rem rgba(0, 0, 0, 0.04302),0.5rem 1rem 6rem rgba(0, 0, 0, 0.06),0 0 0 0.0625rem rgba(0, 0, 0, 0.015);--card-sectionning-background-color:#18232c;--dropdown-background-color:hsl(205, 30%, 15%);--dropdown-border-color:#24333e;--dropdown-box-shadow:var(--card-box-shadow);--dropdown-color:var(--color);--dropdown-hover-background-color:rgba(36, 51, 62, 0.75);--modal-overlay-background-color:rgba(36, 51, 62, 0.8);--progress-background-color:#24333e;--progress-color:var(--primary);--loading-spinner-opacity:0.5;--tooltip-background-color:var(--contrast);--tooltip-color:var(--contrast-inverse);--icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button-inverse:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(0, 0, 0)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(183, 28, 28)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");--icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(46, 125, 50)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");color-scheme:dark}[type=checkbox],[type=radio],[type=range],progress{accent-color:var(--primary)}*,::after,::before{box-sizing:border-box;background-repeat:no-repeat}::after,::before{text-decoration:inherit;vertical-align:inherit}:where(:root){-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--background-color);color:var(--color);font-weight:var(--font-weight);font-size:var(--font-size);line-height:var(--line-height);font-family:var(--font-family);text-rendering:optimizeLegibility;overflow-wrap:break-word;cursor:default;-moz-tab-size:4;-o-tab-size:4;tab-size:4}main{display:block}body{width:100%;margin:0}body>footer,body>header,body>main{width:100%;margin-right:auto;margin-left:auto;padding:var(--block-spacing-vertical) 0}.container,.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:var(--spacing);padding-left:var(--spacing)}@media (min-width:576px){.container{max-width:510px;padding-right:0;padding-left:0}}@media (min-width:768px){.container{max-width:700px}}@media (min-width:992px){.container{max-width:920px}}@media (min-width:1200px){.container{max-width:1130px}}section{margin-bottom:var(--block-spacing-vertical)}.grid{grid-column-gap:var(--grid-spacing-horizontal);grid-row-gap:var(--grid-spacing-vertical);display:grid;grid-template-columns:1fr;margin:0}@media (min-width:992px){.grid{grid-template-columns:repeat(auto-fit,minmax(0%,1fr))}}.grid>*{min-width:0}figure{display:block;margin:0;padding:0;overflow-x:auto}figure figcaption{padding:calc(var(--spacing) * .5) 0;color:var(--muted-color)}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}address,blockquote,dl,figure,form,ol,p,pre,table,ul{margin-top:0;margin-bottom:var(--typography-spacing-vertical);color:var(--color);font-style:normal;font-weight:var(--font-weight);font-size:var(--font-size)}[role=link],a{--color:var(--primary);--background-color:transparent;outline:0;background-color:var(--background-color);color:var(--color);-webkit-text-decoration:var(--text-decoration);text-decoration:var(--text-decoration);transition:background-color var(--transition),color var(--transition),box-shadow var(--transition),-webkit-text-decoration var(--transition);transition:background-color var(--transition),color var(--transition),text-decoration var(--transition),box-shadow var(--transition);transition:background-color var(--transition),color var(--transition),text-decoration var(--transition),box-shadow var(--transition),-webkit-text-decoration var(--transition)}[role=link]:is([aria-current],:hover,:active,:focus),a:is([aria-current],:hover,:active,:focus){--color:var(--primary-hover);--text-decoration:underline}[role=link]:focus,a:focus{--background-color:var(--primary-focus)}[role=link].secondary,a.secondary{--color:var(--secondary)}[role=link].secondary:is([aria-current],:hover,:active,:focus),a.secondary:is([aria-current],:hover,:active,:focus){--color:var(--secondary-hover)}[role=link].secondary:focus,a.secondary:focus{--background-color:var(--secondary-focus)}[role=link].contrast,a.contrast{--color:var(--contrast)}[role=link].contrast:is([aria-current],:hover,:active,:focus),a.contrast:is([aria-current],:hover,:active,:focus){--color:var(--contrast-hover)}[role=link].contrast:focus,a.contrast:focus{--background-color:var(--contrast-focus)}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:var(--typography-spacing-vertical);color:var(--color);font-weight:var(--font-weight);font-size:var(--font-size);font-family:var(--font-family)}h1{--color:var(--h1-color)}h2{--color:var(--h2-color)}h3{--color:var(--h3-color)}h4{--color:var(--h4-color)}h5{--color:var(--h5-color)}h6{--color:var(--h6-color)}:where(address,blockquote,dl,figure,form,ol,p,pre,table,ul)~:is(h1,h2,h3,h4,h5,h6){margin-top:var(--typography-spacing-vertical)}.headings,hgroup{margin-bottom:var(--typography-spacing-vertical)}.headings>*,hgroup>*{margin-bottom:0}.headings>:last-child,hgroup>:last-child{--color:var(--muted-color);--font-weight:unset;font-size:1rem;font-family:unset}p{margin-bottom:var(--typography-spacing-vertical)}small{font-size:var(--font-size)}:where(dl,ol,ul){padding-right:0;padding-left:var(--spacing);padding-inline-start:var(--spacing);padding-inline-end:0}:where(dl,ol,ul) li{margin-bottom:calc(var(--typography-spacing-vertical) * .25)}:where(dl,ol,ul) :is(dl,ol,ul){margin:0;margin-top:calc(var(--typography-spacing-vertical) * .25)}ul li{list-style:square}mark{padding:.125rem .25rem;background-color:var(--mark-background-color);color:var(--mark-color);vertical-align:baseline}blockquote{display:block;margin:var(--typography-spacing-vertical) 0;padding:var(--spacing);border-right:none;border-left:.25rem solid var(--blockquote-border-color);border-inline-start:0.25rem solid var(--blockquote-border-color);border-inline-end:none}blockquote footer{margin-top:calc(var(--typography-spacing-vertical) * .5);color:var(--blockquote-footer-color)}abbr[title]{border-bottom:1px dotted;text-decoration:none;cursor:help}ins{color:var(--ins-color);text-decoration:none}del{color:var(--del-color)}::-moz-selection{background-color:var(--primary-focus)}::selection{background-color:var(--primary-focus)}:where(audio,canvas,iframe,img,svg,video){vertical-align:middle}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}:where(iframe){border-style:none}img{max-width:100%;height:auto;border-style:none}:where(svg:not([fill])){fill:currentColor}svg:not(:root){overflow:hidden}button{margin:0;overflow:visible;font-family:inherit;text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}button{display:block;width:100%;margin-bottom:var(--spacing)}[role=button]{display:inline-block;text-decoration:none}[role=button],button,input[type=button],input[type=reset],input[type=submit]{--background-color:var(--primary);--border-color:var(--primary);--color:var(--primary-inverse);--box-shadow:var(--button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));padding:var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal);border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);outline:0;background-color:var(--background-color);box-shadow:var(--box-shadow);color:var(--color);font-weight:var(--font-weight);font-size:1rem;line-height:var(--line-height);text-align:center;cursor:pointer;transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}[role=button]:is([aria-current],:hover,:active,:focus),button:is([aria-current],:hover,:active,:focus),input[type=button]:is([aria-current],:hover,:active,:focus),input[type=reset]:is([aria-current],:hover,:active,:focus),input[type=submit]:is([aria-current],:hover,:active,:focus){--background-color:var(--primary-hover);--border-color:var(--primary-hover);--box-shadow:var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0));--color:var(--primary-inverse)}[role=button]:focus,button:focus,input[type=button]:focus,input[type=reset]:focus,input[type=submit]:focus{--box-shadow:var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--outline-width) var(--primary-focus)}:is(button,input[type=submit],input[type=button],[role=button]).secondary,input[type=reset]{--background-color:var(--secondary);--border-color:var(--secondary);--color:var(--secondary-inverse);cursor:pointer}:is(button,input[type=submit],input[type=button],[role=button]).secondary:is([aria-current],:hover,:active,:focus),input[type=reset]:is([aria-current],:hover,:active,:focus){--background-color:var(--secondary-hover);--border-color:var(--secondary-hover);--color:var(--secondary-inverse)}:is(button,input[type=submit],input[type=button],[role=button]).secondary:focus,input[type=reset]:focus{--box-shadow:var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--outline-width) var(--secondary-focus)}:is(button,input[type=submit],input[type=button],[role=button]).contrast{--background-color:var(--contrast);--border-color:var(--contrast);--color:var(--contrast-inverse)}:is(button,input[type=submit],input[type=button],[role=button]).contrast:is([aria-current],:hover,:active,:focus){--background-color:var(--contrast-hover);--border-color:var(--contrast-hover);--color:var(--contrast-inverse)}:is(button,input[type=submit],input[type=button],[role=button]).contrast:focus{--box-shadow:var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--outline-width) var(--contrast-focus)}:is(button,input[type=submit],input[type=button],[role=button]).outline,input[type=reset].outline{--background-color:transparent;--color:var(--primary)}:is(button,input[type=submit],input[type=button],[role=button]).outline:is([aria-current],:hover,:active,:focus),input[type=reset].outline:is([aria-current],:hover,:active,:focus){--background-color:transparent;--color:var(--primary-hover)}:is(button,input[type=submit],input[type=button],[role=button]).outline.secondary,input[type=reset].outline{--color:var(--secondary)}:is(button,input[type=submit],input[type=button],[role=button]).outline.secondary:is([aria-current],:hover,:active,:focus),input[type=reset].outline:is([aria-current],:hover,:active,:focus){--color:var(--secondary-hover)}:is(button,input[type=submit],input[type=button],[role=button]).outline.contrast{--color:var(--contrast)}:is(button,input[type=submit],input[type=button],[role=button]).outline.contrast:is([aria-current],:hover,:active,:focus){--color:var(--contrast-hover)}:where(button,[type=submit],[type=button],[type=reset],[role=button])[disabled],:where(fieldset[disabled]) :is(button,[type=submit],[type=button],[type=reset],[role=button]),a[role=button]:not([href]){opacity:.5;pointer-events:none}input,optgroup,select,textarea{margin:0;font-size:1rem;line-height:var(--line-height);font-family:inherit;letter-spacing:inherit}input{overflow:visible}select{text-transform:none}legend{max-width:100%;padding:0;color:inherit;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{padding:0}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}::-moz-focus-inner{padding:0;border-style:none}:-moz-focusring{outline:0}:-moz-ui-invalid{box-shadow:none}::-ms-expand{display:none}[type=file],[type=range]{padding:0;border-width:0}input:not([type=checkbox],[type=radio],[type=range]){height:calc(1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 + var(--border-width) * 2)}fieldset{margin:0;margin-bottom:var(--spacing);padding:0;border:0}fieldset legend,label{display:block;margin-bottom:calc(var(--spacing) * .25);font-weight:var(--form-label-font-weight,var(--font-weight))}input:not([type=checkbox],[type=radio]),select,textarea{width:100%}input:not([type=checkbox],[type=radio],[type=range],[type=file]),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal)}input,select,textarea{--background-color:var(--form-element-background-color);--border-color:var(--form-element-border-color);--color:var(--form-element-color);--box-shadow:none;border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);outline:0;background-color:var(--background-color);box-shadow:var(--box-shadow);color:var(--color);font-weight:var(--font-weight);transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}:where(select,textarea):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[readonly]):is(:active,:focus){--background-color:var(--form-element-active-background-color)}:where(select,textarea):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[role=switch],[readonly]):is(:active,:focus){--border-color:var(--form-element-active-border-color)}input:not([type=submit],[type=button],[type=reset],[type=range],[type=file],[readonly]):focus,select:focus,textarea:focus{--box-shadow:0 0 0 var(--outline-width) var(--form-element-focus-color)}:where(fieldset[disabled]) :is(input:not([type=submit],[type=button],[type=reset]),select,textarea),input:not([type=submit],[type=button],[type=reset])[disabled],select[disabled],textarea[disabled]{--background-color:var(--form-element-disabled-background-color);--border-color:var(--form-element-disabled-border-color);opacity:var(--form-element-disabled-opacity);pointer-events:none}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week])[aria-invalid]{padding-right:calc(var(--form-element-spacing-horizontal) + 1.5rem)!important;padding-left:var(--form-element-spacing-horizontal);padding-inline-start:var(--form-element-spacing-horizontal)!important;padding-inline-end:calc(var(--form-element-spacing-horizontal) + 1.5rem)!important;background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week])[aria-invalid=false]{background-image:var(--icon-valid)}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week])[aria-invalid=true]{background-image:var(--icon-invalid)}:where(input,select,textarea)[aria-invalid=false]{--border-color:var(--form-element-valid-border-color)}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus){--border-color:var(--form-element-valid-active-border-color)!important;--box-shadow:0 0 0 var(--outline-width) var(--form-element-valid-focus-color)!important}:where(input,select,textarea)[aria-invalid=true]{--border-color:var(--form-element-invalid-border-color)}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus){--border-color:var(--form-element-invalid-active-border-color)!important;--box-shadow:0 0 0 var(--outline-width) var(--form-element-invalid-focus-color)!important}[dir=rtl] :where(input,select,textarea):not([type=checkbox],[type=radio]):is([aria-invalid],[aria-invalid=true],[aria-invalid=false]){background-position:center left .75rem}input::-webkit-input-placeholder,input::placeholder,select:invalid,textarea::-webkit-input-placeholder,textarea::placeholder{color:var(--form-element-placeholder-color);opacity:1}input:not([type=checkbox],[type=radio]),select,textarea{margin-bottom:var(--spacing)}select::-ms-expand{border:0;background-color:transparent}select:not([multiple],[size]){padding-right:calc(var(--form-element-spacing-horizontal) + 1.5rem);padding-left:var(--form-element-spacing-horizontal);padding-inline-start:var(--form-element-spacing-horizontal);padding-inline-end:calc(var(--form-element-spacing-horizontal) + 1.5rem);background-image:var(--icon-chevron);background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}[dir=rtl] select:not([multiple],[size]){background-position:center left .75rem}:where(input,select,textarea,.grid)+small{display:block;width:100%;margin-top:calc(var(--spacing) * -.75);margin-bottom:var(--spacing);color:var(--muted-color)}label>:where(input,select,textarea){margin-top:calc(var(--spacing) * .25)}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:1.25em;height:1.25em;margin-top:-.125em;margin-right:.375em;margin-left:0;margin-inline-start:0;margin-inline-end:.375em;border-width:var(--border-width);font-size:inherit;vertical-align:middle;cursor:pointer}[type=checkbox]::-ms-check,[type=radio]::-ms-check{display:none}[type=checkbox]:checked,[type=checkbox]:checked:active,[type=checkbox]:checked:focus,[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--background-color:var(--primary);--border-color:var(--primary);background-image:var(--icon-checkbox);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=checkbox]~label,[type=radio]~label{display:inline-block;margin-right:.375em;margin-bottom:0;cursor:pointer}[type=checkbox]:indeterminate{--background-color:var(--primary);--border-color:var(--primary);background-image:var(--icon-minus);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=radio]{border-radius:50%}[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--background-color:var(--primary-inverse);border-width:.35em;background-image:none}[type=checkbox][role=switch]{--background-color:var(--switch-background-color);--border-color:var(--switch-background-color);--color:var(--switch-color);width:2.25em;height:1.25em;border:var(--border-width) solid var(--border-color);border-radius:1.25em;background-color:var(--background-color);line-height:1.25em}[type=checkbox][role=switch]:focus{--background-color:var(--switch-background-color);--border-color:var(--switch-background-color)}[type=checkbox][role=switch]:checked{--background-color:var(--switch-checked-background-color);--border-color:var(--switch-checked-background-color)}[type=checkbox][role=switch]:before{display:block;width:calc(1.25em - (var(--border-width) * 2));height:100%;border-radius:50%;background-color:var(--color);content:"";transition:margin .1s ease-in-out}[type=checkbox][role=switch]:checked{background-image:none}[type=checkbox][role=switch]:checked::before{margin-left:calc(1.125em - var(--border-width));margin-inline-start:calc(1.125em - var(--border-width))}[type=checkbox]:checked[aria-invalid=false],[type=checkbox][aria-invalid=false],[type=checkbox][role=switch]:checked[aria-invalid=false],[type=checkbox][role=switch][aria-invalid=false],[type=radio]:checked[aria-invalid=false],[type=radio][aria-invalid=false]{--border-color:var(--form-element-valid-border-color)}[type=checkbox]:checked[aria-invalid=true],[type=checkbox][aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true],[type=checkbox][role=switch][aria-invalid=true],[type=radio]:checked[aria-invalid=true],[type=radio][aria-invalid=true]{--border-color:var(--form-element-invalid-border-color)}[type=color]::-webkit-color-swatch-wrapper{padding:0}[type=color]::-moz-focus-inner{padding:0}[type=color]::-webkit-color-swatch{border:0;border-radius:calc(var(--border-radius) * .5)}[type=color]::-moz-color-swatch{border:0;border-radius:calc(var(--border-radius) * .5)}input:not([type=checkbox],[type=radio],[type=range],[type=file]):is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){--icon-position:0.75rem;--icon-width:1rem;padding-right:calc(var(--icon-width) + var(--icon-position));background-image:var(--icon-date);background-position:center right var(--icon-position);background-size:var(--icon-width) auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=time]{background-image:var(--icon-time)}[type=date]::-webkit-calendar-picker-indicator,[type=datetime-local]::-webkit-calendar-picker-indicator,[type=month]::-webkit-calendar-picker-indicator,[type=time]::-webkit-calendar-picker-indicator,[type=week]::-webkit-calendar-picker-indicator{width:var(--icon-width);margin-right:calc(var(--icon-width) * -1);margin-left:var(--icon-position);opacity:0}[dir=rtl] :is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){text-align:right}@-moz-document url-prefix(){[type=date],[type=datetime-local],[type=month],[type=time],[type=week]{padding-right:var(--form-element-spacing-horizontal)!important;background-image:none!important}}[type=file]{--color:var(--muted-color);padding:calc(var(--form-element-spacing-vertical) * .5) 0;border:0;border-radius:0;background:0 0}[type=file]::file-selector-button{--background-color:var(--secondary);--border-color:var(--secondary);--color:var(--secondary-inverse);margin-right:calc(var(--spacing)/ 2);margin-left:0;margin-inline-start:0;margin-inline-end:calc(var(--spacing)/ 2);padding:calc(var(--form-element-spacing-vertical) * .5) calc(var(--form-element-spacing-horizontal) * .5);border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);outline:0;background-color:var(--background-color);box-shadow:var(--box-shadow);color:var(--color);font-weight:var(--font-weight);font-size:1rem;line-height:var(--line-height);text-align:center;cursor:pointer;transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}[type=file]::file-selector-button:is(:hover,:active,:focus){--background-color:var(--secondary-hover);--border-color:var(--secondary-hover)}[type=file]::-webkit-file-upload-button{--background-color:var(--secondary);--border-color:var(--secondary);--color:var(--secondary-inverse);margin-right:calc(var(--spacing)/ 2);margin-left:0;margin-inline-start:0;margin-inline-end:calc(var(--spacing)/ 2);padding:calc(var(--form-element-spacing-vertical) * .5) calc(var(--form-element-spacing-horizontal) * .5);border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);outline:0;background-color:var(--background-color);box-shadow:var(--box-shadow);color:var(--color);font-weight:var(--font-weight);font-size:1rem;line-height:var(--line-height);text-align:center;cursor:pointer;-webkit-transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition);transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}[type=file]::-webkit-file-upload-button:is(:hover,:active,:focus){--background-color:var(--secondary-hover);--border-color:var(--secondary-hover)}[type=file]::-ms-browse{--background-color:var(--secondary);--border-color:var(--secondary);--color:var(--secondary-inverse);margin-right:calc(var(--spacing)/ 2);margin-left:0;margin-inline-start:0;margin-inline-end:calc(var(--spacing)/ 2);padding:calc(var(--form-element-spacing-vertical) * .5) calc(var(--form-element-spacing-horizontal) * .5);border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);outline:0;background-color:var(--background-color);box-shadow:var(--box-shadow);color:var(--color);font-weight:var(--font-weight);font-size:1rem;line-height:var(--line-height);text-align:center;cursor:pointer;-ms-transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition);transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}[type=file]::-ms-browse:is(:hover,:active,:focus){--background-color:var(--secondary-hover);--border-color:var(--secondary-hover)}[type=range]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:1.25rem;background:0 0}[type=range]::-webkit-slider-runnable-track{width:100%;height:.25rem;border-radius:var(--border-radius);background-color:var(--range-border-color);-webkit-transition:background-color var(--transition),box-shadow var(--transition);transition:background-color var(--transition),box-shadow var(--transition)}[type=range]::-moz-range-track{width:100%;height:.25rem;border-radius:var(--border-radius);background-color:var(--range-border-color);-moz-transition:background-color var(--transition),box-shadow var(--transition);transition:background-color var(--transition),box-shadow var(--transition)}[type=range]::-ms-track{width:100%;height:.25rem;border-radius:var(--border-radius);background-color:var(--range-border-color);-ms-transition:background-color var(--transition),box-shadow var(--transition);transition:background-color var(--transition),box-shadow var(--transition)}[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.5rem;border:2px solid var(--range-thumb-border-color);border-radius:50%;background-color:var(--range-thumb-color);cursor:pointer;-webkit-transition:background-color var(--transition),transform var(--transition);transition:background-color var(--transition),transform var(--transition)}[type=range]::-moz-range-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.5rem;border:2px solid var(--range-thumb-border-color);border-radius:50%;background-color:var(--range-thumb-color);cursor:pointer;-moz-transition:background-color var(--transition),transform var(--transition);transition:background-color var(--transition),transform var(--transition)}[type=range]::-ms-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.5rem;border:2px solid var(--range-thumb-border-color);border-radius:50%;background-color:var(--range-thumb-color);cursor:pointer;-ms-transition:background-color var(--transition),transform var(--transition);transition:background-color var(--transition),transform var(--transition)}[type=range]:focus,[type=range]:hover{--range-border-color:var(--range-active-border-color);--range-thumb-color:var(--range-thumb-hover-color)}[type=range]:active{--range-thumb-color:var(--range-thumb-active-color)}[type=range]:active::-webkit-slider-thumb{transform:scale(1.25)}[type=range]:active::-moz-range-thumb{transform:scale(1.25)}[type=range]:active::-ms-thumb{transform:scale(1.25)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{padding-inline-start:calc(var(--form-element-spacing-horizontal) + 1.75rem);border-radius:5rem;background-image:var(--icon-search);background-position:center left 1.125rem;background-size:1rem auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{padding-inline-start:calc(var(--form-element-spacing-horizontal) + 1.75rem)!important;background-position:center left 1.125rem,center right .75rem}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=false]{background-image:var(--icon-search),var(--icon-valid)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=true]{background-image:var(--icon-search),var(--icon-invalid)}[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;display:none}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{background-position:center right 1.125rem}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{background-position:center right 1.125rem,center left .75rem}:where(table){width:100%;border-collapse:collapse;border-spacing:0;text-indent:0}td,th{padding:calc(var(--spacing)/ 2) var(--spacing);border-bottom:var(--border-width) solid var(--table-border-color);color:var(--color);font-weight:var(--font-weight);font-size:var(--font-size);text-align:left;text-align:start}tfoot td,tfoot th{border-top:var(--border-width) solid var(--table-border-color);border-bottom:0}table[role=grid] tbody tr:nth-child(odd){background-color:var(--table-row-stripped-background-color)}code,kbd,pre,samp{font-size:.875em;font-family:var(--font-family)}pre{-ms-overflow-style:scrollbar;overflow:auto}code,kbd,pre{border-radius:var(--border-radius);background:var(--code-background-color);color:var(--code-color);font-weight:var(--font-weight);line-height:initial}code,kbd{display:inline-block;padding:.375rem .5rem}pre{display:block;margin-bottom:var(--spacing);overflow-x:auto}pre>code{display:block;padding:var(--spacing);background:0 0;font-size:14px;line-height:var(--line-height)}code b{color:var(--code-tag-color);font-weight:var(--font-weight)}code i{color:var(--code-property-color);font-style:normal}code u{color:var(--code-value-color);text-decoration:none}code em{color:var(--code-comment-color);font-style:normal}kbd{background-color:var(--code-kbd-background-color);color:var(--code-kbd-color);vertical-align:baseline}hr{height:0;border:0;border-top:1px solid var(--muted-border-color);color:inherit}[hidden],template{display:none!important}canvas{display:inline-block}details{display:block;margin-bottom:var(--spacing);padding-bottom:var(--spacing);border-bottom:var(--border-width) solid var(--accordion-border-color)}details summary{line-height:1rem;list-style-type:none;cursor:pointer;transition:color var(--transition)}details summary:not([role]){color:var(--accordion-close-summary-color)}details summary::-webkit-details-marker{display:none}details summary::marker{display:none}details summary::-moz-list-bullet{list-style-type:none}details summary::after{display:block;width:1rem;height:1rem;margin-inline-start:calc(var(--spacing,1rem) * .5);float:right;transform:rotate(-90deg);background-image:var(--icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:"";transition:transform var(--transition)}details summary:focus{outline:0}details summary:focus:not([role=button]){color:var(--accordion-active-summary-color)}details summary[role=button]{width:100%;text-align:left}details summary[role=button]::after{height:calc(1rem * var(--line-height,1.5));background-image:var(--icon-chevron-button)}details summary[role=button]:not(.outline).contrast::after{background-image:var(--icon-chevron-button-inverse)}details[open]>summary{margin-bottom:calc(var(--spacing))}details[open]>summary:not([role]):not(:focus){color:var(--accordion-open-summary-color)}details[open]>summary::after{transform:rotate(0)}[dir=rtl] details summary{text-align:right}[dir=rtl] details summary::after{float:left;background-position:left center}article{margin:var(--block-spacing-vertical) 0;padding:var(--block-spacing-vertical) var(--block-spacing-horizontal);border-radius:var(--border-radius);background:var(--card-background-color);box-shadow:var(--card-box-shadow)}article>footer,article>header{margin-right:calc(var(--block-spacing-horizontal) * -1);margin-left:calc(var(--block-spacing-horizontal) * -1);padding:calc(var(--block-spacing-vertical) * .66) var(--block-spacing-horizontal);background-color:var(--card-sectionning-background-color)}article>header{margin-top:calc(var(--block-spacing-vertical) * -1);margin-bottom:var(--block-spacing-vertical);border-bottom:var(--border-width) solid var(--card-border-color);border-top-right-radius:var(--border-radius);border-top-left-radius:var(--border-radius)}article>footer{margin-top:var(--block-spacing-vertical);margin-bottom:calc(var(--block-spacing-vertical) * -1);border-top:var(--border-width) solid var(--card-border-color);border-bottom-right-radius:var(--border-radius);border-bottom-left-radius:var(--border-radius)}:root{--scrollbar-width:0px}dialog{display:flex;z-index:999;position:fixed;top:0;right:0;bottom:0;left:0;align-items:center;justify-content:center;width:inherit;min-width:100%;height:inherit;min-height:100%;padding:var(--spacing);border:0;-webkit-backdrop-filter:var(--modal-overlay-backdrop-filter);backdrop-filter:var(--modal-overlay-backdrop-filter);background-color:var(--modal-overlay-background-color);color:var(--color)}dialog article{max-height:calc(100vh - var(--spacing) * 2);overflow:auto}@media (min-width:576px){dialog article{max-width:510px}}@media (min-width:768px){dialog article{max-width:700px}}dialog article>footer,dialog article>header{padding:calc(var(--block-spacing-vertical) * .5) var(--block-spacing-horizontal)}dialog article>header .close{margin:0;margin-left:var(--spacing);float:right}dialog article>footer{text-align:right}dialog article>footer [role=button]{margin-bottom:0}dialog article>footer [role=button]:not(:first-of-type){margin-left:calc(var(--spacing) * .5)}dialog article p:last-of-type{margin:0}dialog article .close{display:block;width:1rem;height:1rem;margin-top:calc(var(--block-spacing-vertical) * -.5);margin-bottom:var(--typography-spacing-vertical);margin-left:auto;background-image:var(--icon-close);background-position:center;background-size:auto 1rem;background-repeat:no-repeat;opacity:.5;transition:opacity var(--transition)}dialog article .close:is([aria-current],:hover,:active,:focus){opacity:1}dialog:not([open]),dialog[open=false]{display:none}.modal-is-open{padding-right:var(--scrollbar-width,0);overflow:hidden;pointer-events:none;touch-action:none}.modal-is-open dialog{pointer-events:auto}:where(.modal-is-opening,.modal-is-closing) dialog,:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-duration:.2s;animation-timing-function:ease-in-out;animation-fill-mode:both}:where(.modal-is-opening,.modal-is-closing) dialog{animation-duration:.8s;animation-name:modal-overlay}:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-delay:.2s;animation-name:modal}.modal-is-closing dialog,.modal-is-closing dialog>article{animation-delay:0s;animation-direction:reverse}@keyframes modal-overlay{from{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:transparent}}@keyframes modal{from{transform:translateY(-100%);opacity:0}}:where(nav li)::before{float:left;content:"โ€‹"}nav,nav ul{display:flex}nav{justify-content:space-between}nav ol,nav ul{align-items:center;margin-bottom:0;padding:0;list-style:none}nav ol:first-of-type,nav ul:first-of-type{margin-left:calc(var(--nav-element-spacing-horizontal) * -1)}nav ol:last-of-type,nav ul:last-of-type{margin-right:calc(var(--nav-element-spacing-horizontal) * -1)}nav li{display:inline-block;margin:0;padding:var(--nav-element-spacing-vertical) var(--nav-element-spacing-horizontal)}nav li>*{--spacing:0}nav :where(a,[role=link]){display:inline-block;margin:calc(var(--nav-link-spacing-vertical) * -1) calc(var(--nav-link-spacing-horizontal) * -1);padding:var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);border-radius:var(--border-radius);text-decoration:none}nav :where(a,[role=link]):is([aria-current],:hover,:active,:focus){text-decoration:none}nav[aria-label=breadcrumb]{align-items:center;justify-content:start}nav[aria-label=breadcrumb] ul li:not(:first-child){margin-inline-start:var(--nav-link-spacing-horizontal)}nav[aria-label=breadcrumb] ul li:not(:last-child) ::after{position:absolute;width:calc(var(--nav-link-spacing-horizontal) * 2);margin-inline-start:calc(var(--nav-link-spacing-horizontal)/ 2);content:"/";color:var(--muted-color);text-align:center}nav[aria-label=breadcrumb] a[aria-current]{background-color:transparent;color:inherit;text-decoration:none;pointer-events:none}nav [role=button]{margin-right:inherit;margin-left:inherit;padding:var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal)}aside li,aside nav,aside ol,aside ul{display:block}aside li{padding:calc(var(--nav-element-spacing-vertical) * .5) var(--nav-element-spacing-horizontal)}aside li a{display:block}aside li [role=button]{margin:inherit}[dir=rtl] nav[aria-label=breadcrumb] ul li:not(:last-child) ::after{content:"\\"}progress{display:inline-block;vertical-align:baseline}progress{-webkit-appearance:none;-moz-appearance:none;display:inline-block;appearance:none;width:100%;height:.5rem;margin-bottom:calc(var(--spacing) * .5);overflow:hidden;border:0;border-radius:var(--border-radius);background-color:var(--progress-background-color);color:var(--progress-color)}progress::-webkit-progress-bar{border-radius:var(--border-radius);background:0 0}progress[value]::-webkit-progress-value{background-color:var(--progress-color)}progress::-moz-progress-bar{background-color:var(--progress-color)}@media (prefers-reduced-motion:no-preference){progress:indeterminate{background:var(--progress-background-color) linear-gradient(to right,var(--progress-color) 30%,var(--progress-background-color) 30%) top left/150% 150% no-repeat;animation:progress-indeterminate 1s linear infinite}progress:indeterminate[value]::-webkit-progress-value{background-color:transparent}progress:indeterminate::-moz-progress-bar{background-color:transparent}}@media (prefers-reduced-motion:no-preference){[dir=rtl] progress:indeterminate{animation-direction:reverse}}@keyframes progress-indeterminate{0%{background-position:200% 0}100%{background-position:-200% 0}}details[role=list],li[role=list]{position:relative}details[role=list] summary+ul,li[role=list]>ul{display:flex;z-index:99;position:absolute;top:auto;right:0;left:0;flex-direction:column;margin:0;padding:0;border:var(--border-width) solid var(--dropdown-border-color);border-radius:var(--border-radius);border-top-right-radius:0;border-top-left-radius:0;background-color:var(--dropdown-background-color);box-shadow:var(--card-box-shadow);color:var(--dropdown-color);white-space:nowrap}details[role=list] summary+ul li,li[role=list]>ul li{width:100%;margin-bottom:0;padding:calc(var(--form-element-spacing-vertical) * .5) var(--form-element-spacing-horizontal);list-style:none}details[role=list] summary+ul li:first-of-type,li[role=list]>ul li:first-of-type{margin-top:calc(var(--form-element-spacing-vertical) * .5)}details[role=list] summary+ul li:last-of-type,li[role=list]>ul li:last-of-type{margin-bottom:calc(var(--form-element-spacing-vertical) * .5)}details[role=list] summary+ul li a,li[role=list]>ul li a{display:block;margin:calc(var(--form-element-spacing-vertical) * -.5) calc(var(--form-element-spacing-horizontal) * -1);padding:calc(var(--form-element-spacing-vertical) * .5) var(--form-element-spacing-horizontal);overflow:hidden;color:var(--dropdown-color);text-decoration:none;text-overflow:ellipsis}details[role=list] summary+ul li a:hover,li[role=list]>ul li a:hover{background-color:var(--dropdown-hover-background-color)}details[role=list] summary::after,li[role=list]>a::after{display:block;width:1rem;height:calc(1rem * var(--line-height,1.5));margin-inline-start:.5rem;float:right;transform:rotate(0);background-image:var(--icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:""}details[role=list]{padding:0;border-bottom:none}details[role=list] summary{margin-bottom:0}details[role=list] summary:not([role]){height:calc(1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 + var(--border-width) * 2);padding:var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal);border:var(--border-width) solid var(--form-element-border-color);border-radius:var(--border-radius);background-color:var(--form-element-background-color);color:var(--form-element-placeholder-color);line-height:inherit;cursor:pointer;transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}details[role=list] summary:not([role]):active,details[role=list] summary:not([role]):focus{border-color:var(--form-element-active-border-color);background-color:var(--form-element-active-background-color)}details[role=list] summary:not([role]):focus{box-shadow:0 0 0 var(--outline-width) var(--form-element-focus-color)}details[role=list][open] summary{border-bottom-right-radius:0;border-bottom-left-radius:0}details[role=list][open] summary::before{display:block;z-index:1;position:fixed;top:0;right:0;bottom:0;left:0;background:0 0;content:"";cursor:default}nav details[role=list] summary,nav li[role=list] a{display:flex;direction:ltr}nav details[role=list] summary+ul,nav li[role=list]>ul{min-width:-moz-fit-content;min-width:fit-content;border-radius:var(--border-radius)}nav details[role=list] summary+ul li a,nav li[role=list]>ul li a{border-radius:0}nav details[role=list] summary,nav details[role=list] summary:not([role]){height:auto;padding:var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal)}nav details[role=list][open] summary{border-radius:var(--border-radius)}nav details[role=list] summary+ul{margin-top:var(--outline-width);margin-inline-start:0}nav details[role=list] summary[role=link]{margin-bottom:calc(var(--nav-link-spacing-vertical) * -1);line-height:var(--line-height)}nav details[role=list] summary[role=link]+ul{margin-top:calc(var(--nav-link-spacing-vertical) + var(--outline-width));margin-inline-start:calc(var(--nav-link-spacing-horizontal) * -1)}li[role=list] a:active~ul,li[role=list] a:focus~ul,li[role=list]:hover>ul{display:flex}li[role=list]>ul{display:none;margin-top:calc(var(--nav-link-spacing-vertical) + var(--outline-width));margin-inline-start:calc(var(--nav-element-spacing-horizontal) - var(--nav-link-spacing-horizontal))}li[role=list]>a::after{background-image:var(--icon-chevron)}label>details[role=list]{margin-top:calc(var(--spacing) * .25);margin-bottom:var(--spacing)}[aria-busy=true]{cursor:progress}[aria-busy=true]:not(input,select,textarea,html)::before{display:inline-block;width:1em;height:1em;border:.1875em solid currentColor;border-radius:1em;border-right-color:transparent;content:"";vertical-align:text-bottom;vertical-align:-.125em;animation:spinner .75s linear infinite;opacity:var(--loading-spinner-opacity)}[aria-busy=true]:not(input,select,textarea,html):not(:empty)::before{margin-right:calc(var(--spacing) * .5);margin-left:0;margin-inline-start:0;margin-inline-end:calc(var(--spacing) * .5)}[aria-busy=true]:not(input,select,textarea,html):empty{text-align:center}a[aria-busy=true],button[aria-busy=true],input[type=button][aria-busy=true],input[type=reset][aria-busy=true],input[type=submit][aria-busy=true]{pointer-events:none}@keyframes spinner{to{transform:rotate(360deg)}}[data-tooltip]{position:relative}[data-tooltip]:not(a,button,input){border-bottom:1px dotted;text-decoration:none;cursor:help}[data-tooltip]::after,[data-tooltip]::before,[data-tooltip][data-placement=top]::after,[data-tooltip][data-placement=top]::before{display:block;z-index:99;position:absolute;bottom:100%;left:50%;padding:.25rem .5rem;overflow:hidden;transform:translate(-50%,-.25rem);border-radius:var(--border-radius);background:var(--tooltip-background-color);content:attr(data-tooltip);color:var(--tooltip-color);font-style:normal;font-weight:var(--font-weight);font-size:.875rem;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;opacity:0;pointer-events:none}[data-tooltip]::after,[data-tooltip][data-placement=top]::after{padding:0;transform:translate(-50%,0);border-top:.3rem solid;border-right:.3rem solid transparent;border-left:.3rem solid transparent;border-radius:0;background-color:transparent;content:"";color:var(--tooltip-background-color)}[data-tooltip][data-placement=bottom]::after,[data-tooltip][data-placement=bottom]::before{top:100%;bottom:auto;transform:translate(-50%,.25rem)}[data-tooltip][data-placement=bottom]:after{transform:translate(-50%,-.3rem);border:.3rem solid transparent;border-bottom:.3rem solid}[data-tooltip][data-placement=left]::after,[data-tooltip][data-placement=left]::before{top:50%;right:100%;bottom:auto;left:auto;transform:translate(-.25rem,-50%)}[data-tooltip][data-placement=left]:after{transform:translate(.3rem,-50%);border:.3rem solid transparent;border-left:.3rem solid}[data-tooltip][data-placement=right]::after,[data-tooltip][data-placement=right]::before{top:50%;right:auto;bottom:auto;left:100%;transform:translate(.25rem,-50%)}[data-tooltip][data-placement=right]:after{transform:translate(-.3rem,-50%);border:.3rem solid transparent;border-right:.3rem solid}[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{opacity:1}@media (hover:hover) and (pointer:fine){[data-tooltip]:hover::after,[data-tooltip]:hover::before,[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:focus::before,[data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::after,[data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::before{animation-duration:.2s;animation-name:tooltip-slide-top}[data-tooltip]:hover::after,[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::after{animation-name:tooltip-caret-slide-top}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:focus::before,[data-tooltip][data-placement=bottom]:hover::after,[data-tooltip][data-placement=bottom]:hover::before{animation-duration:.2s;animation-name:tooltip-slide-bottom}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:hover::after{animation-name:tooltip-caret-slide-bottom}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:focus::before,[data-tooltip][data-placement=left]:hover::after,[data-tooltip][data-placement=left]:hover::before{animation-duration:.2s;animation-name:tooltip-slide-left}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:hover::after{animation-name:tooltip-caret-slide-left}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:focus::before,[data-tooltip][data-placement=right]:hover::after,[data-tooltip][data-placement=right]:hover::before{animation-duration:.2s;animation-name:tooltip-slide-right}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:hover::after{animation-name:tooltip-caret-slide-right}}@keyframes tooltip-slide-top{from{transform:translate(-50%,.75rem);opacity:0}to{transform:translate(-50%,-.25rem);opacity:1}}@keyframes tooltip-caret-slide-top{from{opacity:0}50%{transform:translate(-50%,-.25rem);opacity:0}to{transform:translate(-50%,0);opacity:1}}@keyframes tooltip-slide-bottom{from{transform:translate(-50%,-.75rem);opacity:0}to{transform:translate(-50%,.25rem);opacity:1}}@keyframes tooltip-caret-slide-bottom{from{opacity:0}50%{transform:translate(-50%,-.5rem);opacity:0}to{transform:translate(-50%,-.3rem);opacity:1}}@keyframes tooltip-slide-left{from{transform:translate(.75rem,-50%);opacity:0}to{transform:translate(-.25rem,-50%);opacity:1}}@keyframes tooltip-caret-slide-left{from{opacity:0}50%{transform:translate(.05rem,-50%);opacity:0}to{transform:translate(.3rem,-50%);opacity:1}}@keyframes tooltip-slide-right{from{transform:translate(-.75rem,-50%);opacity:0}to{transform:translate(.25rem,-50%);opacity:1}}@keyframes tooltip-caret-slide-right{from{opacity:0}50%{transform:translate(-.05rem,-50%);opacity:0}to{transform:translate(-.3rem,-50%);opacity:1}}[aria-controls]{cursor:pointer}[aria-disabled=true],[disabled]{cursor:not-allowed}[aria-hidden=false][hidden]{display:initial}[aria-hidden=false][hidden]:not(:focus){clip:rect(0,0,0,0);position:absolute}[tabindex],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation}[dir=rtl]{direction:rtl}@media (prefers-reduced-motion:reduce){:not([aria-busy=true]),:not([aria-busy=true])::after,:not([aria-busy=true])::before{background-attachment:initial!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important}} +/*# sourceMappingURL=pico.min.css.map */ \ No newline at end of file diff --git a/web-ide-main/web/public/poppins_400.ttf b/web-ide-main/web/public/poppins_400.ttf new file mode 100644 index 0000000..e48144e Binary files /dev/null and b/web-ide-main/web/public/poppins_400.ttf differ diff --git a/web-ide-main/web/public/poppins_700.ttf b/web-ide-main/web/public/poppins_700.ttf new file mode 100644 index 0000000..89b46e7 Binary files /dev/null and b/web-ide-main/web/public/poppins_700.ttf differ diff --git a/web-ide-main/web/public/robots.txt b/web-ide-main/web/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/web-ide-main/web/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/web-ide-main/web/public/root.css b/web-ide-main/web/public/root.css new file mode 100644 index 0000000..d3e6237 --- /dev/null +++ b/web-ide-main/web/public/root.css @@ -0,0 +1,28 @@ +@import "./pico.min.css" layer(pico); +/* @import url("https://fonts.googleapis.com/css2?family=JetBrains+Mono&family=Poppins:wght@400;700&display=swap"); */ +@font-face { + font-family: "JetBrains Mono"; + font-style: normal; + font-weight: 400; + font-display: swap; + /* src: url(https://fonts.gstatic.com/s/jetbrainsmono/v18/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxjPQ.ttf) format('truetype'); */ + src: url(./jet_brains_mono.ttf) format("truetype"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 400; + font-display: swap; + /* src: url(https://fonts.gstatic.com/s/poppins/v21/pxiEyp8kv8JHgFVrFJA.ttf) format('truetype'); */ + src: url(./poppins_400.ttf) format("truetype"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 700; + font-display: swap; + /* src: url(https://fonts.gstatic.com/s/poppins/v21/pxiByp8kv8JHgFVrLCz7V1s.ttf) format('truetype'); */ + src: url(./poppins_700.ttf) format("truetype"); +} + +@layer pico component user; diff --git a/web-ide-main/web/public/user_guide/01_chip_empty.png b/web-ide-main/web/public/user_guide/01_chip_empty.png new file mode 100644 index 0000000..2cd7f7f Binary files /dev/null and b/web-ide-main/web/public/user_guide/01_chip_empty.png differ diff --git a/web-ide-main/web/public/user_guide/01_chip_empty_mobile.png b/web-ide-main/web/public/user_guide/01_chip_empty_mobile.png new file mode 100644 index 0000000..94c61c8 Binary files /dev/null and b/web-ide-main/web/public/user_guide/01_chip_empty_mobile.png differ diff --git a/web-ide-main/web/public/user_guide/02_chip_simple_nand.png b/web-ide-main/web/public/user_guide/02_chip_simple_nand.png new file mode 100644 index 0000000..c51cb18 Binary files /dev/null and b/web-ide-main/web/public/user_guide/02_chip_simple_nand.png differ diff --git a/web-ide-main/web/public/user_guide/03_chip_complex.png b/web-ide-main/web/public/user_guide/03_chip_complex.png new file mode 100644 index 0000000..d7cdcb4 Binary files /dev/null and b/web-ide-main/web/public/user_guide/03_chip_complex.png differ diff --git a/web-ide-main/web/public/user_guide/04_chip_complex_implemented.png b/web-ide-main/web/public/user_guide/04_chip_complex_implemented.png new file mode 100644 index 0000000..95903a3 Binary files /dev/null and b/web-ide-main/web/public/user_guide/04_chip_complex_implemented.png differ diff --git a/web-ide-main/web/public/user_guide/04_chip_complex_syntax_error.png b/web-ide-main/web/public/user_guide/04_chip_complex_syntax_error.png new file mode 100644 index 0000000..6b3f4e5 Binary files /dev/null and b/web-ide-main/web/public/user_guide/04_chip_complex_syntax_error.png differ diff --git a/web-ide-main/web/public/user_guide/05_chip_complex_failed_test.png b/web-ide-main/web/public/user_guide/05_chip_complex_failed_test.png new file mode 100644 index 0000000..4c73595 Binary files /dev/null and b/web-ide-main/web/public/user_guide/05_chip_complex_failed_test.png differ diff --git a/web-ide-main/web/public/user_guide/06_chip_complex_passed_test.png b/web-ide-main/web/public/user_guide/06_chip_complex_passed_test.png new file mode 100644 index 0000000..e5df281 Binary files /dev/null and b/web-ide-main/web/public/user_guide/06_chip_complex_passed_test.png differ diff --git a/web-ide-main/web/public/user_guide/07_settings.png b/web-ide-main/web/public/user_guide/07_settings.png new file mode 100644 index 0000000..c2922d7 Binary files /dev/null and b/web-ide-main/web/public/user_guide/07_settings.png differ diff --git a/web-ide-main/web/public/user_guide/asm.pdf b/web-ide-main/web/public/user_guide/asm.pdf new file mode 100644 index 0000000..179e1b4 Binary files /dev/null and b/web-ide-main/web/public/user_guide/asm.pdf differ diff --git a/web-ide-main/web/public/user_guide/bitmap_editor.pdf b/web-ide-main/web/public/user_guide/bitmap_editor.pdf new file mode 100644 index 0000000..f681588 Binary files /dev/null and b/web-ide-main/web/public/user_guide/bitmap_editor.pdf differ diff --git a/web-ide-main/web/public/user_guide/chip.pdf b/web-ide-main/web/public/user_guide/chip.pdf new file mode 100644 index 0000000..6322fd3 Binary files /dev/null and b/web-ide-main/web/public/user_guide/chip.pdf differ diff --git a/web-ide-main/web/public/user_guide/compiler.pdf b/web-ide-main/web/public/user_guide/compiler.pdf new file mode 100644 index 0000000..f57ff88 Binary files /dev/null and b/web-ide-main/web/public/user_guide/compiler.pdf differ diff --git a/web-ide-main/web/public/user_guide/cpu.pdf b/web-ide-main/web/public/user_guide/cpu.pdf new file mode 100644 index 0000000..063bb3b Binary files /dev/null and b/web-ide-main/web/public/user_guide/cpu.pdf differ diff --git a/web-ide-main/web/public/user_guide/file_system.pdf b/web-ide-main/web/public/user_guide/file_system.pdf new file mode 100644 index 0000000..5aff38a Binary files /dev/null and b/web-ide-main/web/public/user_guide/file_system.pdf differ diff --git a/web-ide-main/web/public/user_guide/vm.pdf b/web-ide-main/web/public/user_guide/vm.pdf new file mode 100644 index 0000000..0522ea3 Binary files /dev/null and b/web-ide-main/web/public/user_guide/vm.pdf differ diff --git a/web-ide-main/web/scripts/predeploy.js b/web-ide-main/web/scripts/predeploy.js new file mode 100644 index 0000000..9954256 --- /dev/null +++ b/web-ide-main/web/scripts/predeploy.js @@ -0,0 +1,27 @@ +const fs = require("fs-extra"); +const path = require("path"); + +const scriptDir = path.dirname(__filename); +const buildDir = path.resolve(scriptDir, "..", "build"); + +fs.ensureDirSync(buildDir); +process.chdir(buildDir); + +const folders = [ + "chip", + "cpu", + "asm", + "vm", + "compiler", + "bitmap", + "guide", + "util", + "about", +]; + +for (const folder of folders) { + fs.ensureDirSync(folder); + fs.copyFileSync("index.html", path.join(folder, "index.html")); +} + +console.log("Predeploy tasks completed."); diff --git a/web-ide-main/web/src/.gitignore b/web-ide-main/web/src/.gitignore new file mode 100644 index 0000000..a306801 --- /dev/null +++ b/web-ide-main/web/src/.gitignore @@ -0,0 +1 @@ +locales diff --git a/web-ide-main/web/src/App.context.ts b/web-ide-main/web/src/App.context.ts new file mode 100644 index 0000000..5b4f4b5 --- /dev/null +++ b/web-ide-main/web/src/App.context.ts @@ -0,0 +1,93 @@ +import { FileSystem } from "@davidsouther/jiffies/lib/esm/fs.js"; +import { useDialog } from "@nand2tetris/components/dialog.js"; +import { createContext, useCallback, useState } from "react"; +import { useFilePicker } from "./shell/file_select"; +import { useTracking } from "./tracking"; + +export type Theme = "light" | "dark" | "system"; + +export function useMonaco() { + const canUseMonaco = true; + const [wantsMonaco, setWantsMonaco] = useState(canUseMonaco); + const toggleMonaco = useCallback( + (pleaseUseMonaco: boolean) => { + if (canUseMonaco && pleaseUseMonaco) { + setWantsMonaco(true); + } else { + setWantsMonaco(false); + } + }, + [canUseMonaco], + ); + + return { + canUse: canUseMonaco, + wants: wantsMonaco, + toggle: toggleMonaco, + }; +} + +export function useAppContext(_fs: FileSystem = new FileSystem()) { + const [theme, setTheme] = useState("system"); + + return { + monaco: useMonaco(), + settings: useDialog(), + filePicker: useFilePicker(), + tracking: useTracking(), + theme, + setTheme, + }; +} + +export const AppContext = createContext>({ + monaco: { + canUse: true, + wants: true, + toggle() { + return undefined; + }, + }, + filePicker: { + close() { + return undefined; + }, + open() { + return undefined; + }, + select(options: FilePickerOptions) { + return Promise.reject(""); + }, + isOpen: false, + suffix: undefined, + } as ReturnType, + settings: { + close() { + return undefined; + }, + open() { + return undefined; + }, + isOpen: false, + }, + tracking: { + canTrack: false, + haveAsked: false, + accept() { + return undefined; + }, + reject() { + return undefined; + }, + trackEvent() { + return undefined; + }, + trackPage() { + return undefined; + }, + }, + theme: "system", + setTheme() { + return undefined; + }, +}); diff --git a/web-ide-main/web/src/App.tsx b/web-ide-main/web/src/App.tsx new file mode 100644 index 0000000..9b9c865 --- /dev/null +++ b/web-ide-main/web/src/App.tsx @@ -0,0 +1,106 @@ +import { i18n } from "@lingui/core"; +import { I18nProvider } from "@lingui/react"; +import { + BaseContext, + useBaseContext, +} from "@nand2tetris/components/stores/base.context.js"; +import { en } from "make-plural/plurals"; +import { Suspense, useEffect, useRef, useState } from "react"; +import { Route, BrowserRouter as Router, Routes } from "react-router-dom"; +import { AppContext, useAppContext } from "./App.context"; +import { registerLanguages } from "./languages/loader"; +import { messages, plMessages } from "./locales"; +import { FilePicker } from "./shell/file_select"; +import Footer from "./shell/footer"; +import Header from "./shell/header"; +import { Settings } from "./shell/settings"; +import { Tooltip } from "./shell/Tooltip"; +import urls from "./urls"; + +import { ErrorBoundary, RenderError } from "./ErrorBoundary"; +import { PageContextProvider } from "./Page.context"; +import { Redirect } from "./pages/redirect"; +import "./pico/flex.scss"; +import "./pico/pico.scss"; +import { TrackingBanner } from "./tracking"; +import { updateVersion } from "./versions"; + +i18n.load("en", messages.messages); +i18n.load("en-PL", plMessages.messages); +i18n.loadLocaleData({ + en: { plurals: en }, + "en-US": { plurals: en }, + "en-PL": { plurals: en }, +}); +i18n.activate(navigator.language); + +type STATE = "none" | "initializing" | "initialized"; + +function App() { + const baseContext = useBaseContext(); + const appContext = useAppContext(); + const state = useRef("none"); + const [initialized, setInitialized] = useState(false); + + const fs = baseContext.fs; + + useEffect(() => { + registerLanguages(); + }, []); + + useEffect(() => { + if (state.current != "none") return; + state.current = "initializing"; + Promise.resolve().then(async () => { + await updateVersion(fs); + state.current = "initialized"; + setInitialized(true); + }); + }, [fs, state]); + + useEffect(() => { + (document.children[0] as HTMLHtmlElement).dataset.theme = + appContext.theme === "system" + ? window.matchMedia("(prefers-color-scheme: dark)").matches + ? "dark" + : "light" + : appContext.theme; + }, [appContext.theme]); + + return ( + + + + {initialized ? ( + + + + +
+
+ + Loading...
}> + + } /> + {Object.values(urls).map(({ href, target }) => ( + + ))} + + + + +
+ } + > + + ); + }); + return FakeEditor; +}); + +export {}; diff --git a/web-ide-main/web/src/shell/editor.scss b/web-ide-main/web/src/shell/editor.scss new file mode 100644 index 0000000..a494209 --- /dev/null +++ b/web-ide-main/web/src/shell/editor.scss @@ -0,0 +1,66 @@ +:root[data-theme="light"] { + --diff-highlight-error-line-bg-color: #ffebe9; + --diff-highlight-error-cell-bg-color: #ffc1c0; + --diff-highlight-correct-line-bg-color: #dafbe1; + --diff-highlight-correct-cell-bg-color: #aceebb; +} +:root[data-theme="dark"] { + --diff-highlight-error-line-bg-color: #390504; + --diff-highlight-error-cell-bg-color: #842019; + --diff-highlight-correct-line-bg-color: #0d2705; + --diff-highlight-correct-cell-bg-color: #285d17; +} + +.Editor { + width: 100%; + + &:not(.dynamic-height) { + height: 100%; + } + + .monaco-editor { + // Magic + position: absolute; + } + + .highlight { + background-color: var(--mark-background-color); + } + + .error-highlight { + background-color: var(--mark-error-color); + } + + .diff-highlight-error-line { + background-color: var(--diff-highlight-error-line-bg-color); + } + + .diff-highlight-error-cell { + background-color: var(--diff-highlight-error-cell-bg-color); + } + + .diff-highlight-correct-line { + background-color: var(--diff-highlight-correct-line-bg-color); + } + + .diff-highlight-correct-cell { + background-color: var(--diff-highlight-correct-cell-bg-color); + } + + textarea { + flex: 1; + } + + position: relative; // For ".overlay", below. + &:has(.overlay) { + // Available in chrome 105 + position: relative; + } + + .overlay { + position: absolute; + inset: 0; + background-color: var(--form-element-disabled-background-color); + opacity: var(--form-element-disabled-opacity); + } +} diff --git a/web-ide-main/web/src/shell/editor.tsx b/web-ide-main/web/src/shell/editor.tsx new file mode 100644 index 0000000..dde8b34 --- /dev/null +++ b/web-ide-main/web/src/shell/editor.tsx @@ -0,0 +1,137 @@ +import { Trans } from "@lingui/macro"; +import { type Grammar } from "ohm-js"; +import { CSSProperties, lazy, Suspense, useContext, useState } from "react"; +import { AppContext } from "../App.context"; + +import { + CompilationError, + Span, +} from "@nand2tetris/simulator/languages/base.js"; + +import "./editor.scss"; +import { Action } from "@nand2tetris/simulator/types"; + +const Monaco = lazy(() => import("./Monaco")); + +export const ErrorPanel = ({ error }: { error?: CompilationError }) => { + return error ? ( +
+ + Parse Error + +
+        {error?.message}
+      
+
+ ) : ( + <> + ); +}; + +const Textarea = ({ + value, + onChange, + language, + disabled = false, +}: { + value: string; + onChange: Action; + language: string; + disabled?: boolean; +}) => { + const [text, setText] = useState(value); + return ( +