├── .github ├── FUNDING.yml └── workflows │ ├── checks.yml │ └── deploy.yml ├── .gitignore ├── LICENSE ├── README.md ├── THIRDPARTY.md ├── app.vue ├── assets └── styles │ ├── _overrides.scss │ ├── _variables.scss │ ├── layout.scss │ ├── sass │ ├── _config.scss │ ├── _content.scss │ ├── _footer.scss │ ├── _layout.scss │ ├── _main.scss │ ├── _menu.scss │ ├── _mixins.scss │ ├── _responsive.scss │ ├── _splash.scss │ ├── _topbar.scss │ ├── _typography.scss │ └── _utils.scss │ └── themes │ └── dark-bs.css ├── binjgb.js ├── binjnes.js ├── components ├── footer.vue ├── list.vue └── topbar.vue ├── directives └── primevue.ts ├── mgba.js ├── modules └── sitemap.ts ├── nuxt.config.ts ├── package.json ├── pages ├── credits.vue ├── developers.vue ├── disclaimer.vue ├── game │ └── [slug].vue ├── games.vue ├── index.vue ├── search.vue ├── sitemap.vue └── stats.vue ├── plugins ├── Emulator.vue ├── Medusa.vue ├── Nes.vue ├── directives.ts ├── matomo.client.js ├── primevue.js └── register.client.ts ├── public ├── .nojekyll ├── CNAME ├── fonts │ ├── EudoxusSans-Light.woff2 │ ├── EudoxusSans-Medium.woff2 │ ├── EudoxusSans-Regular.woff2 │ ├── Inter-Light.woff2 │ ├── Inter-Medium.woff2 │ └── Inter-Regular.woff2 ├── imgs │ └── DO_Powered_by_Badge_white.svg └── js │ ├── binjgb.wasm │ ├── binjnes.wasm │ └── mgba.wasm ├── tsconfig.json └── yarn.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | open_collective: gbdev 2 | -------------------------------------------------------------------------------- /.github/workflows/checks.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: push 4 | 5 | jobs: 6 | checks: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | - name: Install requirements 11 | run: yarn 12 | 13 | - name: Run Prettier 14 | run: yarn prettier . --check 15 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: CD 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [master] 7 | schedule: 8 | - cron: "0 5 * * *" 9 | 10 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 11 | permissions: 12 | contents: read 13 | pages: write 14 | id-token: write 15 | 16 | jobs: 17 | build: 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Checkout virens 21 | uses: actions/checkout@v2 22 | with: 23 | path: virens 24 | 25 | - name: Install NodeJS 26 | uses: actions/setup-node@v1 27 | with: 28 | node-version: "18.x" 29 | 30 | - name: Install requirements 31 | run: yarn 32 | working-directory: virens/ 33 | 34 | - name: Run Vue build 35 | run: BASE_API_URL=https://hh3.gbdev.io yarn generate --force 36 | working-directory: virens/ 37 | 38 | - name: Store final build 39 | uses: actions/upload-pages-artifact@v3 40 | with: 41 | path: virens/.output/public 42 | 43 | deploy: 44 | name: Deploy to GitHub pages 45 | # Do not run this unless *pushing* to `master`. 46 | if: github.event_name == 'push' && github.ref == 'refs/heads/master' 47 | environment: 48 | name: github-pages 49 | url: ${{ steps.deployment.outputs.page_url }} 50 | runs-on: ubuntu-latest 51 | needs: build 52 | steps: 53 | - name: Deploy to GitHub Pages 54 | id: deployment 55 | uses: actions/deploy-pages@v4 56 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | 25 | .nuxt 26 | .output/ 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # virens 2 | 3 | [![build + deploy](https://github.com/gbdev/virens/actions/workflows/deploy.yml/badge.svg)](https://github.com/gbdev/virens/actions/workflows/deploy.yml) 4 | 5 | Experimental Homebrew Hub frontend in Nuxt 3, consuming the new [Homebrew Hub API](https://github.com/gbdev/homebrewhub/). 6 | 7 | The GB/GBC emulation is powered by the [binjgb](https://github.com/binji/binjgb) emulator, running in the browser via WebAssembly. The GBA emulation is provided in a similar fashion by [mGBA](https://mgba.io/). 8 | 9 | The UI component library used is [PrimeVue](https://www.primefaces.org/primevue). 10 | 11 | ## Setup 12 | 13 | Install dependencies: 14 | 15 | ```bash 16 | yarn 17 | ``` 18 | 19 | ## Development Server 20 | 21 | Start the development server on http://localhost:3000 22 | 23 | ```bash 24 | yarn dev 25 | ``` 26 | 27 | By default, the base API is set to `https://hh3.gbdev.io`, you customise this by setting the `BASE_API_URL` environment variable to an instance of the [Homebrew Hub API](https://github.com/gbdev/homebrewhub) (be sure to have CORS [set up correctly](https://github.com/gbdev/homebrewhub/blob/main/hhub/settings.py) on that side). 28 | 29 | E.g., if you're running the backend server locally: 30 | 31 | ``` 32 | BASE_API_URL=http://localhost:8000 yarn dev 33 | ``` 34 | 35 | ## Production 36 | 37 | Build the application for production: 38 | 39 | ```bash 40 | yarn build 41 | ``` 42 | 43 | Locally preview production build: 44 | 45 | ```bash 46 | yarn preview 47 | ``` 48 | 49 | ## Deploy 50 | 51 | Deployment to [hh.gbdev.io](https://hh.gbdev.io) is handled by a GitHub Action: 52 | 53 | - This GitHub repository has Pages set up to serve from the `gh-pages` branch; 54 | - A **CNAME** DNS record on `hh.gbdev.io` points to GitHub servers; 55 | - Every time there's a push to the `master` branch, the [deploy.yml](https://github.com/gbdev/virens/blob/master/.github/workflows/deploy.yml) GitHub Action gets triggered, running `npm run build` and uploading the result build in the `gh-pages` branch of this repository which in turns gets served by GitHub Pages; 56 | - A "CNAME" file is in the build directory, containing "hh.gbdev.io"; 57 | - A '.nojekyll' file is needed to allow the `_nuxt` folder to be statically served (otherwise ignored by a standard Jekyll build). 58 | 59 | ## Acknowledgements 60 | 61 | [@binji](https://github.com/binji/binjgb) for the emulator and the additional browser code to make the wasm build work. mrioa and [aes](https://github.com/aesdotjs) for their nuxt knowledge. 62 | 63 | _Virens_? The name of this project comes from _Flavo-virens_ and _Atro-virens_, two colors from [Saccardo's chromotaxy scale](https://en.wikipedia.org/wiki/File:Saccardo%27s_chromotaxy_scale.jpg), proposed by an Italian mycologist in 1894, for standardizing color naming of plant specimens. They are similar to the shades in the original Game Boy palette. 64 | -------------------------------------------------------------------------------- /THIRDPARTY.md: -------------------------------------------------------------------------------- 1 | # Third Party Notices 2 | 3 | Homebrew Hub Virens software incorporates third party material from the projects listed below. The original copyright notice and the license under which such third party material is received are set forth below. 4 | 5 | Third Party Code Components: 6 | 7 | ## binjgb 8 | 9 | Copyright (c) 2016 Ben Smith. https://github.com/binji/binjgb 10 | 11 | ``` 12 | Permission is hereby granted, free of charge, to any person obtaining a copy 13 | of this software and associated documentation files (the "Software"), to deal 14 | in the Software without restriction, including without limitation the rights 15 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 16 | copies of the Software, and to permit persons to whom the Software is 17 | furnished to do so, subject to the following conditions: 18 | 19 | The above copyright notice and this permission notice shall be included in 20 | all copies or substantial portions of the Software. 21 | 22 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 28 | THE SOFTWARE. 29 | ``` 30 | 31 | ## binjnes 32 | 33 | Copyright 2021 Ben Smith. https://github.com/binji/binjnes/ 34 | 35 | ``` 36 | Permission is hereby granted, free of charge, to any person obtaining a copy of 37 | this software and associated documentation files (the "Software"), to deal in 38 | the Software without restriction, including without limitation the rights to 39 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 40 | of the Software, and to permit persons to whom the Software is furnished to do 41 | so, subject to the following conditions: 42 | 43 | The above copyright notice and this permission notice shall be included in all 44 | copies or substantial portions of the Software. 45 | 46 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 47 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 48 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 49 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 50 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 51 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 52 | THE SOFTWARE. 53 | ``` 54 | 55 | ## mgba 56 | 57 | (c) Vicki Pfau and mgba contributors. https://github.com/mgba-emu/mgba 58 | 59 | ``` 60 | Mozilla Public License Version 2.0 61 | ================================== 62 | 63 | 1. Definitions 64 | -------------- 65 | 66 | 1.1. "Contributor" 67 | means each individual or legal entity that creates, contributes to 68 | the creation of, or owns Covered Software. 69 | 70 | 1.2. "Contributor Version" 71 | means the combination of the Contributions of others (if any) used 72 | by a Contributor and that particular Contributor's Contribution. 73 | 74 | 1.3. "Contribution" 75 | means Covered Software of a particular Contributor. 76 | 77 | 1.4. "Covered Software" 78 | means Source Code Form to which the initial Contributor has attached 79 | the notice in Exhibit A, the Executable Form of such Source Code 80 | Form, and Modifications of such Source Code Form, in each case 81 | including portions thereof. 82 | 83 | 1.5. "Incompatible With Secondary Licenses" 84 | means 85 | 86 | (a) that the initial Contributor has attached the notice described 87 | in Exhibit B to the Covered Software; or 88 | 89 | (b) that the Covered Software was made available under the terms of 90 | version 1.1 or earlier of the License, but not also under the 91 | terms of a Secondary License. 92 | 93 | 1.6. "Executable Form" 94 | means any form of the work other than Source Code Form. 95 | 96 | 1.7. "Larger Work" 97 | means a work that combines Covered Software with other material, in 98 | a separate file or files, that is not Covered Software. 99 | 100 | 1.8. "License" 101 | means this document. 102 | 103 | 1.9. "Licensable" 104 | means having the right to grant, to the maximum extent possible, 105 | whether at the time of the initial grant or subsequently, any and 106 | all of the rights conveyed by this License. 107 | 108 | 1.10. "Modifications" 109 | means any of the following: 110 | 111 | (a) any file in Source Code Form that results from an addition to, 112 | deletion from, or modification of the contents of Covered 113 | Software; or 114 | 115 | (b) any new file in Source Code Form that contains any Covered 116 | Software. 117 | 118 | 1.11. "Patent Claims" of a Contributor 119 | means any patent claim(s), including without limitation, method, 120 | process, and apparatus claims, in any patent Licensable by such 121 | Contributor that would be infringed, but for the grant of the 122 | License, by the making, using, selling, offering for sale, having 123 | made, import, or transfer of either its Contributions or its 124 | Contributor Version. 125 | 126 | 1.12. "Secondary License" 127 | means either the GNU General Public License, Version 2.0, the GNU 128 | Lesser General Public License, Version 2.1, the GNU Affero General 129 | Public License, Version 3.0, or any later versions of those 130 | licenses. 131 | 132 | 1.13. "Source Code Form" 133 | means the form of the work preferred for making modifications. 134 | 135 | 1.14. "You" (or "Your") 136 | means an individual or a legal entity exercising rights under this 137 | License. For legal entities, "You" includes any entity that 138 | controls, is controlled by, or is under common control with You. For 139 | purposes of this definition, "control" means (a) the power, direct 140 | or indirect, to cause the direction or management of such entity, 141 | whether by contract or otherwise, or (b) ownership of more than 142 | fifty percent (50%) of the outstanding shares or beneficial 143 | ownership of such entity. 144 | 145 | 2. License Grants and Conditions 146 | -------------------------------- 147 | 148 | 2.1. Grants 149 | 150 | Each Contributor hereby grants You a world-wide, royalty-free, 151 | non-exclusive license: 152 | 153 | (a) under intellectual property rights (other than patent or trademark) 154 | Licensable by such Contributor to use, reproduce, make available, 155 | modify, display, perform, distribute, and otherwise exploit its 156 | Contributions, either on an unmodified basis, with Modifications, or 157 | as part of a Larger Work; and 158 | 159 | (b) under Patent Claims of such Contributor to make, use, sell, offer 160 | for sale, have made, import, and otherwise transfer either its 161 | Contributions or its Contributor Version. 162 | 163 | 2.2. Effective Date 164 | 165 | The licenses granted in Section 2.1 with respect to any Contribution 166 | become effective for each Contribution on the date the Contributor first 167 | distributes such Contribution. 168 | 169 | 2.3. Limitations on Grant Scope 170 | 171 | The licenses granted in this Section 2 are the only rights granted under 172 | this License. No additional rights or licenses will be implied from the 173 | distribution or licensing of Covered Software under this License. 174 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 175 | Contributor: 176 | 177 | (a) for any code that a Contributor has removed from Covered Software; 178 | or 179 | 180 | (b) for infringements caused by: (i) Your and any other third party's 181 | modifications of Covered Software, or (ii) the combination of its 182 | Contributions with other software (except as part of its Contributor 183 | Version); or 184 | 185 | (c) under Patent Claims infringed by Covered Software in the absence of 186 | its Contributions. 187 | 188 | This License does not grant any rights in the trademarks, service marks, 189 | or logos of any Contributor (except as may be necessary to comply with 190 | the notice requirements in Section 3.4). 191 | 192 | 2.4. Subsequent Licenses 193 | 194 | No Contributor makes additional grants as a result of Your choice to 195 | distribute the Covered Software under a subsequent version of this 196 | License (see Section 10.2) or under the terms of a Secondary License (if 197 | permitted under the terms of Section 3.3). 198 | 199 | 2.5. Representation 200 | 201 | Each Contributor represents that the Contributor believes its 202 | Contributions are its original creation(s) or it has sufficient rights 203 | to grant the rights to its Contributions conveyed by this License. 204 | 205 | 2.6. Fair Use 206 | 207 | This License is not intended to limit any rights You have under 208 | applicable copyright doctrines of fair use, fair dealing, or other 209 | equivalents. 210 | 211 | 2.7. Conditions 212 | 213 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 214 | in Section 2.1. 215 | 216 | 3. Responsibilities 217 | ------------------- 218 | 219 | 3.1. Distribution of Source Form 220 | 221 | All distribution of Covered Software in Source Code Form, including any 222 | Modifications that You create or to which You contribute, must be under 223 | the terms of this License. You must inform recipients that the Source 224 | Code Form of the Covered Software is governed by the terms of this 225 | License, and how they can obtain a copy of this License. You may not 226 | attempt to alter or restrict the recipients' rights in the Source Code 227 | Form. 228 | 229 | 3.2. Distribution of Executable Form 230 | 231 | If You distribute Covered Software in Executable Form then: 232 | 233 | (a) such Covered Software must also be made available in Source Code 234 | Form, as described in Section 3.1, and You must inform recipients of 235 | the Executable Form how they can obtain a copy of such Source Code 236 | Form by reasonable means in a timely manner, at a charge no more 237 | than the cost of distribution to the recipient; and 238 | 239 | (b) You may distribute such Executable Form under the terms of this 240 | License, or sublicense it under different terms, provided that the 241 | license for the Executable Form does not attempt to limit or alter 242 | the recipients' rights in the Source Code Form under this License. 243 | 244 | 3.3. Distribution of a Larger Work 245 | 246 | You may create and distribute a Larger Work under terms of Your choice, 247 | provided that You also comply with the requirements of this License for 248 | the Covered Software. If the Larger Work is a combination of Covered 249 | Software with a work governed by one or more Secondary Licenses, and the 250 | Covered Software is not Incompatible With Secondary Licenses, this 251 | License permits You to additionally distribute such Covered Software 252 | under the terms of such Secondary License(s), so that the recipient of 253 | the Larger Work may, at their option, further distribute the Covered 254 | Software under the terms of either this License or such Secondary 255 | License(s). 256 | 257 | 3.4. Notices 258 | 259 | You may not remove or alter the substance of any license notices 260 | (including copyright notices, patent notices, disclaimers of warranty, 261 | or limitations of liability) contained within the Source Code Form of 262 | the Covered Software, except that You may alter any license notices to 263 | the extent required to remedy known factual inaccuracies. 264 | 265 | 3.5. Application of Additional Terms 266 | 267 | You may choose to offer, and to charge a fee for, warranty, support, 268 | indemnity or liability obligations to one or more recipients of Covered 269 | Software. However, You may do so only on Your own behalf, and not on 270 | behalf of any Contributor. You must make it absolutely clear that any 271 | such warranty, support, indemnity, or liability obligation is offered by 272 | You alone, and You hereby agree to indemnify every Contributor for any 273 | liability incurred by such Contributor as a result of warranty, support, 274 | indemnity or liability terms You offer. You may include additional 275 | disclaimers of warranty and limitations of liability specific to any 276 | jurisdiction. 277 | 278 | 4. Inability to Comply Due to Statute or Regulation 279 | --------------------------------------------------- 280 | 281 | If it is impossible for You to comply with any of the terms of this 282 | License with respect to some or all of the Covered Software due to 283 | statute, judicial order, or regulation then You must: (a) comply with 284 | the terms of this License to the maximum extent possible; and (b) 285 | describe the limitations and the code they affect. Such description must 286 | be placed in a text file included with all distributions of the Covered 287 | Software under this License. Except to the extent prohibited by statute 288 | or regulation, such description must be sufficiently detailed for a 289 | recipient of ordinary skill to be able to understand it. 290 | 291 | 5. Termination 292 | -------------- 293 | 294 | 5.1. The rights granted under this License will terminate automatically 295 | if You fail to comply with any of its terms. However, if You become 296 | compliant, then the rights granted under this License from a particular 297 | Contributor are reinstated (a) provisionally, unless and until such 298 | Contributor explicitly and finally terminates Your grants, and (b) on an 299 | ongoing basis, if such Contributor fails to notify You of the 300 | non-compliance by some reasonable means prior to 60 days after You have 301 | come back into compliance. Moreover, Your grants from a particular 302 | Contributor are reinstated on an ongoing basis if such Contributor 303 | notifies You of the non-compliance by some reasonable means, this is the 304 | first time You have received notice of non-compliance with this License 305 | from such Contributor, and You become compliant prior to 30 days after 306 | Your receipt of the notice. 307 | 308 | 5.2. If You initiate litigation against any entity by asserting a patent 309 | infringement claim (excluding declaratory judgment actions, 310 | counter-claims, and cross-claims) alleging that a Contributor Version 311 | directly or indirectly infringes any patent, then the rights granted to 312 | You by any and all Contributors for the Covered Software under Section 313 | 2.1 of this License shall terminate. 314 | 315 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 316 | end user license agreements (excluding distributors and resellers) which 317 | have been validly granted by You or Your distributors under this License 318 | prior to termination shall survive termination. 319 | 320 | ************************************************************************ 321 | * * 322 | * 6. Disclaimer of Warranty * 323 | * ------------------------- * 324 | * * 325 | * Covered Software is provided under this License on an "as is" * 326 | * basis, without warranty of any kind, either expressed, implied, or * 327 | * statutory, including, without limitation, warranties that the * 328 | * Covered Software is free of defects, merchantable, fit for a * 329 | * particular purpose or non-infringing. The entire risk as to the * 330 | * quality and performance of the Covered Software is with You. * 331 | * Should any Covered Software prove defective in any respect, You * 332 | * (not any Contributor) assume the cost of any necessary servicing, * 333 | * repair, or correction. This disclaimer of warranty constitutes an * 334 | * essential part of this License. No use of any Covered Software is * 335 | * authorized under this License except under this disclaimer. * 336 | * * 337 | ************************************************************************ 338 | 339 | ************************************************************************ 340 | * * 341 | * 7. Limitation of Liability * 342 | * -------------------------- * 343 | * * 344 | * Under no circumstances and under no legal theory, whether tort * 345 | * (including negligence), contract, or otherwise, shall any * 346 | * Contributor, or anyone who distributes Covered Software as * 347 | * permitted above, be liable to You for any direct, indirect, * 348 | * special, incidental, or consequential damages of any character * 349 | * including, without limitation, damages for lost profits, loss of * 350 | * goodwill, work stoppage, computer failure or malfunction, or any * 351 | * and all other commercial damages or losses, even if such party * 352 | * shall have been informed of the possibility of such damages. This * 353 | * limitation of liability shall not apply to liability for death or * 354 | * personal injury resulting from such party's negligence to the * 355 | * extent applicable law prohibits such limitation. Some * 356 | * jurisdictions do not allow the exclusion or limitation of * 357 | * incidental or consequential damages, so this exclusion and * 358 | * limitation may not apply to You. * 359 | * * 360 | ************************************************************************ 361 | 362 | 8. Litigation 363 | ------------- 364 | 365 | Any litigation relating to this License may be brought only in the 366 | courts of a jurisdiction where the defendant maintains its principal 367 | place of business and such litigation shall be governed by laws of that 368 | jurisdiction, without reference to its conflict-of-law provisions. 369 | Nothing in this Section shall prevent a party's ability to bring 370 | cross-claims or counter-claims. 371 | 372 | 9. Miscellaneous 373 | ---------------- 374 | 375 | This License represents the complete agreement concerning the subject 376 | matter hereof. If any provision of this License is held to be 377 | unenforceable, such provision shall be reformed only to the extent 378 | necessary to make it enforceable. Any law or regulation which provides 379 | that the language of a contract shall be construed against the drafter 380 | shall not be used to construe this License against a Contributor. 381 | 382 | 10. Versions of the License 383 | --------------------------- 384 | 385 | 10.1. New Versions 386 | 387 | Mozilla Foundation is the license steward. Except as provided in Section 388 | 10.3, no one other than the license steward has the right to modify or 389 | publish new versions of this License. Each version will be given a 390 | distinguishing version number. 391 | 392 | 10.2. Effect of New Versions 393 | 394 | You may distribute the Covered Software under the terms of the version 395 | of the License under which You originally received the Covered Software, 396 | or under the terms of any subsequent version published by the license 397 | steward. 398 | 399 | 10.3. Modified Versions 400 | 401 | If you create software not governed by this License, and you want to 402 | create a new license for such software, you may create and use a 403 | modified version of this License if you rename the license and remove 404 | any references to the name of the license steward (except to note that 405 | such modified license differs from this License). 406 | 407 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 408 | Licenses 409 | 410 | If You choose to distribute Source Code Form that is Incompatible With 411 | Secondary Licenses under the terms of this version of the License, the 412 | notice described in Exhibit B of this License must be attached. 413 | 414 | Exhibit A - Source Code Form License Notice 415 | ------------------------------------------- 416 | 417 | This Source Code Form is subject to the terms of the Mozilla Public 418 | License, v. 2.0. If a copy of the MPL was not distributed with this 419 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 420 | 421 | If it is not possible or desirable to put the notice in a particular 422 | file, then You may include the notice in a location (such as a LICENSE 423 | file in a relevant directory) where a recipient would be likely to look 424 | for such a notice. 425 | 426 | You may add additional accurate notices of copyright ownership. 427 | 428 | Exhibit B - "Incompatible With Secondary Licenses" Notice 429 | --------------------------------------------------------- 430 | 431 | This Source Code Form is "Incompatible With Secondary Licenses", as 432 | defined by the Mozilla Public License, v. 2.0. 433 | 434 | ``` 435 | -------------------------------------------------------------------------------- /app.vue: -------------------------------------------------------------------------------- 1 | 2 | 20 | 29 | 45 | 78 | -------------------------------------------------------------------------------- /assets/styles/_overrides.scss: -------------------------------------------------------------------------------- 1 | // Suggested location to add your overrides so that migration would be easy by just updating the SASS folder in the future 2 | 3 | .p-dataview .p-dataview-content { 4 | // FIXME: !important shouldn't be required here.. 5 | background: transparent !important; 6 | } 7 | -------------------------------------------------------------------------------- /assets/styles/_variables.scss: -------------------------------------------------------------------------------- 1 | /* General */ 2 | $fontSize: 14px; 3 | $borderRadius: 12px; 4 | $transitionDuration: 0.2s; 5 | -------------------------------------------------------------------------------- /assets/styles/layout.scss: -------------------------------------------------------------------------------- 1 | @import "./_variables"; 2 | @import "./sass/_layout"; 3 | @import "./_overrides"; 4 | 5 | @font-face { 6 | font-family: "Eudoxus Sans"; 7 | src: url("/fonts/EudoxusSans-Medium.woff2") format("woff2"); 8 | font-weight: 500; 9 | } 10 | @font-face { 11 | font-family: "Eudoxus Sans"; 12 | src: url("/fonts/EudoxusSans-Regular.woff2") format("woff2"); 13 | font-weight: 400; 14 | } 15 | @font-face { 16 | font-family: "Eudoxus Sans"; 17 | src: url("/fonts/EudoxusSans-Light.woff2") format("woff2"); 18 | font-weight: 300; 19 | } 20 | @font-face { 21 | font-family: "Inter"; 22 | src: url("/fonts/Inter-Light.woff2") format("woff2"); 23 | font-weight: 300; 24 | } 25 | @font-face { 26 | font-family: "Inter"; 27 | src: url("/fonts/Inter-Regular.woff2") format("woff2"); 28 | font-weight: 400; 29 | } 30 | @font-face { 31 | font-family: "Inter"; 32 | src: url("/fonts/Inter-Medium.woff2") format("woff2"); 33 | font-weight: 500; 34 | } 35 | -------------------------------------------------------------------------------- /assets/styles/sass/_config.scss: -------------------------------------------------------------------------------- 1 | .layout-config { 2 | position: fixed; 3 | top: 0; 4 | padding: 0; 5 | right: 0; 6 | width: 20rem; 7 | z-index: 999; 8 | height: 100vh; 9 | transform: translateX(100%); 10 | transition: transform $transitionDuration; 11 | backface-visibility: hidden; 12 | box-shadow: 13 | 0px 3px 5px rgba(0, 0, 0, 0.02), 14 | 0px 0px 2px rgba(0, 0, 0, 0.05), 15 | 0px 1px 4px rgba(0, 0, 0, 0.08) !important; 16 | color: var(--text-color); 17 | background-color: var(--surface-overlay); 18 | border-top-left-radius: 12px; 19 | border-bottom-left-radius: 12px; 20 | 21 | &.layout-config-active { 22 | transform: translateX(0); 23 | } 24 | 25 | .layout-config-button { 26 | display: block; 27 | position: absolute; 28 | width: 52px; 29 | height: 52px; 30 | line-height: 52px; 31 | background-color: var(--primary-color); 32 | color: var(--primary-color-text); 33 | text-align: center; 34 | top: 230px; 35 | left: -52px; 36 | z-index: -1; 37 | overflow: hidden; 38 | cursor: pointer; 39 | border-top-left-radius: $borderRadius; 40 | border-bottom-left-radius: $borderRadius; 41 | transition: background-color $transitionDuration; 42 | 43 | i { 44 | font-size: 32px; 45 | line-height: inherit; 46 | cursor: pointer; 47 | transform: rotate(0deg); 48 | transition: 49 | color $transitionDuration, 50 | transform 1s; 51 | } 52 | } 53 | 54 | .layout-config-close { 55 | position: absolute; 56 | right: 1rem; 57 | top: 1rem; 58 | z-index: 1; 59 | } 60 | 61 | .layout-config-content { 62 | position: relative; 63 | overflow: auto; 64 | height: 100vh; 65 | padding: 2rem; 66 | } 67 | 68 | .config-scale { 69 | display: flex; 70 | align-items: center; 71 | margin: 1rem 0 2rem 0; 72 | 73 | .p-button { 74 | margin-right: 0.5rem; 75 | } 76 | 77 | i { 78 | margin-right: 0.5rem; 79 | font-size: 0.75rem; 80 | color: var(--text-color-secondary); 81 | 82 | &.scale-active { 83 | font-size: 1.25rem; 84 | color: var(--primary-color); 85 | } 86 | } 87 | } 88 | 89 | .free-themes { 90 | img { 91 | width: 2rem; 92 | border-radius: 4px; 93 | transition: transform 0.2s; 94 | 95 | &:hover { 96 | transform: scale(1.1); 97 | } 98 | } 99 | 100 | span { 101 | font-size: 0.75rem; 102 | margin-top: 0.25rem; 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /assets/styles/sass/_content.scss: -------------------------------------------------------------------------------- 1 | .layout-main-container { 2 | display: flex; 3 | flex-direction: column; 4 | min-height: 100vh; 5 | justify-content: space-between; 6 | padding: 7rem 2rem 2rem 4rem; 7 | transition: margin-left $transitionDuration; 8 | } 9 | 10 | .layout-main { 11 | flex: 1 1 auto; 12 | } 13 | -------------------------------------------------------------------------------- /assets/styles/sass/_footer.scss: -------------------------------------------------------------------------------- 1 | .layout-footer { 2 | transition: margin-left $transitionDuration; 3 | display: flex; 4 | align-items: center; 5 | justify-content: center; 6 | padding-top: 1rem; 7 | border-top: 1px solid var(--surface-border); 8 | } 9 | -------------------------------------------------------------------------------- /assets/styles/sass/_layout.scss: -------------------------------------------------------------------------------- 1 | @import "./_mixins"; 2 | @import "./_splash"; 3 | @import "./_main"; 4 | @import "./_topbar"; 5 | @import "./_menu"; 6 | @import "./_config"; 7 | @import "./_content"; 8 | @import "./_footer"; 9 | @import "./_responsive"; 10 | @import "./_utils"; 11 | @import "./_typography"; 12 | -------------------------------------------------------------------------------- /assets/styles/sass/_main.scss: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | html { 6 | height: 100%; 7 | font-size: $fontSize; 8 | } 9 | 10 | body { 11 | font-family: var(--font-family); 12 | color: var(--text-color); 13 | background-color: var(--surface-ground); 14 | margin: 0; 15 | padding: 0; 16 | min-height: 100%; 17 | -webkit-font-smoothing: antialiased; 18 | -moz-osx-font-smoothing: grayscale; 19 | } 20 | 21 | a { 22 | text-decoration: none; 23 | color: var(--primary-color); 24 | } 25 | 26 | .layout-theme-light { 27 | background-color: #edf1f5; 28 | } 29 | -------------------------------------------------------------------------------- /assets/styles/sass/_menu.scss: -------------------------------------------------------------------------------- 1 | .layout-sidebar { 2 | position: fixed; 3 | width: 300px; 4 | height: calc(100vh - 9rem); 5 | z-index: 999; 6 | overflow-y: auto; 7 | user-select: none; 8 | top: 7rem; 9 | left: 2rem; 10 | transition: 11 | transform $transitionDuration, 12 | left $transitionDuration; 13 | background-color: var(--surface-overlay); 14 | border-radius: 12px; 15 | padding: 1.5rem; 16 | box-shadow: 17 | 0px 3px 5px rgba(0, 0, 0, 0.02), 18 | 0px 0px 2px rgba(0, 0, 0, 0.05), 19 | 0px 1px 4px rgba(0, 0, 0, 0.08); 20 | } 21 | 22 | .layout-menu { 23 | list-style-type: none; 24 | margin: 0; 25 | padding: 0; 26 | 27 | li { 28 | &.layout-menuitem-category { 29 | margin-top: 0.75rem; 30 | 31 | &:first-child { 32 | margin-top: 0; 33 | } 34 | } 35 | 36 | .layout-menuitem-root-text { 37 | text-transform: uppercase; 38 | color: var(--surface-900); 39 | font-weight: 600; 40 | margin-bottom: 0.5rem; 41 | font-size: 0.875rem; 42 | } 43 | 44 | a { 45 | cursor: pointer; 46 | text-decoration: none; 47 | display: flex; 48 | align-items: center; 49 | color: var(--text-color); 50 | transition: color $transitionDuration; 51 | border-radius: $borderRadius; 52 | padding: 0.75rem 1rem; 53 | transition: background-color 0.15s; 54 | 55 | span { 56 | margin-left: 0.5rem; 57 | } 58 | 59 | .menuitem-toggle-icon { 60 | margin-left: auto; 61 | } 62 | 63 | &:focus { 64 | @include focused-inset(); 65 | } 66 | 67 | &:hover { 68 | background-color: var(--surface-hover); 69 | } 70 | 71 | &.router-link-exact-active { 72 | font-weight: 700; 73 | color: var(--primary-color); 74 | } 75 | 76 | .p-badge { 77 | margin-left: auto; 78 | } 79 | } 80 | 81 | &.active-menuitem { 82 | > a { 83 | .menuitem-toggle-icon { 84 | &:before { 85 | content: "\e933"; 86 | } 87 | } 88 | } 89 | } 90 | 91 | ul { 92 | list-style-type: none; 93 | margin: 0; 94 | padding: 0; 95 | 96 | &.layout-submenu-wrapper-enter-from, 97 | &.layout-submenu-wrapper-leave-to { 98 | max-height: 0; 99 | } 100 | 101 | &.layout-submenu-wrapper-enter-to, 102 | &.layout-submenu-wrapper-leave-from { 103 | max-height: 1000px; 104 | } 105 | 106 | &.layout-submenu-wrapper-leave-active { 107 | overflow: hidden; 108 | transition: max-height 0.45s cubic-bezier(0, 1, 0, 1); 109 | } 110 | 111 | &.layout-submenu-wrapper-enter-active { 112 | overflow: hidden; 113 | transition: max-height 1s ease-in-out; 114 | } 115 | 116 | ul { 117 | padding-left: 1rem; 118 | } 119 | } 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /assets/styles/sass/_mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin focused() { 2 | outline: 0 none; 3 | outline-offset: 0; 4 | transition: box-shadow 0.2s; 5 | box-shadow: var(--focus-ring); 6 | } 7 | 8 | @mixin focused-inset() { 9 | outline: 0 none; 10 | outline-offset: 0; 11 | transition: box-shadow 0.2s; 12 | box-shadow: inset var(--focus-ring); 13 | } 14 | -------------------------------------------------------------------------------- /assets/styles/sass/_responsive.scss: -------------------------------------------------------------------------------- 1 | @media (min-width: 992px) { 2 | .layout-wrapper { 3 | &.layout-overlay { 4 | .layout-main-container { 5 | margin-left: 0; 6 | padding-left: 2rem; 7 | } 8 | 9 | .layout-sidebar { 10 | transform: translateX(-100%); 11 | left: 0; 12 | top: 0; 13 | height: 100vh; 14 | border-top-left-radius: 0; 15 | border-bottom-left-radius: 0; 16 | } 17 | 18 | &.layout-overlay-sidebar-active { 19 | .layout-sidebar { 20 | transform: translateX(0); 21 | } 22 | } 23 | } 24 | 25 | &.layout-static { 26 | .layout-main-container { 27 | margin-left: 300px; 28 | } 29 | 30 | &.layout-static-sidebar-inactive { 31 | .layout-sidebar { 32 | transform: translateX(-100%); 33 | left: 0; 34 | } 35 | 36 | .layout-main-container { 37 | margin-left: 0; 38 | padding-left: 2rem; 39 | } 40 | } 41 | } 42 | 43 | .layout-mask { 44 | display: none; 45 | } 46 | } 47 | } 48 | 49 | @media (max-width: 991px) { 50 | .layout-wrapper { 51 | .layout-main-container { 52 | margin-left: 0; 53 | padding-left: 2rem; 54 | } 55 | 56 | .layout-sidebar { 57 | transform: translateX(-100%); 58 | left: 0; 59 | top: 0; 60 | height: 100vh; 61 | border-top-left-radius: 0; 62 | border-bottom-left-radius: 0; 63 | } 64 | 65 | .layout-mask { 66 | z-index: 998; 67 | background-color: var(--maskbg); 68 | 69 | &.layout-mask-enter-from, 70 | &.layout-mask-leave-to { 71 | background-color: transparent; 72 | } 73 | } 74 | 75 | &.layout-mobile-sidebar-active { 76 | .layout-sidebar { 77 | transform: translateX(0); 78 | } 79 | 80 | .layout-mask { 81 | display: block; 82 | } 83 | } 84 | } 85 | 86 | .body-overflow-hidden { 87 | overflow: hidden; 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /assets/styles/sass/_splash.scss: -------------------------------------------------------------------------------- 1 | .preloader { 2 | position: fixed; 3 | z-index: 999999; 4 | background: #edf1f5; 5 | width: 100%; 6 | height: 100%; 7 | } 8 | .preloader-content { 9 | border: 0 solid transparent; 10 | border-radius: 50%; 11 | width: 150px; 12 | height: 150px; 13 | position: absolute; 14 | top: calc(50vh - 75px); 15 | left: calc(50vw - 75px); 16 | } 17 | 18 | .preloader-content:before, 19 | .preloader-content:after { 20 | content: ""; 21 | border: 1em solid var(--primary-color); 22 | border-radius: 50%; 23 | width: inherit; 24 | height: inherit; 25 | position: absolute; 26 | top: 0; 27 | left: 0; 28 | animation: loader 2s linear infinite; 29 | opacity: 0; 30 | } 31 | 32 | .preloader-content:before { 33 | animation-delay: 0.5s; 34 | } 35 | 36 | @keyframes loader { 37 | 0% { 38 | transform: scale(0); 39 | opacity: 0; 40 | } 41 | 50% { 42 | opacity: 1; 43 | } 44 | 100% { 45 | transform: scale(1); 46 | opacity: 0; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /assets/styles/sass/_topbar.scss: -------------------------------------------------------------------------------- 1 | .layout-topbar { 2 | position: fixed; 3 | height: 5rem; 4 | z-index: 997; 5 | left: 0; 6 | top: 0; 7 | width: 100%; 8 | padding: 0 2rem; 9 | background-color: var(--surface-card); 10 | transition: left $transitionDuration; 11 | display: flex; 12 | align-items: center; 13 | box-shadow: 14 | 0px 3px 5px rgba(0, 0, 0, 0.02), 15 | 0px 0px 2px rgba(0, 0, 0, 0.05), 16 | 0px 1px 4px rgba(0, 0, 0, 0.08); 17 | 18 | .layout-topbar-logo { 19 | display: flex; 20 | align-items: center; 21 | color: var(--surface-900); 22 | font-size: 1.5rem; 23 | font-weight: 500; 24 | width: 300px; 25 | border-radius: 12px; 26 | 27 | img { 28 | height: 2.5rem; 29 | margin-right: 0.5rem; 30 | } 31 | 32 | &:focus { 33 | @include focused(); 34 | } 35 | } 36 | 37 | .layout-topbar-button { 38 | display: inline-flex; 39 | justify-content: center; 40 | align-items: center; 41 | position: relative; 42 | color: var(--text-color-secondary); 43 | border-radius: 50%; 44 | width: 3rem; 45 | height: 3rem; 46 | cursor: pointer; 47 | transition: background-color $transitionDuration; 48 | 49 | &:hover { 50 | color: var(--text-color); 51 | background-color: var(--surface-hover); 52 | } 53 | 54 | &:focus { 55 | @include focused(); 56 | } 57 | 58 | i { 59 | font-size: 1.5rem; 60 | } 61 | 62 | span { 63 | font-size: 1rem; 64 | display: none; 65 | } 66 | } 67 | 68 | .layout-menu-button { 69 | margin-left: 2rem; 70 | } 71 | 72 | .layout-topbar-menu-button { 73 | display: none; 74 | 75 | i { 76 | font-size: 1.25rem; 77 | } 78 | } 79 | 80 | .layout-topbar-menu { 81 | margin: 0 0 0 auto; 82 | padding: 0; 83 | list-style: none; 84 | display: flex; 85 | 86 | .layout-topbar-button { 87 | margin-left: 1rem; 88 | } 89 | } 90 | } 91 | 92 | @media (max-width: 991px) { 93 | .layout-topbar { 94 | justify-content: space-between; 95 | 96 | .layout-topbar-logo { 97 | width: auto; 98 | order: 2; 99 | } 100 | 101 | .layout-menu-button { 102 | margin-left: 0; 103 | order: 1; 104 | } 105 | 106 | .layout-topbar-menu-button { 107 | display: inline-flex; 108 | margin-left: 0; 109 | order: 3; 110 | } 111 | 112 | .layout-topbar-menu { 113 | margin-left: 0; 114 | position: absolute; 115 | flex-direction: column; 116 | background-color: var(--surface-overlay); 117 | box-shadow: 118 | 0px 3px 5px rgba(0, 0, 0, 0.02), 119 | 0px 0px 2px rgba(0, 0, 0, 0.05), 120 | 0px 1px 4px rgba(0, 0, 0, 0.08); 121 | border-radius: 12px; 122 | padding: 1rem; 123 | right: 2rem; 124 | top: 5rem; 125 | min-width: 15rem; 126 | 127 | .layout-topbar-button { 128 | margin-left: 0; 129 | display: flex; 130 | width: 100%; 131 | height: auto; 132 | justify-content: flex-start; 133 | border-radius: 12px; 134 | padding: 1rem; 135 | 136 | i { 137 | font-size: 1rem; 138 | margin-right: 0.5rem; 139 | } 140 | 141 | span { 142 | font-weight: medium; 143 | display: block; 144 | } 145 | } 146 | } 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /assets/styles/sass/_typography.scss: -------------------------------------------------------------------------------- 1 | h1, 2 | h2, 3 | h3, 4 | h4, 5 | h5, 6 | h6 { 7 | margin: 1.5rem 0 1rem 0; 8 | font-family: inherit; 9 | font-weight: 500; 10 | line-height: 1.2; 11 | color: inherit; 12 | 13 | &:first-child { 14 | margin-top: 0; 15 | } 16 | } 17 | 18 | h1 { 19 | font-size: 2.5rem; 20 | } 21 | 22 | h2 { 23 | font-size: 2rem; 24 | } 25 | 26 | h3 { 27 | font-size: 1.75rem; 28 | } 29 | 30 | h4 { 31 | font-size: 1.5rem; 32 | } 33 | 34 | h5 { 35 | font-size: 1.25rem; 36 | } 37 | 38 | h6 { 39 | font-size: 1rem; 40 | } 41 | 42 | mark { 43 | background: #fff8e1; 44 | padding: 0.25rem 0.4rem; 45 | border-radius: $borderRadius; 46 | font-family: monospace; 47 | } 48 | 49 | blockquote { 50 | margin: 1rem 0; 51 | padding: 0 2rem; 52 | border-left: 4px solid #90a4ae; 53 | } 54 | 55 | hr { 56 | border-top: solid var(--surface-border); 57 | border-width: 1px 0 0 0; 58 | margin: 1rem 0; 59 | } 60 | 61 | p { 62 | margin: 0 0 1rem 0; 63 | line-height: 1.5; 64 | 65 | &:last-child { 66 | margin-bottom: 0; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /assets/styles/sass/_utils.scss: -------------------------------------------------------------------------------- 1 | .card { 2 | background-color: var(--surface-card); 3 | padding: 1.5rem; 4 | color: var(--surface-900); 5 | margin-bottom: 1rem; 6 | border-radius: $borderRadius; 7 | box-shadow: 8 | 0px 3px 5px rgba(0, 0, 0, 0.02), 9 | 0px 0px 2px rgba(0, 0, 0, 0.05), 10 | 0px 1px 4px rgba(0, 0, 0, 0.08) !important; 11 | 12 | &.card-w-title { 13 | padding-bottom: 2rem; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /binjgb.js: -------------------------------------------------------------------------------- 1 | var Binjgb = (() => { 2 | var _scriptDir = 3 | typeof document !== "undefined" && document.currentScript 4 | ? document.currentScript.src 5 | : undefined; 6 | 7 | return function (Binjgb) { 8 | Binjgb = Binjgb || {}; 9 | 10 | var Module = typeof Binjgb != "undefined" ? Binjgb : {}; 11 | var readyPromiseResolve, readyPromiseReject; 12 | Module["ready"] = new Promise(function (resolve, reject) { 13 | readyPromiseResolve = resolve; 14 | readyPromiseReject = reject; 15 | }); 16 | var moduleOverrides = Object.assign({}, Module); 17 | var arguments_ = []; 18 | var thisProgram = "./this.program"; 19 | var quit_ = (status, toThrow) => { 20 | throw toThrow; 21 | }; 22 | var ENVIRONMENT_IS_WEB = true; 23 | var ENVIRONMENT_IS_WORKER = false; 24 | var scriptDirectory = ""; 25 | 26 | function locateFile(path) { 27 | if (Module["locateFile"]) { 28 | return Module["locateFile"](path, scriptDirectory); 29 | } 30 | return scriptDirectory + path; 31 | } 32 | var read_, readAsync, readBinary, setWindowTitle; 33 | if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { 34 | if (ENVIRONMENT_IS_WORKER) { 35 | scriptDirectory = self.location.href; 36 | } else if (typeof document != "undefined" && document.currentScript) { 37 | scriptDirectory = document.currentScript.src; 38 | } 39 | if (_scriptDir) { 40 | scriptDirectory = _scriptDir; 41 | } 42 | if (scriptDirectory.indexOf("blob:") !== 0) { 43 | scriptDirectory = scriptDirectory.substr( 44 | 0, 45 | scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1, 46 | ); 47 | } else { 48 | scriptDirectory = ""; 49 | } 50 | { 51 | read_ = (url) => { 52 | var xhr = new XMLHttpRequest(); 53 | xhr.open("GET", url, false); 54 | xhr.send(null); 55 | return xhr.responseText; 56 | }; 57 | if (ENVIRONMENT_IS_WORKER) { 58 | readBinary = (url) => { 59 | var xhr = new XMLHttpRequest(); 60 | xhr.open("GET", url, false); 61 | xhr.responseType = "arraybuffer"; 62 | xhr.send(null); 63 | return new Uint8Array(xhr.response); 64 | }; 65 | } 66 | readAsync = (url, onload, onerror) => { 67 | var xhr = new XMLHttpRequest(); 68 | xhr.open("GET", url, true); 69 | xhr.responseType = "arraybuffer"; 70 | xhr.onload = () => { 71 | if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { 72 | onload(xhr.response); 73 | return; 74 | } 75 | onerror(); 76 | }; 77 | xhr.onerror = onerror; 78 | xhr.send(null); 79 | }; 80 | } 81 | setWindowTitle = (title) => (document.title = title); 82 | } else { 83 | } 84 | var out = Module["print"] || console.log.bind(console); 85 | var err = Module["printErr"] || console.warn.bind(console); 86 | Object.assign(Module, moduleOverrides); 87 | moduleOverrides = null; 88 | if (Module["arguments"]) arguments_ = Module["arguments"]; 89 | if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; 90 | if (Module["quit"]) quit_ = Module["quit"]; 91 | var wasmBinary; 92 | if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; 93 | var noExitRuntime = Module["noExitRuntime"] || true; 94 | if (typeof WebAssembly != "object") { 95 | abort("no native wasm support detected"); 96 | } 97 | var wasmMemory; 98 | var ABORT = false; 99 | var EXITSTATUS; 100 | var UTF8Decoder = 101 | typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; 102 | 103 | function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) { 104 | var endIdx = idx + maxBytesToRead; 105 | var endPtr = idx; 106 | while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; 107 | if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { 108 | return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); 109 | } 110 | var str = ""; 111 | while (idx < endPtr) { 112 | var u0 = heapOrArray[idx++]; 113 | if (!(u0 & 128)) { 114 | str += String.fromCharCode(u0); 115 | continue; 116 | } 117 | var u1 = heapOrArray[idx++] & 63; 118 | if ((u0 & 224) == 192) { 119 | str += String.fromCharCode(((u0 & 31) << 6) | u1); 120 | continue; 121 | } 122 | var u2 = heapOrArray[idx++] & 63; 123 | if ((u0 & 240) == 224) { 124 | u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; 125 | } else { 126 | u0 = 127 | ((u0 & 7) << 18) | 128 | (u1 << 12) | 129 | (u2 << 6) | 130 | (heapOrArray[idx++] & 63); 131 | } 132 | if (u0 < 65536) { 133 | str += String.fromCharCode(u0); 134 | } else { 135 | var ch = u0 - 65536; 136 | str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); 137 | } 138 | } 139 | return str; 140 | } 141 | 142 | function UTF8ToString(ptr, maxBytesToRead) { 143 | return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; 144 | } 145 | var buffer, 146 | HEAP8, 147 | HEAPU8, 148 | HEAP16, 149 | HEAPU16, 150 | HEAP32, 151 | HEAPU32, 152 | HEAPF32, 153 | HEAPF64; 154 | 155 | function updateGlobalBufferAndViews(buf) { 156 | buffer = buf; 157 | Module["HEAP8"] = HEAP8 = new Int8Array(buf); 158 | Module["HEAP16"] = HEAP16 = new Int16Array(buf); 159 | Module["HEAP32"] = HEAP32 = new Int32Array(buf); 160 | Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); 161 | Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); 162 | Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); 163 | Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); 164 | Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); 165 | } 166 | var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; 167 | var wasmTable; 168 | var __ATPRERUN__ = []; 169 | var __ATINIT__ = []; 170 | var __ATPOSTRUN__ = []; 171 | var runtimeInitialized = false; 172 | 173 | function keepRuntimeAlive() { 174 | return noExitRuntime; 175 | } 176 | 177 | function preRun() { 178 | if (Module["preRun"]) { 179 | if (typeof Module["preRun"] == "function") 180 | Module["preRun"] = [Module["preRun"]]; 181 | while (Module["preRun"].length) { 182 | addOnPreRun(Module["preRun"].shift()); 183 | } 184 | } 185 | callRuntimeCallbacks(__ATPRERUN__); 186 | } 187 | 188 | function initRuntime() { 189 | runtimeInitialized = true; 190 | callRuntimeCallbacks(__ATINIT__); 191 | } 192 | 193 | function postRun() { 194 | if (Module["postRun"]) { 195 | if (typeof Module["postRun"] == "function") 196 | Module["postRun"] = [Module["postRun"]]; 197 | while (Module["postRun"].length) { 198 | addOnPostRun(Module["postRun"].shift()); 199 | } 200 | } 201 | callRuntimeCallbacks(__ATPOSTRUN__); 202 | } 203 | 204 | function addOnPreRun(cb) { 205 | __ATPRERUN__.unshift(cb); 206 | } 207 | 208 | function addOnInit(cb) { 209 | __ATINIT__.unshift(cb); 210 | } 211 | 212 | function addOnPostRun(cb) { 213 | __ATPOSTRUN__.unshift(cb); 214 | } 215 | var runDependencies = 0; 216 | var runDependencyWatcher = null; 217 | var dependenciesFulfilled = null; 218 | 219 | function addRunDependency(id) { 220 | runDependencies++; 221 | if (Module["monitorRunDependencies"]) { 222 | Module["monitorRunDependencies"](runDependencies); 223 | } 224 | } 225 | 226 | function removeRunDependency(id) { 227 | runDependencies--; 228 | if (Module["monitorRunDependencies"]) { 229 | Module["monitorRunDependencies"](runDependencies); 230 | } 231 | if (runDependencies == 0) { 232 | if (runDependencyWatcher !== null) { 233 | clearInterval(runDependencyWatcher); 234 | runDependencyWatcher = null; 235 | } 236 | if (dependenciesFulfilled) { 237 | var callback = dependenciesFulfilled; 238 | dependenciesFulfilled = null; 239 | callback(); 240 | } 241 | } 242 | } 243 | 244 | function abort(what) { 245 | if (Module["onAbort"]) { 246 | Module["onAbort"](what); 247 | } 248 | what = "Aborted(" + what + ")"; 249 | err(what); 250 | ABORT = true; 251 | EXITSTATUS = 1; 252 | what += ". Build with -sASSERTIONS for more info."; 253 | var e = new WebAssembly.RuntimeError(what); 254 | readyPromiseReject(e); 255 | throw e; 256 | } 257 | var dataURIPrefix = "data:application/octet-stream;base64,"; 258 | 259 | function isDataURI(filename) { 260 | return filename.startsWith(dataURIPrefix); 261 | } 262 | var wasmBinaryFile; 263 | wasmBinaryFile = "/js/binjgb.wasm"; 264 | if (!isDataURI(wasmBinaryFile)) { 265 | wasmBinaryFile = locateFile(wasmBinaryFile); 266 | } 267 | 268 | function getBinary(file) { 269 | try { 270 | if (file == wasmBinaryFile && wasmBinary) { 271 | return new Uint8Array(wasmBinary); 272 | } 273 | if (readBinary) { 274 | return readBinary(file); 275 | } 276 | throw "both async and sync fetching of the wasm failed"; 277 | } catch (err) { 278 | abort(err); 279 | } 280 | } 281 | 282 | function getBinaryPromise() { 283 | if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { 284 | if (typeof fetch == "function") { 285 | return fetch(wasmBinaryFile, { 286 | credentials: "same-origin", 287 | }) 288 | .then(function (response) { 289 | if (!response["ok"]) { 290 | throw ( 291 | "failed to load wasm binary file at '" + wasmBinaryFile + "'" 292 | ); 293 | } 294 | return response["arrayBuffer"](); 295 | }) 296 | .catch(function () { 297 | return getBinary(wasmBinaryFile); 298 | }); 299 | } 300 | } 301 | return Promise.resolve().then(function () { 302 | return getBinary(wasmBinaryFile); 303 | }); 304 | } 305 | 306 | function createWasm() { 307 | var info = { 308 | a: asmLibraryArg, 309 | }; 310 | 311 | function receiveInstance(instance, module) { 312 | var exports = instance.exports; 313 | Module["asm"] = exports; 314 | wasmMemory = Module["asm"]["g"]; 315 | updateGlobalBufferAndViews(wasmMemory.buffer); 316 | wasmTable = Module["asm"]["F"]; 317 | addOnInit(Module["asm"]["h"]); 318 | removeRunDependency("wasm-instantiate"); 319 | } 320 | addRunDependency("wasm-instantiate"); 321 | 322 | function receiveInstantiationResult(result) { 323 | receiveInstance(result["instance"]); 324 | } 325 | 326 | function instantiateArrayBuffer(receiver) { 327 | return getBinaryPromise() 328 | .then(function (binary) { 329 | return WebAssembly.instantiate(binary, info); 330 | }) 331 | .then(function (instance) { 332 | return instance; 333 | }) 334 | .then(receiver, function (reason) { 335 | err("failed to asynchronously prepare wasm: " + reason); 336 | abort(reason); 337 | }); 338 | } 339 | 340 | function instantiateAsync() { 341 | if ( 342 | !wasmBinary && 343 | typeof WebAssembly.instantiateStreaming == "function" && 344 | !isDataURI(wasmBinaryFile) && 345 | typeof fetch == "function" 346 | ) { 347 | return fetch(wasmBinaryFile, { 348 | credentials: "same-origin", 349 | }).then(function (response) { 350 | var result = WebAssembly.instantiateStreaming(response, info); 351 | return result.then(receiveInstantiationResult, function (reason) { 352 | err("wasm streaming compile failed: " + reason); 353 | err("falling back to ArrayBuffer instantiation"); 354 | return instantiateArrayBuffer(receiveInstantiationResult); 355 | }); 356 | }); 357 | } else { 358 | return instantiateArrayBuffer(receiveInstantiationResult); 359 | } 360 | } 361 | if (Module["instantiateWasm"]) { 362 | try { 363 | var exports = Module["instantiateWasm"](info, receiveInstance); 364 | return exports; 365 | } catch (e) { 366 | err("Module.instantiateWasm callback failed with error: " + e); 367 | readyPromiseReject(e); 368 | } 369 | } 370 | instantiateAsync().catch(readyPromiseReject); 371 | return {}; 372 | } 373 | 374 | function ExitStatus(status) { 375 | this.name = "ExitStatus"; 376 | this.message = "Program terminated with exit(" + status + ")"; 377 | this.status = status; 378 | } 379 | 380 | function callRuntimeCallbacks(callbacks) { 381 | while (callbacks.length > 0) { 382 | callbacks.shift()(Module); 383 | } 384 | } 385 | 386 | function _emscripten_memcpy_big(dest, src, num) { 387 | HEAPU8.copyWithin(dest, src, src + num); 388 | } 389 | 390 | function abortOnCannotGrowMemory(requestedSize) { 391 | abort("OOM"); 392 | } 393 | 394 | function _emscripten_resize_heap(requestedSize) { 395 | var oldSize = HEAPU8.length; 396 | requestedSize = requestedSize >>> 0; 397 | abortOnCannotGrowMemory(requestedSize); 398 | } 399 | var SYSCALLS = { 400 | varargs: undefined, 401 | get: function () { 402 | SYSCALLS.varargs += 4; 403 | var ret = HEAP32[(SYSCALLS.varargs - 4) >> 2]; 404 | return ret; 405 | }, 406 | getStr: function (ptr) { 407 | var ret = UTF8ToString(ptr); 408 | return ret; 409 | }, 410 | }; 411 | 412 | function _proc_exit(code) { 413 | EXITSTATUS = code; 414 | if (!keepRuntimeAlive()) { 415 | if (Module["onExit"]) Module["onExit"](code); 416 | ABORT = true; 417 | } 418 | quit_(code, new ExitStatus(code)); 419 | } 420 | 421 | function exitJS(status, implicit) { 422 | EXITSTATUS = status; 423 | _proc_exit(status); 424 | } 425 | var _exit = exitJS; 426 | 427 | function _fd_close(fd) { 428 | return 52; 429 | } 430 | 431 | function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { 432 | return 70; 433 | } 434 | var printCharBuffers = [null, [], []]; 435 | 436 | function printChar(stream, curr) { 437 | var buffer = printCharBuffers[stream]; 438 | if (curr === 0 || curr === 10) { 439 | (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0)); 440 | buffer.length = 0; 441 | } else { 442 | buffer.push(curr); 443 | } 444 | } 445 | 446 | function _fd_write(fd, iov, iovcnt, pnum) { 447 | var num = 0; 448 | for (var i = 0; i < iovcnt; i++) { 449 | var ptr = HEAPU32[iov >> 2]; 450 | var len = HEAPU32[(iov + 4) >> 2]; 451 | iov += 8; 452 | for (var j = 0; j < len; j++) { 453 | printChar(fd, HEAPU8[ptr + j]); 454 | } 455 | num += len; 456 | } 457 | HEAPU32[pnum >> 2] = num; 458 | return 0; 459 | } 460 | var asmLibraryArg = { 461 | f: _emscripten_memcpy_big, 462 | d: _emscripten_resize_heap, 463 | b: _exit, 464 | e: _fd_close, 465 | c: _fd_seek, 466 | a: _fd_write, 467 | }; 468 | var asm = createWasm(); 469 | var ___wasm_call_ctors = (Module["___wasm_call_ctors"] = function () { 470 | return (___wasm_call_ctors = Module["___wasm_call_ctors"] = 471 | Module["asm"]["h"]).apply(null, arguments); 472 | }); 473 | var _malloc = (Module["_malloc"] = function () { 474 | return (_malloc = Module["_malloc"] = Module["asm"]["i"]).apply( 475 | null, 476 | arguments, 477 | ); 478 | }); 479 | var _file_data_delete = (Module["_file_data_delete"] = function () { 480 | return (_file_data_delete = Module["_file_data_delete"] = 481 | Module["asm"]["j"]).apply(null, arguments); 482 | }); 483 | var _emulator_set_builtin_palette = (Module[ 484 | "_emulator_set_builtin_palette" 485 | ] = function () { 486 | return (_emulator_set_builtin_palette = Module[ 487 | "_emulator_set_builtin_palette" 488 | ] = 489 | Module["asm"]["k"]).apply(null, arguments); 490 | }); 491 | var _emulator_was_ext_ram_updated = (Module[ 492 | "_emulator_was_ext_ram_updated" 493 | ] = function () { 494 | return (_emulator_was_ext_ram_updated = Module[ 495 | "_emulator_was_ext_ram_updated" 496 | ] = 497 | Module["asm"]["l"]).apply(null, arguments); 498 | }); 499 | var _emulator_read_ext_ram = (Module["_emulator_read_ext_ram"] = 500 | function () { 501 | return (_emulator_read_ext_ram = Module["_emulator_read_ext_ram"] = 502 | Module["asm"]["m"]).apply(null, arguments); 503 | }); 504 | var _emulator_write_ext_ram = (Module["_emulator_write_ext_ram"] = 505 | function () { 506 | return (_emulator_write_ext_ram = Module["_emulator_write_ext_ram"] = 507 | Module["asm"]["n"]).apply(null, arguments); 508 | }); 509 | var _emulator_delete = (Module["_emulator_delete"] = function () { 510 | return (_emulator_delete = Module["_emulator_delete"] = 511 | Module["asm"]["o"]).apply(null, arguments); 512 | }); 513 | var _emulator_get_PC = (Module["_emulator_get_PC"] = function () { 514 | return (_emulator_get_PC = Module["_emulator_get_PC"] = 515 | Module["asm"]["p"]).apply(null, arguments); 516 | }); 517 | var _emulator_get_A = (Module["_emulator_get_A"] = function () { 518 | return (_emulator_get_A = Module["_emulator_get_A"] = 519 | Module["asm"]["q"]).apply(null, arguments); 520 | }); 521 | var _emulator_get_BC = (Module["_emulator_get_BC"] = function () { 522 | return (_emulator_get_BC = Module["_emulator_get_BC"] = 523 | Module["asm"]["r"]).apply(null, arguments); 524 | }); 525 | var _emulator_get_DE = (Module["_emulator_get_DE"] = function () { 526 | return (_emulator_get_DE = Module["_emulator_get_DE"] = 527 | Module["asm"]["s"]).apply(null, arguments); 528 | }); 529 | var _emulator_get_HL = (Module["_emulator_get_HL"] = function () { 530 | return (_emulator_get_HL = Module["_emulator_get_HL"] = 531 | Module["asm"]["t"]).apply(null, arguments); 532 | }); 533 | var _emulator_get_F = (Module["_emulator_get_F"] = function () { 534 | return (_emulator_get_F = Module["_emulator_get_F"] = 535 | Module["asm"]["u"]).apply(null, arguments); 536 | }); 537 | var _emulator_get_SP = (Module["_emulator_get_SP"] = function () { 538 | return (_emulator_get_SP = Module["_emulator_get_SP"] = 539 | Module["asm"]["v"]).apply(null, arguments); 540 | }); 541 | var _emulator_set_PC = (Module["_emulator_set_PC"] = function () { 542 | return (_emulator_set_PC = Module["_emulator_set_PC"] = 543 | Module["asm"]["w"]).apply(null, arguments); 544 | }); 545 | var _emulator_get_wram_ptr = (Module["_emulator_get_wram_ptr"] = 546 | function () { 547 | return (_emulator_get_wram_ptr = Module["_emulator_get_wram_ptr"] = 548 | Module["asm"]["x"]).apply(null, arguments); 549 | }); 550 | var _emulator_get_hram_ptr = (Module["_emulator_get_hram_ptr"] = 551 | function () { 552 | return (_emulator_get_hram_ptr = Module["_emulator_get_hram_ptr"] = 553 | Module["asm"]["y"]).apply(null, arguments); 554 | }); 555 | var _emulator_read_mem = (Module["_emulator_read_mem"] = function () { 556 | return (_emulator_read_mem = Module["_emulator_read_mem"] = 557 | Module["asm"]["z"]).apply(null, arguments); 558 | }); 559 | var _emulator_write_mem = (Module["_emulator_write_mem"] = function () { 560 | return (_emulator_write_mem = Module["_emulator_write_mem"] = 561 | Module["asm"]["A"]).apply(null, arguments); 562 | }); 563 | var _emulator_set_breakpoint = (Module["_emulator_set_breakpoint"] = 564 | function () { 565 | return (_emulator_set_breakpoint = Module["_emulator_set_breakpoint"] = 566 | Module["asm"]["B"]).apply(null, arguments); 567 | }); 568 | var _emulator_clear_breakpoints = (Module["_emulator_clear_breakpoints"] = 569 | function () { 570 | return (_emulator_clear_breakpoints = Module[ 571 | "_emulator_clear_breakpoints" 572 | ] = 573 | Module["asm"]["C"]).apply(null, arguments); 574 | }); 575 | var _emulator_render_vram = (Module["_emulator_render_vram"] = function () { 576 | return (_emulator_render_vram = Module["_emulator_render_vram"] = 577 | Module["asm"]["D"]).apply(null, arguments); 578 | }); 579 | var _emulator_render_background = (Module["_emulator_render_background"] = 580 | function () { 581 | return (_emulator_render_background = Module[ 582 | "_emulator_render_background" 583 | ] = 584 | Module["asm"]["E"]).apply(null, arguments); 585 | }); 586 | var _joypad_new = (Module["_joypad_new"] = function () { 587 | return (_joypad_new = Module["_joypad_new"] = Module["asm"]["G"]).apply( 588 | null, 589 | arguments, 590 | ); 591 | }); 592 | var _joypad_delete = (Module["_joypad_delete"] = function () { 593 | return (_joypad_delete = Module["_joypad_delete"] = 594 | Module["asm"]["H"]).apply(null, arguments); 595 | }); 596 | var _rewind_append = (Module["_rewind_append"] = function () { 597 | return (_rewind_append = Module["_rewind_append"] = 598 | Module["asm"]["I"]).apply(null, arguments); 599 | }); 600 | var _rewind_delete = (Module["_rewind_delete"] = function () { 601 | return (_rewind_delete = Module["_rewind_delete"] = 602 | Module["asm"]["J"]).apply(null, arguments); 603 | }); 604 | var _emulator_new_simple = (Module["_emulator_new_simple"] = function () { 605 | return (_emulator_new_simple = Module["_emulator_new_simple"] = 606 | Module["asm"]["K"]).apply(null, arguments); 607 | }); 608 | var _emulator_get_ticks_f64 = (Module["_emulator_get_ticks_f64"] = 609 | function () { 610 | return (_emulator_get_ticks_f64 = Module["_emulator_get_ticks_f64"] = 611 | Module["asm"]["L"]).apply(null, arguments); 612 | }); 613 | var _emulator_run_until_f64 = (Module["_emulator_run_until_f64"] = 614 | function () { 615 | return (_emulator_run_until_f64 = Module["_emulator_run_until_f64"] = 616 | Module["asm"]["M"]).apply(null, arguments); 617 | }); 618 | var _rewind_get_newest_ticks_f64 = (Module["_rewind_get_newest_ticks_f64"] = 619 | function () { 620 | return (_rewind_get_newest_ticks_f64 = Module[ 621 | "_rewind_get_newest_ticks_f64" 622 | ] = 623 | Module["asm"]["N"]).apply(null, arguments); 624 | }); 625 | var _rewind_get_oldest_ticks_f64 = (Module["_rewind_get_oldest_ticks_f64"] = 626 | function () { 627 | return (_rewind_get_oldest_ticks_f64 = Module[ 628 | "_rewind_get_oldest_ticks_f64" 629 | ] = 630 | Module["asm"]["O"]).apply(null, arguments); 631 | }); 632 | var _emulator_set_default_joypad_callback = (Module[ 633 | "_emulator_set_default_joypad_callback" 634 | ] = function () { 635 | return (_emulator_set_default_joypad_callback = Module[ 636 | "_emulator_set_default_joypad_callback" 637 | ] = 638 | Module["asm"]["P"]).apply(null, arguments); 639 | }); 640 | var _emulator_set_bw_palette_simple = (Module[ 641 | "_emulator_set_bw_palette_simple" 642 | ] = function () { 643 | return (_emulator_set_bw_palette_simple = Module[ 644 | "_emulator_set_bw_palette_simple" 645 | ] = 646 | Module["asm"]["Q"]).apply(null, arguments); 647 | }); 648 | var _rewind_new_simple = (Module["_rewind_new_simple"] = function () { 649 | return (_rewind_new_simple = Module["_rewind_new_simple"] = 650 | Module["asm"]["R"]).apply(null, arguments); 651 | }); 652 | var _rewind_begin = (Module["_rewind_begin"] = function () { 653 | return (_rewind_begin = Module["_rewind_begin"] = 654 | Module["asm"]["S"]).apply(null, arguments); 655 | }); 656 | var _emulator_set_rewind_joypad_callback = (Module[ 657 | "_emulator_set_rewind_joypad_callback" 658 | ] = function () { 659 | return (_emulator_set_rewind_joypad_callback = Module[ 660 | "_emulator_set_rewind_joypad_callback" 661 | ] = 662 | Module["asm"]["T"]).apply(null, arguments); 663 | }); 664 | var _rewind_to_ticks_wrapper = (Module["_rewind_to_ticks_wrapper"] = 665 | function () { 666 | return (_rewind_to_ticks_wrapper = Module["_rewind_to_ticks_wrapper"] = 667 | Module["asm"]["U"]).apply(null, arguments); 668 | }); 669 | var _rewind_end = (Module["_rewind_end"] = function () { 670 | return (_rewind_end = Module["_rewind_end"] = Module["asm"]["V"]).apply( 671 | null, 672 | arguments, 673 | ); 674 | }); 675 | var _set_joyp_up = (Module["_set_joyp_up"] = function () { 676 | return (_set_joyp_up = Module["_set_joyp_up"] = Module["asm"]["W"]).apply( 677 | null, 678 | arguments, 679 | ); 680 | }); 681 | var _set_joyp_down = (Module["_set_joyp_down"] = function () { 682 | return (_set_joyp_down = Module["_set_joyp_down"] = 683 | Module["asm"]["X"]).apply(null, arguments); 684 | }); 685 | var _set_joyp_left = (Module["_set_joyp_left"] = function () { 686 | return (_set_joyp_left = Module["_set_joyp_left"] = 687 | Module["asm"]["Y"]).apply(null, arguments); 688 | }); 689 | var _set_joyp_right = (Module["_set_joyp_right"] = function () { 690 | return (_set_joyp_right = Module["_set_joyp_right"] = 691 | Module["asm"]["Z"]).apply(null, arguments); 692 | }); 693 | var _set_joyp_B = (Module["_set_joyp_B"] = function () { 694 | return (_set_joyp_B = Module["_set_joyp_B"] = Module["asm"]["_"]).apply( 695 | null, 696 | arguments, 697 | ); 698 | }); 699 | var _set_joyp_A = (Module["_set_joyp_A"] = function () { 700 | return (_set_joyp_A = Module["_set_joyp_A"] = Module["asm"]["$"]).apply( 701 | null, 702 | arguments, 703 | ); 704 | }); 705 | var _set_joyp_start = (Module["_set_joyp_start"] = function () { 706 | return (_set_joyp_start = Module["_set_joyp_start"] = 707 | Module["asm"]["aa"]).apply(null, arguments); 708 | }); 709 | var _set_joyp_select = (Module["_set_joyp_select"] = function () { 710 | return (_set_joyp_select = Module["_set_joyp_select"] = 711 | Module["asm"]["ba"]).apply(null, arguments); 712 | }); 713 | var _get_frame_buffer_ptr = (Module["_get_frame_buffer_ptr"] = function () { 714 | return (_get_frame_buffer_ptr = Module["_get_frame_buffer_ptr"] = 715 | Module["asm"]["ca"]).apply(null, arguments); 716 | }); 717 | var _get_frame_buffer_size = (Module["_get_frame_buffer_size"] = 718 | function () { 719 | return (_get_frame_buffer_size = Module["_get_frame_buffer_size"] = 720 | Module["asm"]["da"]).apply(null, arguments); 721 | }); 722 | var _get_sgb_frame_buffer_ptr = (Module["_get_sgb_frame_buffer_ptr"] = 723 | function () { 724 | return (_get_sgb_frame_buffer_ptr = Module[ 725 | "_get_sgb_frame_buffer_ptr" 726 | ] = 727 | Module["asm"]["ea"]).apply(null, arguments); 728 | }); 729 | var _get_sgb_frame_buffer_size = (Module["_get_sgb_frame_buffer_size"] = 730 | function () { 731 | return (_get_sgb_frame_buffer_size = Module[ 732 | "_get_sgb_frame_buffer_size" 733 | ] = 734 | Module["asm"]["fa"]).apply(null, arguments); 735 | }); 736 | var _get_audio_buffer_ptr = (Module["_get_audio_buffer_ptr"] = function () { 737 | return (_get_audio_buffer_ptr = Module["_get_audio_buffer_ptr"] = 738 | Module["asm"]["ga"]).apply(null, arguments); 739 | }); 740 | var _get_audio_buffer_capacity = (Module["_get_audio_buffer_capacity"] = 741 | function () { 742 | return (_get_audio_buffer_capacity = Module[ 743 | "_get_audio_buffer_capacity" 744 | ] = 745 | Module["asm"]["ha"]).apply(null, arguments); 746 | }); 747 | var _ext_ram_file_data_new = (Module["_ext_ram_file_data_new"] = 748 | function () { 749 | return (_ext_ram_file_data_new = Module["_ext_ram_file_data_new"] = 750 | Module["asm"]["ia"]).apply(null, arguments); 751 | }); 752 | var _get_file_data_ptr = (Module["_get_file_data_ptr"] = function () { 753 | return (_get_file_data_ptr = Module["_get_file_data_ptr"] = 754 | Module["asm"]["ja"]).apply(null, arguments); 755 | }); 756 | var _get_file_data_size = (Module["_get_file_data_size"] = function () { 757 | return (_get_file_data_size = Module["_get_file_data_size"] = 758 | Module["asm"]["ka"]).apply(null, arguments); 759 | }); 760 | var _set_log_apu_writes = (Module["_set_log_apu_writes"] = function () { 761 | return (_set_log_apu_writes = Module["_set_log_apu_writes"] = 762 | Module["asm"]["la"]).apply(null, arguments); 763 | }); 764 | var _get_apu_log_data_size = (Module["_get_apu_log_data_size"] = 765 | function () { 766 | return (_get_apu_log_data_size = Module["_get_apu_log_data_size"] = 767 | Module["asm"]["ma"]).apply(null, arguments); 768 | }); 769 | var _get_apu_log_data_ptr = (Module["_get_apu_log_data_ptr"] = function () { 770 | return (_get_apu_log_data_ptr = Module["_get_apu_log_data_ptr"] = 771 | Module["asm"]["na"]).apply(null, arguments); 772 | }); 773 | var _reset_apu_log = (Module["_reset_apu_log"] = function () { 774 | return (_reset_apu_log = Module["_reset_apu_log"] = 775 | Module["asm"]["oa"]).apply(null, arguments); 776 | }); 777 | var calledRun; 778 | dependenciesFulfilled = function runCaller() { 779 | if (!calledRun) run(); 780 | if (!calledRun) dependenciesFulfilled = runCaller; 781 | }; 782 | 783 | function run(args) { 784 | args = args || arguments_; 785 | if (runDependencies > 0) { 786 | return; 787 | } 788 | preRun(); 789 | if (runDependencies > 0) { 790 | return; 791 | } 792 | 793 | function doRun() { 794 | if (calledRun) return; 795 | calledRun = true; 796 | Module["calledRun"] = true; 797 | if (ABORT) return; 798 | initRuntime(); 799 | readyPromiseResolve(Module); 800 | if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); 801 | postRun(); 802 | } 803 | if (Module["setStatus"]) { 804 | Module["setStatus"]("Running..."); 805 | setTimeout(function () { 806 | setTimeout(function () { 807 | Module["setStatus"](""); 808 | }, 1); 809 | doRun(); 810 | }, 1); 811 | } else { 812 | doRun(); 813 | } 814 | } 815 | if (Module["preInit"]) { 816 | if (typeof Module["preInit"] == "function") 817 | Module["preInit"] = [Module["preInit"]]; 818 | while (Module["preInit"].length > 0) { 819 | Module["preInit"].pop()(); 820 | } 821 | } 822 | run(); 823 | 824 | return Binjgb.ready; 825 | }; 826 | })(); 827 | if (typeof exports === "object" && typeof module === "object") 828 | module.exports = Binjgb; 829 | else if (typeof define === "function" && define["amd"]) 830 | define([], function () { 831 | return Binjgb; 832 | }); 833 | else if (typeof exports === "object") exports["Binjgb"] = Binjgb; 834 | 835 | export default Binjgb; 836 | -------------------------------------------------------------------------------- /binjnes.js: -------------------------------------------------------------------------------- 1 | var Binjnes = (() => { 2 | var _scriptDir = 3 | typeof document !== "undefined" && document.currentScript 4 | ? document.currentScript.src 5 | : undefined; 6 | 7 | return function (Binjnes) { 8 | Binjnes = Binjnes || {}; 9 | 10 | var Module = typeof Binjnes != "undefined" ? Binjnes : {}; 11 | var readyPromiseResolve, readyPromiseReject; 12 | Module["ready"] = new Promise(function (resolve, reject) { 13 | readyPromiseResolve = resolve; 14 | readyPromiseReject = reject; 15 | }); 16 | var moduleOverrides = Object.assign({}, Module); 17 | var arguments_ = []; 18 | var thisProgram = "./this.program"; 19 | var quit_ = (status, toThrow) => { 20 | throw toThrow; 21 | }; 22 | var ENVIRONMENT_IS_WEB = true; 23 | var ENVIRONMENT_IS_WORKER = false; 24 | var scriptDirectory = ""; 25 | function locateFile(path) { 26 | if (Module["locateFile"]) { 27 | return Module["locateFile"](path, scriptDirectory); 28 | } 29 | return scriptDirectory + path; 30 | } 31 | var read_, readAsync, readBinary, setWindowTitle; 32 | if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { 33 | if (ENVIRONMENT_IS_WORKER) { 34 | scriptDirectory = self.location.href; 35 | } else if (typeof document != "undefined" && document.currentScript) { 36 | scriptDirectory = document.currentScript.src; 37 | } 38 | if (_scriptDir) { 39 | scriptDirectory = _scriptDir; 40 | } 41 | if (scriptDirectory.indexOf("blob:") !== 0) { 42 | scriptDirectory = scriptDirectory.substr( 43 | 0, 44 | scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1, 45 | ); 46 | } else { 47 | scriptDirectory = ""; 48 | } 49 | { 50 | read_ = (url) => { 51 | var xhr = new XMLHttpRequest(); 52 | xhr.open("GET", url, false); 53 | xhr.send(null); 54 | return xhr.responseText; 55 | }; 56 | if (ENVIRONMENT_IS_WORKER) { 57 | readBinary = (url) => { 58 | var xhr = new XMLHttpRequest(); 59 | xhr.open("GET", url, false); 60 | xhr.responseType = "arraybuffer"; 61 | xhr.send(null); 62 | return new Uint8Array(xhr.response); 63 | }; 64 | } 65 | readAsync = (url, onload, onerror) => { 66 | var xhr = new XMLHttpRequest(); 67 | xhr.open("GET", url, true); 68 | xhr.responseType = "arraybuffer"; 69 | xhr.onload = () => { 70 | if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { 71 | onload(xhr.response); 72 | return; 73 | } 74 | onerror(); 75 | }; 76 | xhr.onerror = onerror; 77 | xhr.send(null); 78 | }; 79 | } 80 | setWindowTitle = (title) => (document.title = title); 81 | } else { 82 | } 83 | var out = Module["print"] || console.log.bind(console); 84 | var err = Module["printErr"] || console.warn.bind(console); 85 | Object.assign(Module, moduleOverrides); 86 | moduleOverrides = null; 87 | if (Module["arguments"]) arguments_ = Module["arguments"]; 88 | if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; 89 | if (Module["quit"]) quit_ = Module["quit"]; 90 | var wasmBinary; 91 | if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; 92 | var noExitRuntime = Module["noExitRuntime"] || true; 93 | if (typeof WebAssembly != "object") { 94 | abort("no native wasm support detected"); 95 | } 96 | var wasmMemory; 97 | var ABORT = false; 98 | var EXITSTATUS; 99 | var UTF8Decoder = 100 | typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; 101 | function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) { 102 | var endIdx = idx + maxBytesToRead; 103 | var endPtr = idx; 104 | while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; 105 | if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { 106 | return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); 107 | } 108 | var str = ""; 109 | while (idx < endPtr) { 110 | var u0 = heapOrArray[idx++]; 111 | if (!(u0 & 128)) { 112 | str += String.fromCharCode(u0); 113 | continue; 114 | } 115 | var u1 = heapOrArray[idx++] & 63; 116 | if ((u0 & 224) == 192) { 117 | str += String.fromCharCode(((u0 & 31) << 6) | u1); 118 | continue; 119 | } 120 | var u2 = heapOrArray[idx++] & 63; 121 | if ((u0 & 240) == 224) { 122 | u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; 123 | } else { 124 | u0 = 125 | ((u0 & 7) << 18) | 126 | (u1 << 12) | 127 | (u2 << 6) | 128 | (heapOrArray[idx++] & 63); 129 | } 130 | if (u0 < 65536) { 131 | str += String.fromCharCode(u0); 132 | } else { 133 | var ch = u0 - 65536; 134 | str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); 135 | } 136 | } 137 | return str; 138 | } 139 | function UTF8ToString(ptr, maxBytesToRead) { 140 | return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; 141 | } 142 | var buffer, 143 | HEAP8, 144 | HEAPU8, 145 | HEAP16, 146 | HEAPU16, 147 | HEAP32, 148 | HEAPU32, 149 | HEAPF32, 150 | HEAPF64; 151 | function updateGlobalBufferAndViews(buf) { 152 | buffer = buf; 153 | Module["HEAP8"] = HEAP8 = new Int8Array(buf); 154 | Module["HEAP16"] = HEAP16 = new Int16Array(buf); 155 | Module["HEAP32"] = HEAP32 = new Int32Array(buf); 156 | Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); 157 | Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); 158 | Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); 159 | Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); 160 | Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); 161 | } 162 | var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; 163 | var wasmTable; 164 | var __ATPRERUN__ = []; 165 | var __ATINIT__ = []; 166 | var __ATPOSTRUN__ = []; 167 | var runtimeInitialized = false; 168 | function keepRuntimeAlive() { 169 | return noExitRuntime; 170 | } 171 | function preRun() { 172 | if (Module["preRun"]) { 173 | if (typeof Module["preRun"] == "function") 174 | Module["preRun"] = [Module["preRun"]]; 175 | while (Module["preRun"].length) { 176 | addOnPreRun(Module["preRun"].shift()); 177 | } 178 | } 179 | callRuntimeCallbacks(__ATPRERUN__); 180 | } 181 | function initRuntime() { 182 | runtimeInitialized = true; 183 | callRuntimeCallbacks(__ATINIT__); 184 | } 185 | function postRun() { 186 | if (Module["postRun"]) { 187 | if (typeof Module["postRun"] == "function") 188 | Module["postRun"] = [Module["postRun"]]; 189 | while (Module["postRun"].length) { 190 | addOnPostRun(Module["postRun"].shift()); 191 | } 192 | } 193 | callRuntimeCallbacks(__ATPOSTRUN__); 194 | } 195 | function addOnPreRun(cb) { 196 | __ATPRERUN__.unshift(cb); 197 | } 198 | function addOnInit(cb) { 199 | __ATINIT__.unshift(cb); 200 | } 201 | function addOnPostRun(cb) { 202 | __ATPOSTRUN__.unshift(cb); 203 | } 204 | var runDependencies = 0; 205 | var runDependencyWatcher = null; 206 | var dependenciesFulfilled = null; 207 | function addRunDependency(id) { 208 | runDependencies++; 209 | if (Module["monitorRunDependencies"]) { 210 | Module["monitorRunDependencies"](runDependencies); 211 | } 212 | } 213 | function removeRunDependency(id) { 214 | runDependencies--; 215 | if (Module["monitorRunDependencies"]) { 216 | Module["monitorRunDependencies"](runDependencies); 217 | } 218 | if (runDependencies == 0) { 219 | if (runDependencyWatcher !== null) { 220 | clearInterval(runDependencyWatcher); 221 | runDependencyWatcher = null; 222 | } 223 | if (dependenciesFulfilled) { 224 | var callback = dependenciesFulfilled; 225 | dependenciesFulfilled = null; 226 | callback(); 227 | } 228 | } 229 | } 230 | function abort(what) { 231 | if (Module["onAbort"]) { 232 | Module["onAbort"](what); 233 | } 234 | what = "Aborted(" + what + ")"; 235 | err(what); 236 | ABORT = true; 237 | EXITSTATUS = 1; 238 | what += ". Build with -sASSERTIONS for more info."; 239 | var e = new WebAssembly.RuntimeError(what); 240 | readyPromiseReject(e); 241 | throw e; 242 | } 243 | var dataURIPrefix = "data:application/octet-stream;base64,"; 244 | function isDataURI(filename) { 245 | return filename.startsWith(dataURIPrefix); 246 | } 247 | var wasmBinaryFile; 248 | wasmBinaryFile = "/js/binjnes.wasm"; 249 | if (!isDataURI(wasmBinaryFile)) { 250 | wasmBinaryFile = locateFile(wasmBinaryFile); 251 | } 252 | function getBinary(file) { 253 | try { 254 | if (file == wasmBinaryFile && wasmBinary) { 255 | return new Uint8Array(wasmBinary); 256 | } 257 | if (readBinary) { 258 | return readBinary(file); 259 | } 260 | throw "both async and sync fetching of the wasm failed"; 261 | } catch (err) { 262 | abort(err); 263 | } 264 | } 265 | function getBinaryPromise() { 266 | if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { 267 | if (typeof fetch == "function") { 268 | return fetch(wasmBinaryFile, { credentials: "same-origin" }) 269 | .then(function (response) { 270 | if (!response["ok"]) { 271 | throw ( 272 | "failed to load wasm binary file at '" + wasmBinaryFile + "'" 273 | ); 274 | } 275 | return response["arrayBuffer"](); 276 | }) 277 | .catch(function () { 278 | return getBinary(wasmBinaryFile); 279 | }); 280 | } 281 | } 282 | return Promise.resolve().then(function () { 283 | return getBinary(wasmBinaryFile); 284 | }); 285 | } 286 | function createWasm() { 287 | var info = { a: asmLibraryArg }; 288 | function receiveInstance(instance, module) { 289 | var exports = instance.exports; 290 | Module["asm"] = exports; 291 | wasmMemory = Module["asm"]["h"]; 292 | updateGlobalBufferAndViews(wasmMemory.buffer); 293 | wasmTable = Module["asm"]["o"]; 294 | addOnInit(Module["asm"]["i"]); 295 | removeRunDependency("wasm-instantiate"); 296 | } 297 | addRunDependency("wasm-instantiate"); 298 | function receiveInstantiationResult(result) { 299 | receiveInstance(result["instance"]); 300 | } 301 | function instantiateArrayBuffer(receiver) { 302 | return getBinaryPromise() 303 | .then(function (binary) { 304 | return WebAssembly.instantiate(binary, info); 305 | }) 306 | .then(function (instance) { 307 | return instance; 308 | }) 309 | .then(receiver, function (reason) { 310 | err("failed to asynchronously prepare wasm: " + reason); 311 | abort(reason); 312 | }); 313 | } 314 | function instantiateAsync() { 315 | if ( 316 | !wasmBinary && 317 | typeof WebAssembly.instantiateStreaming == "function" && 318 | !isDataURI(wasmBinaryFile) && 319 | typeof fetch == "function" 320 | ) { 321 | return fetch(wasmBinaryFile, { credentials: "same-origin" }).then( 322 | function (response) { 323 | var result = WebAssembly.instantiateStreaming(response, info); 324 | return result.then(receiveInstantiationResult, function (reason) { 325 | err("wasm streaming compile failed: " + reason); 326 | err("falling back to ArrayBuffer instantiation"); 327 | return instantiateArrayBuffer(receiveInstantiationResult); 328 | }); 329 | }, 330 | ); 331 | } else { 332 | return instantiateArrayBuffer(receiveInstantiationResult); 333 | } 334 | } 335 | if (Module["instantiateWasm"]) { 336 | try { 337 | var exports = Module["instantiateWasm"](info, receiveInstance); 338 | return exports; 339 | } catch (e) { 340 | err("Module.instantiateWasm callback failed with error: " + e); 341 | readyPromiseReject(e); 342 | } 343 | } 344 | instantiateAsync().catch(readyPromiseReject); 345 | return {}; 346 | } 347 | function ExitStatus(status) { 348 | this.name = "ExitStatus"; 349 | this.message = "Program terminated with exit(" + status + ")"; 350 | this.status = status; 351 | } 352 | function callRuntimeCallbacks(callbacks) { 353 | while (callbacks.length > 0) { 354 | callbacks.shift()(Module); 355 | } 356 | } 357 | function _abort() { 358 | abort(""); 359 | } 360 | function _emscripten_memcpy_big(dest, src, num) { 361 | HEAPU8.copyWithin(dest, src, src + num); 362 | } 363 | function abortOnCannotGrowMemory(requestedSize) { 364 | abort("OOM"); 365 | } 366 | function _emscripten_resize_heap(requestedSize) { 367 | var oldSize = HEAPU8.length; 368 | requestedSize = requestedSize >>> 0; 369 | abortOnCannotGrowMemory(requestedSize); 370 | } 371 | var SYSCALLS = { 372 | varargs: undefined, 373 | get: function () { 374 | SYSCALLS.varargs += 4; 375 | var ret = HEAP32[(SYSCALLS.varargs - 4) >> 2]; 376 | return ret; 377 | }, 378 | getStr: function (ptr) { 379 | var ret = UTF8ToString(ptr); 380 | return ret; 381 | }, 382 | }; 383 | function _proc_exit(code) { 384 | EXITSTATUS = code; 385 | if (!keepRuntimeAlive()) { 386 | if (Module["onExit"]) Module["onExit"](code); 387 | ABORT = true; 388 | } 389 | quit_(code, new ExitStatus(code)); 390 | } 391 | function exitJS(status, implicit) { 392 | EXITSTATUS = status; 393 | _proc_exit(status); 394 | } 395 | var _exit = exitJS; 396 | function _fd_close(fd) { 397 | return 52; 398 | } 399 | function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { 400 | return 70; 401 | } 402 | var printCharBuffers = [null, [], []]; 403 | function printChar(stream, curr) { 404 | var buffer = printCharBuffers[stream]; 405 | if (curr === 0 || curr === 10) { 406 | (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0)); 407 | buffer.length = 0; 408 | } else { 409 | buffer.push(curr); 410 | } 411 | } 412 | function _fd_write(fd, iov, iovcnt, pnum) { 413 | var num = 0; 414 | for (var i = 0; i < iovcnt; i++) { 415 | var ptr = HEAPU32[iov >> 2]; 416 | var len = HEAPU32[(iov + 4) >> 2]; 417 | iov += 8; 418 | for (var j = 0; j < len; j++) { 419 | printChar(fd, HEAPU8[ptr + j]); 420 | } 421 | num += len; 422 | } 423 | HEAPU32[pnum >> 2] = num; 424 | return 0; 425 | } 426 | var asmLibraryArg = { 427 | a: _abort, 428 | f: _emscripten_memcpy_big, 429 | d: _emscripten_resize_heap, 430 | g: _exit, 431 | e: _fd_close, 432 | c: _fd_seek, 433 | b: _fd_write, 434 | }; 435 | var asm = createWasm(); 436 | var ___wasm_call_ctors = (Module["___wasm_call_ctors"] = function () { 437 | return (___wasm_call_ctors = Module["___wasm_call_ctors"] = 438 | Module["asm"]["i"]).apply(null, arguments); 439 | }); 440 | var _malloc = (Module["_malloc"] = function () { 441 | return (_malloc = Module["_malloc"] = Module["asm"]["j"]).apply( 442 | null, 443 | arguments, 444 | ); 445 | }); 446 | var _free = (Module["_free"] = function () { 447 | return (_free = Module["_free"] = Module["asm"]["k"]).apply( 448 | null, 449 | arguments, 450 | ); 451 | }); 452 | var _emulator_delete = (Module["_emulator_delete"] = function () { 453 | return (_emulator_delete = Module["_emulator_delete"] = 454 | Module["asm"]["l"]).apply(null, arguments); 455 | }); 456 | var _emulator_set_reset = (Module["_emulator_set_reset"] = function () { 457 | return (_emulator_set_reset = Module["_emulator_set_reset"] = 458 | Module["asm"]["m"]).apply(null, arguments); 459 | }); 460 | var _file_data_delete = (Module["_file_data_delete"] = function () { 461 | return (_file_data_delete = Module["_file_data_delete"] = 462 | Module["asm"]["n"]).apply(null, arguments); 463 | }); 464 | var _joypad_delete = (Module["_joypad_delete"] = function () { 465 | return (_joypad_delete = Module["_joypad_delete"] = 466 | Module["asm"]["p"]).apply(null, arguments); 467 | }); 468 | var _joypad_begin_rewind_playback = (Module[ 469 | "_joypad_begin_rewind_playback" 470 | ] = function () { 471 | return (_joypad_begin_rewind_playback = Module[ 472 | "_joypad_begin_rewind_playback" 473 | ] = 474 | Module["asm"]["q"]).apply(null, arguments); 475 | }); 476 | var _joypad_end_rewind_playback = (Module["_joypad_end_rewind_playback"] = 477 | function () { 478 | return (_joypad_end_rewind_playback = Module[ 479 | "_joypad_end_rewind_playback" 480 | ] = 481 | Module["asm"]["r"]).apply(null, arguments); 482 | }); 483 | var _rewind_append = (Module["_rewind_append"] = function () { 484 | return (_rewind_append = Module["_rewind_append"] = 485 | Module["asm"]["s"]).apply(null, arguments); 486 | }); 487 | var _rewind_delete = (Module["_rewind_delete"] = function () { 488 | return (_rewind_delete = Module["_rewind_delete"] = 489 | Module["asm"]["t"]).apply(null, arguments); 490 | }); 491 | var _emulator_new_simple = (Module["_emulator_new_simple"] = function () { 492 | return (_emulator_new_simple = Module["_emulator_new_simple"] = 493 | Module["asm"]["u"]).apply(null, arguments); 494 | }); 495 | var _emulator_get_ticks_f64 = (Module["_emulator_get_ticks_f64"] = 496 | function () { 497 | return (_emulator_get_ticks_f64 = Module["_emulator_get_ticks_f64"] = 498 | Module["asm"]["v"]).apply(null, arguments); 499 | }); 500 | var _emulator_run_until_f64 = (Module["_emulator_run_until_f64"] = 501 | function () { 502 | return (_emulator_run_until_f64 = Module["_emulator_run_until_f64"] = 503 | Module["asm"]["w"]).apply(null, arguments); 504 | }); 505 | var _rewind_get_newest_ticks_f64 = (Module["_rewind_get_newest_ticks_f64"] = 506 | function () { 507 | return (_rewind_get_newest_ticks_f64 = Module[ 508 | "_rewind_get_newest_ticks_f64" 509 | ] = 510 | Module["asm"]["x"]).apply(null, arguments); 511 | }); 512 | var _rewind_get_oldest_ticks_f64 = (Module["_rewind_get_oldest_ticks_f64"] = 513 | function () { 514 | return (_rewind_get_oldest_ticks_f64 = Module[ 515 | "_rewind_get_oldest_ticks_f64" 516 | ] = 517 | Module["asm"]["y"]).apply(null, arguments); 518 | }); 519 | var _joypad_new_simple = (Module["_joypad_new_simple"] = function () { 520 | return (_joypad_new_simple = Module["_joypad_new_simple"] = 521 | Module["asm"]["z"]).apply(null, arguments); 522 | }); 523 | var _set_joyp_up = (Module["_set_joyp_up"] = function () { 524 | return (_set_joyp_up = Module["_set_joyp_up"] = Module["asm"]["A"]).apply( 525 | null, 526 | arguments, 527 | ); 528 | }); 529 | var _set_joyp_down = (Module["_set_joyp_down"] = function () { 530 | return (_set_joyp_down = Module["_set_joyp_down"] = 531 | Module["asm"]["B"]).apply(null, arguments); 532 | }); 533 | var _set_joyp_left = (Module["_set_joyp_left"] = function () { 534 | return (_set_joyp_left = Module["_set_joyp_left"] = 535 | Module["asm"]["C"]).apply(null, arguments); 536 | }); 537 | var _set_joyp_right = (Module["_set_joyp_right"] = function () { 538 | return (_set_joyp_right = Module["_set_joyp_right"] = 539 | Module["asm"]["D"]).apply(null, arguments); 540 | }); 541 | var _set_joyp_B = (Module["_set_joyp_B"] = function () { 542 | return (_set_joyp_B = Module["_set_joyp_B"] = Module["asm"]["E"]).apply( 543 | null, 544 | arguments, 545 | ); 546 | }); 547 | var _set_joyp_A = (Module["_set_joyp_A"] = function () { 548 | return (_set_joyp_A = Module["_set_joyp_A"] = Module["asm"]["F"]).apply( 549 | null, 550 | arguments, 551 | ); 552 | }); 553 | var _set_joyp_start = (Module["_set_joyp_start"] = function () { 554 | return (_set_joyp_start = Module["_set_joyp_start"] = 555 | Module["asm"]["G"]).apply(null, arguments); 556 | }); 557 | var _set_joyp_select = (Module["_set_joyp_select"] = function () { 558 | return (_set_joyp_select = Module["_set_joyp_select"] = 559 | Module["asm"]["H"]).apply(null, arguments); 560 | }); 561 | var _get_frame_buffer_ptr = (Module["_get_frame_buffer_ptr"] = function () { 562 | return (_get_frame_buffer_ptr = Module["_get_frame_buffer_ptr"] = 563 | Module["asm"]["I"]).apply(null, arguments); 564 | }); 565 | var _get_frame_buffer_size = (Module["_get_frame_buffer_size"] = 566 | function () { 567 | return (_get_frame_buffer_size = Module["_get_frame_buffer_size"] = 568 | Module["asm"]["J"]).apply(null, arguments); 569 | }); 570 | var _get_audio_buffer_ptr = (Module["_get_audio_buffer_ptr"] = function () { 571 | return (_get_audio_buffer_ptr = Module["_get_audio_buffer_ptr"] = 572 | Module["asm"]["K"]).apply(null, arguments); 573 | }); 574 | var _get_audio_buffer_capacity = (Module["_get_audio_buffer_capacity"] = 575 | function () { 576 | return (_get_audio_buffer_capacity = Module[ 577 | "_get_audio_buffer_capacity" 578 | ] = 579 | Module["asm"]["L"]).apply(null, arguments); 580 | }); 581 | var _get_file_data_ptr = (Module["_get_file_data_ptr"] = function () { 582 | return (_get_file_data_ptr = Module["_get_file_data_ptr"] = 583 | Module["asm"]["M"]).apply(null, arguments); 584 | }); 585 | var _get_file_data_size = (Module["_get_file_data_size"] = function () { 586 | return (_get_file_data_size = Module["_get_file_data_size"] = 587 | Module["asm"]["N"]).apply(null, arguments); 588 | }); 589 | var _rewind_new_simple = (Module["_rewind_new_simple"] = function () { 590 | return (_rewind_new_simple = Module["_rewind_new_simple"] = 591 | Module["asm"]["O"]).apply(null, arguments); 592 | }); 593 | var _rewind_begin = (Module["_rewind_begin"] = function () { 594 | return (_rewind_begin = Module["_rewind_begin"] = 595 | Module["asm"]["P"]).apply(null, arguments); 596 | }); 597 | var _rewind_to_ticks_wrapper = (Module["_rewind_to_ticks_wrapper"] = 598 | function () { 599 | return (_rewind_to_ticks_wrapper = Module["_rewind_to_ticks_wrapper"] = 600 | Module["asm"]["Q"]).apply(null, arguments); 601 | }); 602 | var _rewind_end = (Module["_rewind_end"] = function () { 603 | return (_rewind_end = Module["_rewind_end"] = Module["asm"]["R"]).apply( 604 | null, 605 | arguments, 606 | ); 607 | }); 608 | var calledRun; 609 | dependenciesFulfilled = function runCaller() { 610 | if (!calledRun) run(); 611 | if (!calledRun) dependenciesFulfilled = runCaller; 612 | }; 613 | function run(args) { 614 | args = args || arguments_; 615 | if (runDependencies > 0) { 616 | return; 617 | } 618 | preRun(); 619 | if (runDependencies > 0) { 620 | return; 621 | } 622 | function doRun() { 623 | if (calledRun) return; 624 | calledRun = true; 625 | Module["calledRun"] = true; 626 | if (ABORT) return; 627 | initRuntime(); 628 | readyPromiseResolve(Module); 629 | if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); 630 | postRun(); 631 | } 632 | if (Module["setStatus"]) { 633 | Module["setStatus"]("Running..."); 634 | setTimeout(function () { 635 | setTimeout(function () { 636 | Module["setStatus"](""); 637 | }, 1); 638 | doRun(); 639 | }, 1); 640 | } else { 641 | doRun(); 642 | } 643 | } 644 | if (Module["preInit"]) { 645 | if (typeof Module["preInit"] == "function") 646 | Module["preInit"] = [Module["preInit"]]; 647 | while (Module["preInit"].length > 0) { 648 | Module["preInit"].pop()(); 649 | } 650 | } 651 | run(); 652 | 653 | return Binjnes.ready; 654 | }; 655 | })(); 656 | if (typeof exports === "object" && typeof module === "object") 657 | module.exports = Binjnes; 658 | else if (typeof define === "function" && define["amd"]) 659 | define([], function () { 660 | return Binjnes; 661 | }); 662 | else if (typeof exports === "object") exports["Binjnes"] = Binjnes; 663 | 664 | export default Binjnes; 665 | -------------------------------------------------------------------------------- /components/footer.vue: -------------------------------------------------------------------------------- 1 | 31 | 36 | 50 | -------------------------------------------------------------------------------- /components/list.vue: -------------------------------------------------------------------------------- 1 | 4 | 43 | 79 | 237 | -------------------------------------------------------------------------------- /components/topbar.vue: -------------------------------------------------------------------------------- 1 | 66 | 67 | 72 | 88 | -------------------------------------------------------------------------------- /directives/primevue.ts: -------------------------------------------------------------------------------- 1 | import { App } from "vue"; 2 | 3 | import Tooltip from "primevue/tooltip"; 4 | import StyleClass from "primevue/styleclass"; 5 | 6 | export function registerDirectives(app: App): void { 7 | app.directive("tooltip", Tooltip); 8 | app.directive("styleclass", StyleClass); 9 | } 10 | -------------------------------------------------------------------------------- /modules/sitemap.ts: -------------------------------------------------------------------------------- 1 | import { mkdirSync, writeFileSync } from "fs"; 2 | import { Readable } from "stream"; 3 | import { dirname } from "path"; 4 | import { SitemapStream, streamToPromise } from "sitemap"; 5 | import { defineNuxtModule, createResolver } from "@nuxt/kit"; 6 | import axios from "axios"; 7 | 8 | export default defineNuxtModule({ 9 | meta: { 10 | name: "sitemap", 11 | version: "0.0.1", 12 | configKey: "sitemap", 13 | compatibility: { nuxt: "^3.0.0" }, 14 | }, 15 | defaults: { 16 | hostname: "http://localhost:3000", 17 | }, 18 | async setup(options, nuxt) { 19 | async function generateSitemap(routes) { 20 | const sitemapRoutes = routes.map((route) => route.path); 21 | 22 | console.log(sitemapRoutes); 23 | 24 | await axios 25 | /* this should use "useRuntimeConfig" but it's not available here and 26 | I couldn't figure out how to import it */ 27 | .get(process.env.BASE_API_URL + "/api/search?results=2000") 28 | .then(function (response) { 29 | let entries = response.data.entries; 30 | entries.forEach((element) => { 31 | sitemapRoutes.push("/game/" + element["slug"]); 32 | }); 33 | }); 34 | 35 | // https://github.com/ekalinin/sitemap.js#generate-a-one-time-sitemap-from-a-list-of-urls 36 | const stream = new SitemapStream({ hostname: options.hostname }); 37 | return streamToPromise(Readable.from(sitemapRoutes).pipe(stream)).then( 38 | (data) => data.toString(), 39 | ); 40 | } 41 | 42 | function createSitemapFile(sitemap, filepath) { 43 | const dirPath = dirname(filepath); 44 | mkdirSync(dirPath, { recursive: true }); 45 | writeFileSync(filepath, sitemap); 46 | } 47 | 48 | const resolver = createResolver(import.meta.url); 49 | const filePath = resolver.resolve( 50 | nuxt.options.srcDir, 51 | "node_modules/.cache/.sitemap/sitemap.xml", 52 | ); 53 | 54 | nuxt.options.nitro.publicAssets = nuxt.options.nitro.publicAssets || []; 55 | nuxt.options.nitro.publicAssets.push({ 56 | baseURL: "/", 57 | dir: dirname(filePath), 58 | }); 59 | 60 | nuxt.hook("pages:extend", async (pages) => { 61 | const sitemap = await generateSitemap(pages); 62 | createSitemapFile(sitemap, filePath); 63 | }); 64 | }, 65 | }); 66 | -------------------------------------------------------------------------------- /nuxt.config.ts: -------------------------------------------------------------------------------- 1 | const { __dirname } = createCommonJS(import.meta.url); 2 | import { resolve } from "path"; 3 | import { createCommonJS } from "mlly"; 4 | 5 | // https://v3.nuxtjs.org/api/configuration/nuxt.config 6 | export default defineNuxtConfig({ 7 | modules: ["~/modules/sitemap"], 8 | sitemap: { 9 | hostname: "https://hh.gbdev.io", 10 | }, 11 | runtimeConfig: { 12 | public: { 13 | BASE_API_URL: process.env.BASE_API_URL || "https://hh3.gbdev.io", 14 | }, 15 | }, 16 | css: [ 17 | "primeflex/primeflex.css", 18 | "primevue/resources/themes/saga-blue/theme.css", 19 | "primevue/resources/primevue.css", 20 | "primeicons/primeicons.css", 21 | ], 22 | build: { 23 | transpile: ["primevue"], 24 | }, 25 | nitro: { 26 | prerender: { 27 | ignore: ["/games", "/demos", "/music", "/tools"], 28 | }, 29 | }, 30 | 31 | hooks: { 32 | // By default, we use "pages" routing, matching the paths under /pages 33 | // Here we add some additional routes 34 | "pages:extend"(pages) { 35 | pages.push( 36 | // /demos, /games and /gbcompo21 should just point to the games view. We'll change the api call there, based on the matched path. 37 | { 38 | name: "gbcompo21", 39 | path: "/events/gbcompo21", 40 | file: resolve(__dirname, "pages/games.vue"), 41 | }, 42 | { 43 | name: "gbajam22", 44 | path: "/events/gbajam22", 45 | file: resolve(__dirname, "pages/games.vue"), 46 | }, 47 | { 48 | name: "gba", 49 | path: "/games/gba", 50 | file: resolve(__dirname, "pages/games.vue"), 51 | }, 52 | { 53 | name: "demos", 54 | path: "/demos", 55 | redirect: "/search?typetag=demo", 56 | }, 57 | { 58 | name: "games", 59 | path: "/games", 60 | redirect: "/search?typetag=game", 61 | }, 62 | { 63 | name: "tools", 64 | path: "/tools", 65 | redirect: "/search?typetag=tool", 66 | }, 67 | { 68 | name: "music", 69 | path: "/music", 70 | redirect: "/search?typetag=music", 71 | }, 72 | ); 73 | }, 74 | }, 75 | }); 76 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "build": "nuxt build", 5 | "dev": "nuxt dev", 6 | "generate": "nuxt generate", 7 | "preview": "nuxt preview" 8 | }, 9 | "dependencies": { 10 | "axios": "^0.27.2", 11 | "chart.js": "^4.3.0", 12 | "nuxt": "^3.6.2", 13 | "primeflex": "^3.3.0", 14 | "primeicons": "5.0.0", 15 | "primevue": "^3.30.0", 16 | "sass": "^1.51.0", 17 | "sitemap": "^7.1.1", 18 | "vue-matomo": "^4.2.0" 19 | }, 20 | "license": "GPL-3.0-only", 21 | "devDependencies": { 22 | "prettier": "3.2.5" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /pages/credits.vue: -------------------------------------------------------------------------------- 1 | 6 | 85 | -------------------------------------------------------------------------------- /pages/developers.vue: -------------------------------------------------------------------------------- 1 | 6 | 13 | -------------------------------------------------------------------------------- /pages/disclaimer.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 26 | -------------------------------------------------------------------------------- /pages/game/[slug].vue: -------------------------------------------------------------------------------- 1 | 4 | 110 | 111 | 382 | 433 | 580 | -------------------------------------------------------------------------------- /pages/games.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 46 | 47 | 50 | -------------------------------------------------------------------------------- /pages/index.vue: -------------------------------------------------------------------------------- 1 | 13 | 126 | 173 | 174 | 189 | -------------------------------------------------------------------------------- /pages/search.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 88 | 244 | -------------------------------------------------------------------------------- /pages/sitemap.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /pages/stats.vue: -------------------------------------------------------------------------------- 1 | 6 | 44 | 168 | 169 | 181 | -------------------------------------------------------------------------------- /plugins/Medusa.vue: -------------------------------------------------------------------------------- 1 | 5 | 42 | 125 | 134 | -------------------------------------------------------------------------------- /plugins/Nes.vue: -------------------------------------------------------------------------------- 1 | 17 | 653 | 654 | 675 | -------------------------------------------------------------------------------- /plugins/directives.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Register directives 3 | */ 4 | import { registerDirectives } from "~/directives/primevue"; 5 | 6 | export default defineNuxtPlugin((nuxtApp) => { 7 | registerDirectives(nuxtApp.vueApp); 8 | }); 9 | -------------------------------------------------------------------------------- /plugins/matomo.client.js: -------------------------------------------------------------------------------- 1 | // This plugin is auto-discovered by Nuxt 2 | 3 | import { defineNuxtPlugin } from "#app"; 4 | import VueMatomo from "vue-matomo"; 5 | 6 | export default defineNuxtPlugin((nuxtApp) => { 7 | nuxtApp.vueApp.use(VueMatomo, { 8 | host: "https://stats.gbdev.io", 9 | siteId: 1, 10 | // Enables automatically registering pageviews on the router 11 | router: nuxtApp.$router, 12 | enableLinkTracking: true, 13 | requireConsent: false, 14 | trackInitialView: true, 15 | disableCookies: true, 16 | requireCookieConsent: false, 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /plugins/primevue.js: -------------------------------------------------------------------------------- 1 | /* 2 | This plugin registers all the PrimeVue component and services. 3 | */ 4 | 5 | import { defineNuxtPlugin } from "#app"; 6 | import PrimeVue from "primevue/config"; 7 | import Button from "primevue/button"; 8 | import InputText from "primevue/inputtext"; 9 | import InputNumber from "primevue/inputnumber"; 10 | import Toast from "primevue/toast"; 11 | import ToastService from "primevue/toastservice"; 12 | import ColorPicker from "primevue/colorpicker"; 13 | import Menubar from "primevue/menubar"; 14 | import DataView from "primevue/dataview"; 15 | import DataTable from "primevue/datatable"; 16 | import Column from "primevue/column"; 17 | import Chip from "primevue/chip"; 18 | import Slider from "primevue/slider"; 19 | import SelectButton from "primevue/selectbutton"; 20 | import MultiSelect from "primevue/multiselect"; 21 | import Dropdown from "primevue/dropdown"; 22 | import ProgressSpinner from "primevue/progressspinner"; 23 | import Chart from "primevue/chart"; 24 | import Galleria from "primevue/galleria"; 25 | 26 | import "../assets/styles/layout.scss"; 27 | import "../assets/styles/themes/dark-bs.css"; 28 | 29 | export default defineNuxtPlugin((nuxtApp) => { 30 | nuxtApp.vueApp.use(PrimeVue, { ripple: true }); 31 | nuxtApp.vueApp.use(ToastService); 32 | nuxtApp.vueApp.component("Button", Button); 33 | nuxtApp.vueApp.component("InputText", InputText); 34 | nuxtApp.vueApp.component("Toast", Toast); 35 | nuxtApp.vueApp.component("ColorPicker", ColorPicker); 36 | nuxtApp.vueApp.component("Menubar", Menubar); 37 | nuxtApp.vueApp.component("DataView", DataView); 38 | nuxtApp.vueApp.component("Chip", Chip); 39 | nuxtApp.vueApp.component("Slider", Slider); 40 | nuxtApp.vueApp.component("SelectButton", SelectButton); 41 | nuxtApp.vueApp.component("MultiSelect", MultiSelect); 42 | nuxtApp.vueApp.component("Dropdown", Dropdown); 43 | nuxtApp.vueApp.component("InputNumber", InputNumber); 44 | nuxtApp.vueApp.component("DataTable", DataTable); 45 | nuxtApp.vueApp.component("Column", Column); 46 | nuxtApp.vueApp.component("ProgressSpinner", ProgressSpinner); 47 | nuxtApp.vueApp.component("Chart", Chart); 48 | nuxtApp.vueApp.component("Galleria", Galleria); 49 | }); 50 | -------------------------------------------------------------------------------- /plugins/register.client.ts: -------------------------------------------------------------------------------- 1 | /* 2 | This plugin is just used to register the Emulator component 3 | only in the *client* side, so SSR doesn't get crazy trying to 4 | load the WASM build. 5 | */ 6 | 7 | import Emulator from "./Emulator.vue"; 8 | import Medusa from "./Medusa.vue"; 9 | import Nes from "./Nes.vue"; 10 | 11 | export default defineNuxtPlugin((nuxtApp) => { 12 | nuxtApp.vueApp.component("Emulator", Emulator); 13 | nuxtApp.vueApp.component("Medusa", Medusa); 14 | nuxtApp.vueApp.component("Nes", Nes); 15 | }); 16 | -------------------------------------------------------------------------------- /public/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbdev/virens/762dadc808c35225e64d8c19501fef4e9d6a8a70/public/.nojekyll -------------------------------------------------------------------------------- /public/CNAME: -------------------------------------------------------------------------------- 1 | hh.gbdev.io 2 | -------------------------------------------------------------------------------- /public/fonts/EudoxusSans-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbdev/virens/762dadc808c35225e64d8c19501fef4e9d6a8a70/public/fonts/EudoxusSans-Light.woff2 -------------------------------------------------------------------------------- /public/fonts/EudoxusSans-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbdev/virens/762dadc808c35225e64d8c19501fef4e9d6a8a70/public/fonts/EudoxusSans-Medium.woff2 -------------------------------------------------------------------------------- /public/fonts/EudoxusSans-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbdev/virens/762dadc808c35225e64d8c19501fef4e9d6a8a70/public/fonts/EudoxusSans-Regular.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbdev/virens/762dadc808c35225e64d8c19501fef4e9d6a8a70/public/fonts/Inter-Light.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbdev/virens/762dadc808c35225e64d8c19501fef4e9d6a8a70/public/fonts/Inter-Medium.woff2 -------------------------------------------------------------------------------- /public/fonts/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbdev/virens/762dadc808c35225e64d8c19501fef4e9d6a8a70/public/fonts/Inter-Regular.woff2 -------------------------------------------------------------------------------- /public/imgs/DO_Powered_by_Badge_white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 14 | 17 | 18 | 21 | 22 | 25 | 28 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 56 | 59 | 60 | 65 | 66 | 69 | 71 | 72 | 76 | 81 | 86 | 89 | 94 | 97 | 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /public/js/binjgb.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbdev/virens/762dadc808c35225e64d8c19501fef4e9d6a8a70/public/js/binjgb.wasm -------------------------------------------------------------------------------- /public/js/binjnes.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbdev/virens/762dadc808c35225e64d8c19501fef4e9d6a8a70/public/js/binjnes.wasm -------------------------------------------------------------------------------- /public/js/mgba.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gbdev/virens/762dadc808c35225e64d8c19501fef4e9d6a8a70/public/js/mgba.wasm -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://v3.nuxtjs.org/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | --------------------------------------------------------------------------------