From 4f4b87386e36de224921654e4a6808b0f02c6c82 Mon Sep 17 00:00:00 2001 From: Ethan O'Brien <77750390+ethanaobrien@users.noreply.github.com> Date: Sun, 23 Oct 2022 12:18:00 -0500 Subject: [PATCH] Version 3.0.5 Co-authored-by: Allan Niles <74841470+allancoding@users.noreply.github.com> Co-authored-by: ericKuang --- .github/ISSUE_TEMPLATE/bug---beta.md | 24 - .github/ISSUE_TEMPLATE/bug.md | 24 - .github/ISSUE_TEMPLATE/feature_request.md | 10 - .github/workflows/main.yml | 42 + CHANGES.md | 232 ++ README.md | 27 +- data/emu-css.css | 114 +- data/emu-css.min.css | 2 +- data/emu-main.js | 3371 ++++++++++------- data/emulator.js | 3208 +++++++++++++++- data/emulator.min.js | 2 +- data/loader.js | 11 +- data/localization/Translate.html | 4 +- data/localization/af-FR.json | 4 +- data/localization/ar-AR.json | 4 +- data/localization/ben-BEN.json | 4 +- data/localization/de-GER.json | 4 +- data/localization/el-GR.json | 4 +- data/localization/en.json | 4 +- data/localization/es-ES.json | 52 +- data/localization/hi-HI.json | 4 +- data/localization/ja-JA.json | 4 +- data/localization/jv-JV.json | 4 +- data/localization/ko-KO.json | 4 +- data/localization/pt-BR.json | 50 +- data/localization/readme.md | 13 +- data/localization/ru-RU.json | 4 +- .../localization/{chi-CHI.json => zh-CN.json} | 45 +- data/minify/.gitignore | 1 - data/v.json | 409 +- data/version.json | 2 +- data/webrtc-adapter.js | 2 + docs/Contributors.md | 8 + docs/Logo-light.png | Bin 0 -> 24096 bytes docs/Systems/Arcade.md | 35 +- docs/Systems/Atari 5200.md | 28 +- docs/Systems/MAME 2003.md | 35 + docs/Systems/NES-Famicom.md | 36 +- docs/Systems/Nintendo 64.md | 35 +- docs/Systems/Nintendo DS.md | 50 +- docs/Systems/Nintendo Game Boy Advance.md | 51 +- docs/Systems/Nintendo Game Boy.md | 48 +- docs/Systems/PlayStation.md | 49 +- docs/Systems/SNES.md | 53 +- docs/Systems/Virtual Boy.md | 31 +- docs/Usage.md | 143 - 46 files changed, 5911 insertions(+), 2380 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug---beta.md delete mode 100644 .github/ISSUE_TEMPLATE/bug.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/main.yml create mode 100644 CHANGES.md rename data/localization/{chi-CHI.json => zh-CN.json} (87%) delete mode 100644 data/minify/.gitignore create mode 100644 data/webrtc-adapter.js create mode 100644 docs/Logo-light.png create mode 100644 docs/Systems/MAME 2003.md delete mode 100644 docs/Usage.md diff --git a/.github/ISSUE_TEMPLATE/bug---beta.md b/.github/ISSUE_TEMPLATE/bug---beta.md deleted file mode 100644 index 30a958e..0000000 --- a/.github/ISSUE_TEMPLATE/bug---beta.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -name: bug - beta -about: Use this when you find a problem with the beta emulator cores -title: "[beta]" -labels: '' -assignees: '' - ---- - - diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md deleted file mode 100644 index 3de0e09..0000000 --- a/.github/ISSUE_TEMPLATE/bug.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -name: bug -about: Use this when you find a bug and you are not using the beta cores -title: '' -labels: '' -assignees: '' - ---- - - diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index e46a4c0..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - - diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..0a35840 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,42 @@ +name: Minify Code + +on: [push, pull_request, workflow_dispatch] + +jobs: + paths-filter: + runs-on: ubuntu-latest + outputs: + output1: ${{ steps.filter.outputs.data }} + steps: + - uses: actions/checkout@v2 + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: | + data: + - 'data/**' + # run only if 'data' files were changed + - name: workflow tests + if: steps.filter.outputs.data == 'true' + run: echo "Data file" + + # run only if not 'data' files were changed + - name: not workflow tests + if: steps.filter.outputs.data != 'true' + run: echo "NOT Data file" + + next-job: + runs-on: ubuntu-latest + # Wait from the paths-filter to be completed before starting next-job + needs: paths-filter + if: needs.paths-filter.outputs.output1 == 'true' + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: '12' + - run: cd data/minify && npm install + - run: cd data/minify && npm run build + - uses: EndBug/add-and-commit@v9 + with: + default_author: github_actions diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..7efd058 --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,232 @@ +# Changes + +# 3.0.5 +- Fixed screen recording on devices that do not support getUserMedia api. +- Added C label buttons to nintendo 64 virtual gamepad. +- Fixed EJS_color bug. +- Savestates are pulled from the core itself, to always be correct. +- Several new cores. (a5200, beetle_vb, desmume2015, fbalpha2012_cps1, fbalpha2012_cps2, fceumm, gambatte, mame2003, mednafen_psx, mednafen_psx_hw, melonds, mgba, mupen64plus_next, nestopia, snes9x) +- D-pad for virtual gamepad. +- Updated translation files to include new menu options. +- Ability to add more than one zone object to virtual gamepads. +- Added ability to set custom menu options. +- Virtual gamepad left handed mode. +- Fixed Screen record svg. +- Updated svg icons. +- Cache "clear all" button. +- Cache button moved to menu bar. +- Added feature that will display the current downloaded size when the content length is not available. + +# 2.3.9 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/088942083e44510f07133f2074a2d63a8af477cd) +- Fixed incorrect variable referencing when update bios download data callback. +- Fixed rom storage size limits. +- Fixed download percent not showing with some files. + +# 2.3.8 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/5f176b963e4b2055983b82396378d1e3837a69c4) +- Remove broken shader. +- Add download percent message. +- Fixed UI "saving state" message not going away. + +# 2.3.7 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/8b9607becfe0aaad42b8b8486c7d379821b72125) +- Add more shaders. +- Add bold fontsize option to custom virtual gamepad settings. +- No longer set "normalOptions" from localization file. + +# 2.3.6 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/b2919bc2c3d2d4c9fe3ab4f4486790a376b7acfe) +- Remove default control mappings for gamepads. +- Upgraded invalid character regex to catch more characters. + +# 2.3.5 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/a5a9916aba041e75ee73815376ed4fd2e22701bd) +- Use regex to detect and replace invalid characters in filename/gamename settings. + +# 2.3.4 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/45d982b6362cfd29cb2eda9721066e03893ba0d8) +- Add new arcade core. +- Fix patch file game id set bug. + +# 2.3.4 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/45d982b6362cfd29cb2eda9721066e03893ba0d8) +- Add new arcade core. + +# 2.3.3 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/11bddd5a4277aa04f80b941f05cc024b3de58bfc) +- Make version in loader.js reasonable. +- Created function to return the game id to prevent unnecessary data stored. + +# 2.3.2 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/e9e017435f2c41c6c2b127024cc88ac51bdf04d9) +- Fix reference error. +- Fix bug in custom virtual gamepad processor where if value is set to 0 it will see that as the value being missing. + +# 2.3.1 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/0fd6d58e2011fa1a39bd2e11ba3d2f17773f0961) +- Use let instead of var. + +# 2.3.0 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/2fd0f545285151524262cc799efef6d996d7c6c1) +- Added ability to customize virtual gamepad UI. +- Fixed bug where shader is not set on start. + +# 2.2.9 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/018c39d4065b866487f8f18ca88c9488eab69a6d) +- Added feature to save save files to indexeddb every 5 minutes. + +# 2.2.8 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/9860d662d02b56417044cca11937448041d9cf43) +- Re-write gamepad handler. + +# 2.2.7 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/c03d18990b6536c1503bba2c640dbc13db982bb3) +- Removed un-needed FS proxy functions. + +# 2.2.6 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/fd71b5dfc2bd44d8e1f0e7c6c7b3ee1a1127a696) +- Added fps counter. +- Fixed gba core aspect. + +# 2.2.5 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/4b444ec23918149a6052807d778af82f79883c01) +- Added ability to set custom control mappings. +- Added ability to set custom default volume value. +- Fixed gamepad axis as button, gamepad varaible compared to incorrect value. +- Added ability to hide/show menu/context menu buttons. +- Added ability to set game url to other data types. + +# 2.2.3 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/41eed05677b4927bd114613040bfe4572c92c4b4) +- Fixed rar unarchiving function reference. +- Updated rar header detection. +- Removed netplay. + +# 2.2.1 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/19980deb12c3f0790176db6fc7b8b2de4069bf4e) +- Added core menu options for new cores. +- Added new mame2003 core. +- Added support for debug emscripten setting for new cores. + +# 2.0.1 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/a72222c39a793c4ff470ebb2b71c04829fee4b5e) +- Control mapping for beta cores. +- Updated beta cores. +- Beta cores now the default option! +- Added a5200 core. +- Fixed save state for new n64 core. + +# 1.2.2 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/8ab7bb3f49da373ed5d291c5f72039bbabf2fbc8) +- Moved virtual gamepad menu button to the top left as 3 lines. +- Added screen orientation lock. +- Added beta n64 core! + +# 1.2.1 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/638658e6202fd39cb5c94bedcfa00ccdf8b25840) +- Updated beta core files. + +# 1.1.6 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/fa153ba76791184d978f9fb8b69991b05b161bc8) +- Replaced axios module with custom script. +- Added pause/play for beta cores. +- Sepperated css into its own file. +- Renamed emu-min.js to emulator.min.js. + +# 1.1.5 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/2767c635b8a6e05c57e054d2f9d01ae0c4ff6d47) +- Cleaned up fetch error function. +- Cleaned up virtual gamepad event listeners. +- Add code of conduct. + +# 1.1.2 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/64731dd8219931155b4e698aa98dbf65c2120038) +- Fixed error where mame files were misnamed. +- Fixed bug where variable referenced was not defined in loader.js. +- Added .gitignore +- Added nodejs script to minify js files. +- Added audio to screen recording. +- Removed lots of dead code from emulator.js file. +- Update axios module. +- Added CORS error message +- Update nodejs buffer module. + +# 1.1.0 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/715ded4ae23c2135bc9a8b9b7599f12c905393b3) +- Added minify feature. +- Added emulatorjs logo. +- Added beta nds and gb core. +- Fixed bug where when wasm was supported on the beta cores and not the old cores, a network error would appear if not using beta. +- Added volume setting and cheats to beta cores. + +# 1.0 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/fde44b095bb89e299daaaa4c8d7deebc79019865) +- Official release of the beta cores. +- Ability to use beta cores in production. +- Ability to use the old emulatorjs netplay server. +- Set screen recording out file name to gamename if present. +- Set screenshot out file name to gamename if present. +- Fixed virtual gamepad bug where a function was referenced to as an array. + +# 0.4.26 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/0709829a11266b6ab4bbbf3e61d6dd6d3c372133) +- Sepperated emulator.js file into 2 files. +- Added support for a custom netplay server. +- Fixed netplay room password input bug. +- Fixed bug on iOS where virtual gamepad zone was un-responsive. +- Added save state location feature. +- Added mame core setting. +- Added beta cores! +- Added localization. +- Re-wrote virtual gamepad code. +- Added EJS_terminate function. +- Exposed simulate_input function to window. +- Update webrtc adapter. + +# 0.4.25 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/ef3200ef87bffe57241e05ae9646cc201142ec46) +- Moved load state on start from loader.js file to emulator.js file. +- Moved data path function from loader.js file to emulator.js file. +- Added ability to set custom path to data through `EJS_pathtodata` variable. +- Added support for custom paths. +- Expose the module and loader to window. +- Added `EJS_startOnLoaded` to start the emulator on load. +- Added quick save state slots. +- Added save state message. +- Only show save state slot in settings when save states are supported. +- Added ds pointer lock. +- Added menu button to virtual gamepad. Menu will only open when clicked on mobile. +- Created licenese +- Created official emulatorjs website. + +# 0.4.24 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/73ff641616bcd10f088a004002183760832a1afc) +- Deobsfocuted emulator.js and loader.js files to the most of my extent. +- Added quick save/load hotkeys. +- Added ability to use gamepad axis as button. +- Fixed typo in controls title. +- Only show needed inputs per system in control settings. +- Re-write the loader.js file. +- Exposed some variables to window. +- Cleaned up context menu code. +- Cleaned up some syntax in emulator.js file. +- Declared `EJS_AdUrl` through loader.js file. +- Fixed bug where mapping an axis as a button didn't work. +- Added missing legacy n64 core. +- Updated n64 core. + +# 0.4.23-07 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/83e148c82cbc8b4e835a808dcf84456975f82a7c) +- Removed not needed code. +- Added reset button to control settings. +- Added clear button to control settings. +- Added `EJS_AdUrl` option, the ability to add an ad to the emulator. +- Cleaned up some file fetching. +- Fixed RAR unarchiving. + +# 0.4.23-05 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/018c787ccf6daca58c863d38fff61910f33f98ec) +- No longer cache games with the protocols of `file:`, and `chrome-extension:`. +- Changed default keymappings. +- Added screen recording button. + +# 0.4.23-04 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/6464bbedc1cd58c023cd66656540fc174aedde8b) +- Added mame2003, snes2002, snes2005, snes2010, and vbanext cores. +- Added asmjs for all supported cores. + +# 0.4.23-03 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/c883f267e1e56ed6b6472b891f78704c6e4b4c17) +- Start loader.js deobsfocuting. +- Deobsfocute extractzip.js. +- Added `EJS_gameName`, the ability to change the file name of save states. + +# 0.4.23-02 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/5d97620b25a81e49c6ba313e586fb37a5ce66002) +- Start emulator.js deobsfocuting. + +# 0.4.23-01 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/42a7e129cfded266b72539e8d1b5978d5e4119d8) +- Added support for loading "blob:" urls. +- Added support for loading state on game start. + +# 0.4.23 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/5f5cf5cbba29cfd772d525a4c73a4bc5ea26654c) +- Added update available message. +- Fixed a bug where the 'x' from the ad iframe was still visible on game start. +- Added a2600 and mame cores. +- Remove visible 'x' +- Add rar extraction support. + +# 0.4.19 [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/4fd22871663e5896bb5d0ce29a50ad508462387a) +- Added support for 32x, 3do, a7800, arcade, bluemsx, jaguar, lynx, ngp, pce, saturn, sega, segacd, and ws cores. + +# Initial release [View Tree](https://github.com/ethanaobrien/emulatorjs/tree/be2db16cba8bd85bf901cd89ca6de51414cea792) +- Support for unzipping zip files. +- Support for unzipping 7zip files. +- Support for vb, snes, psx, nes, nds, n64, gba, and gb systems. Only support for WASM. diff --git a/README.md b/README.md index c159300..68bbbe4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@
- - + + +

@@ -17,8 +18,7 @@ Self-hosted **Javascript** emulation for various system. [![Button Usage]][Usage]
[![Button Configurator]][Configurator]
[![Button Demo]][Demo]  -[![Button Legacy]][Legacy]  -[![Button Beta]][Beta] +[![Button Legacy]][Legacy] [![Button Contributors]][Contributors] @@ -93,9 +93,9 @@ EJS_oldCores = true; ### Atari -**[2600][Atari 2600]**   | -**[5200][Atari 5200]**   | -**[7800][Atari 7800]**   | +**[2600][Atari 2600]**   |  +**[5200][Atari 5200]**   |  +**[7800][Atari 7800]**   |  **[Lynx][Atari Lynx]**   |  **[Jaguar][Atari Jaguar]** @@ -112,7 +112,8 @@ EJS_oldCores = true; **[PlayStation]**   |  **[Arcade]**   |  **[MSX]**   |  -**[3DO]** +**[3DO]**   |  +**[MAME 2003]**
@@ -132,13 +133,12 @@ EJS_oldCores = true; -[Configurator]: https://emulatorjs.ga/editor.html +[Configurator]: https://emulatorjs.org/editor.html [Contributors]: docs/Contributors.md -[Website]: https://emulatorjs.ga/ +[Website]: https://emulatorjs.org/ [Legacy]: https://coldcast.org/games/1/Super-Mario-Bros -[Usage]: docs/Usage.md -[Demo]: https://emulatorjs.ga/demo/ -[Beta]: https://emulatorjs.ga/beta/ +[Usage]: https://emulatorjs.org/docs/ +[Demo]: https://emulatorjs.github.io/EmulatorJS/ @@ -172,6 +172,7 @@ EJS_oldCores = true; [Arcade]: docs/Systems/Arcade.md [MSX]: docs/Systems/MSX.md [3DO]: docs/Systems/3DO.md +[MAME 2003]: docs/Systems/MAME%202003.md diff --git a/data/emu-css.css b/data/emu-css.css index 075d4ba..c26d09c 100644 --- a/data/emu-css.css +++ b/data/emu-css.css @@ -935,7 +935,7 @@ a.ejs--73f9b4e94a7a1fe74e11107d5ab2ef:hover{ margin:0 10px; color:#fff !important } -.ejs--5e71fd80268afbb1d588e40b993508 .ejs--580e3c22e63f8a1eb29694fd0b141b a.ejs--ad20569e1449d7b8e99e6465960456{ +.ejs--5e71fd80268afbb1d588e40b993508 .ejs--580e3c22e63f8a1eb29694fd0b141b a.ejs--ad20569e1449d7b8e99e6465960456 a.ejs--ad20569e1449d54yiohfg8u8559656{ background-color:#929292 } .ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a{ @@ -971,6 +971,9 @@ a.ejs--73f9b4e94a7a1fe74e11107d5ab2ef:hover{ .ejs--ad20569e1449d7b8e99e6465960456{ float:none } +.ejs--ad20569e1449d54yiohfg8u8559656{ + float:none +} .ejs--ad20569e1449d7b8e99e6465963825{ float:none } @@ -1564,6 +1567,7 @@ a.ejs--73f9b4e94a7a1fe74e11107d5ab2ef:hover{ width:100%; height:auto !important } + .ejs--33643265135cf89e6c0a0d9866d6f1{ transition:none !important } @@ -1579,3 +1583,111 @@ a.ejs--73f9b4e94a7a1fe74e11107d5ab2ef:hover{ .ejs--7a5f920ceffb2913f6dbda780573cf [hidden]{ display:none !important } +.ejs--914358605501b11476e86626b2ff16{ + width:120px; + height:120px; + user-select:none +} +@media (min-width: 480px){ + .ejs--914358605501b11476e86626b2ff16{ + width:130px; + height:130px + } +} + +.ejs--be66239219d594001da38f91c9ad02{ + opacity:0.7 +} +.ejs--be66239219d594001da38f91c9ad02,.ejs--9dbb9be3403878e912527181e2d41b{ + touch-action:none; + position:absolute; + top:0; + left:0; + width:100%; + height:100% +} +.ejs--f9c7797bdf05569bdc13b4f2074270{ + width:36px; + height:100%; + transform:translate(-50%, 0%); + position:absolute; + left:50%; + border-radius:5px; + overflow:hidden +} +.ejs--f9c7797bdf05569bdc13b4f2074270:before{ + content:""; + position:absolute; + top:0; + left:50%; + z-index:1; + transform:translate(-50%, 0%); + width:0; + height:0; + border:8px solid; + border-color:transparent transparent #333 transparent +} +.ejs--f9c7797bdf05569bdc13b4f2074270:after{ + content:""; + position:absolute; + bottom:0; + left:50%; + z-index:1; + transform:translate(-50%, 0); + width:0; + height:0; + border:8px solid; + border-color:#333 transparent transparent transparent +} +.ejs--f0b89ca5b5621659af184c8e012ccb .ejs--f9c7797bdf05569bdc13b4f2074270:before{ + border-bottom-color:#fff +} +.ejs--8de361d6b01eaa181f8db4ac3eb7af .ejs--f9c7797bdf05569bdc13b4f2074270:after{ + border-top-color:#fff +} +.ejs--2645f3bad105488a313c5e30dab74f{ + width:100%; + height:36px; + transform:translate(0%, -50%); + position:absolute; + left:0; + top:50%; + border-radius:5px; + overflow:hidden +} +.ejs--2645f3bad105488a313c5e30dab74f:before{ + content:""; + position:absolute; + left:0; + top:50%; + z-index:1; + transform:translate(0%, -50%); + width:0; + height:0; + border:8px solid; + border-color:transparent #333 transparent transparent +} +.ejs--2645f3bad105488a313c5e30dab74f:after{ + content:""; + position:absolute; + right:0; + top:50%; + z-index:1; + transform:translate(0%, -50%); + width:0; + height:0; + border:8px solid; + border-color:transparent transparent transparent #333 +} +.ejs--bd9311b0a4f654af6ab5ba28bcf358 .ejs--2645f3bad105488a313c5e30dab74f:before{ + border-right-color:#fff +} +.ejs--704d45ea060cc6809451a0d9d47ad7 .ejs--2645f3bad105488a313c5e30dab74f:after{ + border-left-color:#fff +} +.ejs--a57cf324c8ff108947112e35e589b5,.ejs--4873d94c18140ab195da609b40b71a{ + position:absolute; + width:100%; + height:100%; + background:#787878 +} diff --git a/data/emu-css.min.css b/data/emu-css.min.css index 419a82d..a022240 100644 --- a/data/emu-css.min.css +++ b/data/emu-css.min.css @@ -1 +1 @@ -@keyframes ejs--c2532bfe04554193cc42b3be753700{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes ejs--7cadf43f3d9eb17c7e3c36de84973b{from{opacity:0}to{opacity:1}}@keyframes ejs--9bd947b3e6427453595f083d740a7c{to{box-shadow:1px 3px 15px 8px #222,0 7px 10px 0 #111,inset 0 0 1px 0 rgba(250,250,250,0.2),inset 8px 5px 35px 0 rgba(0,0,0,0.5)}}:root{--ejs-primary-color:26,175,255}.ejs--de6433374cb30211f10e148b320b2f{height:100%}.ejs--7a5f920ceffb2913f6dbda780573cf{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:100%;width:100%;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-size:14px;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ejs--666d4296310579687cf3cf3d2cf951{display:inline-block;width:30px;height:30px;color:#fff;position:absolute;top:5px;right:5px;opacity:.5;z-index:999}.ejs--666d4296310579687cf3cf3d2cf951 svg{fill:currentColor}​ .ejs--7a5f920ceffb2913f6dbda780573cf a{color:#ddd;text-decoration:none}.ejs--7a5f920ceffb2913f6dbda780573cf button{font:inherit;line-height:inherit;width:auto}.ejs--7a5f920ceffb2913f6dbda780573cf ul{list-style:none;margin:0;padding:0}.ejs--7a5f920ceffb2913f6dbda780573cf:focus{outline:0}.ejs--7a5f920ceffb2913f6dbda780573cf *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ejs--f3a002bba9836fe4ebfed357a45521{box-sizing:border-box}.ejs--f3a002bba9836fe4ebfed357a45521 *,.ejs--f3a002bba9836fe4ebfed357a45521 *::after,.ejs--f3a002bba9836fe4ebfed357a45521 *::before{box-sizing:inherit}.ejs--f3a002bba9836fe4ebfed357a45521 a,.ejs--f3a002bba9836fe4ebfed357a45521 button,.ejs--f3a002bba9836fe4ebfed357a45521 input,.ejs--f3a002bba9836fe4ebfed357a45521 label{touch-action:manipulation}.ejs--008adea3c1ef33a8fc94892a1e97e6 li{display:inline-block;background:#fff;border:1px solid #ccc;font-size:12px}.ejs--008adea3c1ef33a8fc94892a1e97e6 li a{color:#000}.ejs--85a95eb6bf74a40ab61b91a91e5bff{position:absolute;width:100%;height:100%;top:0;z-index:9999;background:rgba(0,0,0,0.3) !important;color:#fff;text-align:center}.ejs--d169a219343bc32dd4aecc3f6b7f25{position:absolute;width:300px;top:50%;margin-left:-150px;margin-top:-50px;left:50%;background:rgba(0,0,0,0.8) !important;padding:15px 0}.ejs--782e3572812f983b3a150eec177391{text-align:center;font-size:13px}.ejs--c426dd1d179aa351e6cec47e1d9438,.ejs--31e7e81db48819ee35ec6f50378a2e,.ejs--20d4eb2646d396f558a645dc0574f1,.ejs--4de05306c8b099bdeb4585571ac095{font-size:12px}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8{background:rgba(16,16,16,0.9);border-radius:3px;font-size:13px;min-width:180px;padding:8px}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8 li{padding:4px 11px;text-align:center}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8 li a{color:#999;display:block;font-size:13px}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8 li:hover{background:rgba(var(--ejs-primary-color),1);border-radius:4px;box-shadow:0 0 0 5px rgba(var(--ejs-primary-color),0.5);outline:0}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8 li:hover a{color:#fff}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8 li:last-child{border:0}.ejs--cbcfe0a1421cadac9a04c81d6431d6{display:block !important;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.ejs--cbcfe0a1421cadac9a04c81d6431d6 .ejs--f3a1903d935f6cf720d4a0498db62a:after{content:"";position:absolute;border-left:20px solid transparent;border-right:20px solid #a7a7a77d;border-top:20px solid #a7a7a77d;border-bottom:20px solid transparent;right:0}.ejs--cbcfe0a1421cadac9a04c81d6431d6 .ejs--f3a1903d935f6cf720d4a0498db62a a{right:4px;top:4px;position:absolute;border:0;padding:0;width:15px;height:15px;z-index:99}.ejs--cbcfe0a1421cadac9a04c81d6431d6 .ejs--f3a1903d935f6cf720d4a0498db62a a:before{content:"";border-bottom:1px solid #fff;transform:rotate(45deg) translateY(-45%);width:15px;height:15px;display:block;position:absolute;top:0;right:0}.ejs--cbcfe0a1421cadac9a04c81d6431d6 .ejs--f3a1903d935f6cf720d4a0498db62a a:after{content:"";border-bottom:1px solid #fff;width:15px;height:15px;display:block;position:absolute;right:0;background:transparent;top:0;transform:rotate(-45deg) translateY(-50%) translateX(0)}a.ejs--73f9b4e94a7a1fe74e11107d5ab2ef{display:flex;justify-content:center;text-shadow:0 1px 1px rgba(0,0,0,0.5);font-size:20px;line-height:45px;text-transform:uppercase;font-weight:bolder;position:relative;text-decoration:none;width:200px;height:45px;border:0;color:#fff !important;border-radius:35px;text-align:center;background-color:rgba(var(--ejs-primary-color),1)}a.ejs--73f9b4e94a7a1fe74e11107d5ab2ef:active{box-shadow:0 0 0 0 #222,0 3px 7px 0 #111,inset 0 1px 1px 0 rgba(250,250,250,0.2),inset 0 -10px 35px 5px rgba(0,0,0,0.5);top:1px}a.ejs--73f9b4e94a7a1fe74e11107d5ab2ef:hover{animation:ejs--9bd947b3e6427453595f083d740a7c 1.2s linear infinite alternate}.ejs--8732295ca5c4902a060d34706a8146{background:transparent;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.ejs--8732295ca5c4902a060d34706a8146 svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.ejs--8732295ca5c4902a060d34706a8146:focus{outline:0}.ejs--8732295ca5c4902a060d34706a8146.ejs--a83b6c705e103e81a7762d0ed5e64b{box-shadow:0 0 0 5px rgba(var(--ejs-primary-color),0.5);outline:0}.ejs--8732295ca5c4902a060d34706a8146:not(.ejs--b1238136ec472a92297159882cf4b8) .ejs--ec731619062226d943da67f5d83009,.ejs--8732295ca5c4902a060d34706a8146.ejs--b1238136ec472a92297159882cf4b8 .ejs--dc7068585e3d84fe0e676864c1439e,.ejs--8732295ca5c4902a060d34706a8146:not(.ejs--b1238136ec472a92297159882cf4b8) .ejs--0c6561f9155750b0aeeed6da5da7bf,.ejs--8732295ca5c4902a060d34706a8146.ejs--b1238136ec472a92297159882cf4b8 .ejs--13d64e30c1333cc99391af48ddabaa{display:none}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146 svg{filter:drop-shadow(0 1px 1px rgba(0,0,0,0.15))}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146.ejs--a83b6c705e103e81a7762d0ed5e64b,.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146:hover,.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146[aria-expanded='true']{background:rgba(var(--ejs-primary-color),1);color:#fff}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146[disabled],.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146[disabled]:hover{background:transparent;color:#4b4b4b}.ejs--f3a002bba9836fe4ebfed357a45521 ::-webkit-media-controls{display:none}.ejs--1acedc5ed6816abe96dd27d910fd74{align-items:center;display:flex;justify-content:flex-start;text-align:center}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--f1aa376719b564cae0e653157cde14,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--90d2780f99bcc76fdb6b0378a7238e,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--c7bfb2d1b75a40fdaaf90624bea9e7,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--36ceeeec0df37a9cf4bbe05fa204ec{margin-left:5px}.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--c7bfb2d1b75a40fdaaf90624bea9e7+.ejs--8732295ca5c4902a060d34706a8146,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146+.ejs--c7bfb2d1b75a40fdaaf90624bea9e7,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146+.ejs--8732295ca5c4902a060d34706a8146,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--f1aa376719b564cae0e653157cde14+.ejs--8732295ca5c4902a060d34706a8146{margin-left:2px}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+[data-btn='pause']{margin-left:0}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+[data-btn='netplay']{margin-right:auto}.ejs--1acedc5ed6816abe96dd27d910fd74:empty{display:none}@media(min-width:480px){.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--c7bfb2d1b75a40fdaaf90624bea9e7,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--f1aa376719b564cae0e653157cde14,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--90d2780f99bcc76fdb6b0378a7238e,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--36ceeeec0df37a9cf4bbe05fa204ec{margin-left:10px}}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--1acedc5ed6816abe96dd27d910fd74{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media(min-width:480px){.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--1acedc5ed6816abe96dd27d910fd74{padding:15px 10px 10px}}.ejs--d5f430a99a1619b3434bf58e34a99c.ejs--1b8cb7f2294b1eb5de5238daea3513 .ejs--1acedc5ed6816abe96dd27d910fd74{opacity:0;pointer-events:none;transform:translateY(100%)}.ejs--7a5f920ceffb2913f6dbda780573cf [data-btn='fullscreen']{display:none}.ejs--19409fe2057ab935a7e46abb5b4f49 [data-btn='fullscreen']{display:inline-block}.ejs--c7bfb2d1b75a40fdaaf90624bea9e7{display:flex;position:relative}.ejs--c7bfb2d1b75a40fdaaf90624bea9e7 .ejs--8732295ca5c4902a060d34706a8146 svg{transition:transform .3s ease}.ejs--c7bfb2d1b75a40fdaaf90624bea9e7 .ejs--8732295ca5c4902a060d34706a8146[aria-expanded='true'] svg{transform:rotate(90deg)}.ejs--c7bfb2d1b75a40fdaaf90624bea9e7 .ejs--8732295ca5c4902a060d34706a8146[aria-expanded='true'] .ejs--74c6d4176d27e37a19d2e9e61de8f4{display:none}.ejs--013213afedeeb6878089b1ca1b4e47{animation:ejs--c2532bfe04554193cc42b3be753700 .2s ease;background:rgba(16,16,16,0.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,0.15);color:#4f5b5f;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.ejs--013213afedeeb6878089b1ca1b4e47>div{overflow:hidden;transition:height .35s cubic-bezier(0.4,0,0.2,1),width .35s cubic-bezier(0.4,0,0.2,1)}.ejs--013213afedeeb6878089b1ca1b4e47::after{border:4px solid transparent;border-top-color:rgba(16,16,16,0.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.ejs--013213afedeeb6878089b1ca1b4e47 [role='menu']{padding:7px}.ejs--013213afedeeb6878089b1ca1b4e47 [role='menuitem'],.ejs--013213afedeeb6878089b1ca1b4e47 [role='menuitemradio']{margin-top:2px}.ejs--013213afedeeb6878089b1ca1b4e47 [role='menuitem']:first-child,.ejs--013213afedeeb6878089b1ca1b4e47 [role='menuitemradio']:first-child{margin-top:0}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146{align-items:center;color:#999;display:flex;font-size:13px;padding:4px 11px;user-select:none;width:100%}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146>span{align-items:inherit;display:flex;width:100%}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--0b4cdb4057d1a4623e60836ccc6275{padding-right:28px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--0b4cdb4057d1a4623e60836ccc6275::after{border-left-color:rgba(79,91,95,0.8);right:5px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--0b4cdb4057d1a4623e60836ccc6275.ejs--a83b6c705e103e81a7762d0ed5e64b::after,.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--0b4cdb4057d1a4623e60836ccc6275:hover::after{border-left-color:currentColor}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--a7ad9de0cb0ca672b6703c50de7db9{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--a7ad9de0cb0ca672b6703c50de7db9::after{border-right-color:rgba(79,91,95,0.8);left:7px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--a7ad9de0cb0ca672b6703c50de7db9::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--a7ad9de0cb0ca672b6703c50de7db9.ejs--a83b6c705e103e81a7762d0ed5e64b::after,.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--a7ad9de0cb0ca672b6703c50de7db9:hover::after{border-right-color:currentColor}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']{padding-left:7px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']::before,.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']::after{border-radius:100%}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']::before{background:rgba(204,204,204,0.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio'][aria-checked='true']::before{background:rgba(var(--ejs-primary-color),1)}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio'][aria-checked='true']::after{opacity:1;transform:translateY(-50%) scale(1)}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio'].ejs--a83b6c705e103e81a7762d0ed5e64b::before,.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']:hover::before{background:rgba(0,0,0,0.1)}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--f91e90fe7cabc875aff9a431bf5389{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']{-webkit-appearance:none;background:transparent;border:0;border-radius:28px;color:rgba(var(--ejs-primary-color),1);display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-webkit-slider-runnable-track{background:transparent;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2);height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-moz-range-track{background:transparent;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;user-select:none}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2);height:14px;position:relative;transition:all .2s ease;width:14px}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-ms-track{background:transparent;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;user-select:none;color:transparent}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-ms-fill-upper{background:transparent;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;user-select:none}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-ms-fill-lower{background:transparent;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;user-select:none;background:currentColor}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2);height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-ms-tooltip{display:none}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']:focus{outline:0}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-moz-focus-outer{border:0}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range'].ejs--a83b6c705e103e81a7762d0ed5e64b::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(var(--ejs-primary-color),0.5);outline:0}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range'].ejs--a83b6c705e103e81a7762d0ed5e64b::-moz-range-track{box-shadow:0 0 0 5px rgba(var(--ejs-primary-color),0.5);outline:0}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range'].ejs--a83b6c705e103e81a7762d0ed5e64b::-ms-track{box-shadow:0 0 0 5px rgba(var(--ejs-primary-color),0.5);outline:0}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']::-webkit-slider-runnable-track{background-color:rgba(255,255,255,0.25)}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']::-moz-range-track{background-color:rgba(255,255,255,0.25)}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']::-ms-track{background-color:rgba(255,255,255,0.25)}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2),0 0 0 3px rgba(255,255,255,0.5)}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2),0 0 0 3px rgba(255,255,255,0.5)}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2),0 0 0 3px rgba(255,255,255,0.5)}.ejs--90d2780f99bcc76fdb6b0378a7238e{font-size:14px}.ejs--90d2780f99bcc76fdb6b0378a7238e+.ejs--90d2780f99bcc76fdb6b0378a7238e::before{content:'\2044';margin-right:10px}@media(max-width:767px){.ejs--90d2780f99bcc76fdb6b0378a7238e+.ejs--90d2780f99bcc76fdb6b0378a7238e{display:none}}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--90d2780f99bcc76fdb6b0378a7238e{text-shadow:0 1px 1px rgba(0,0,0,0.15)}.ejs--74c6d4176d27e37a19d2e9e61de8f4{background:rgba(255,255,255,0.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,0.15);color:#4f5b5f;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(0.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.ejs--74c6d4176d27e37a19d2e9e61de8f4::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,0.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.ejs--7a5f920ceffb2913f6dbda780573cf .ejs--8732295ca5c4902a060d34706a8146:hover .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--7a5f920ceffb2913f6dbda780573cf .ejs--8732295ca5c4902a060d34706a8146.ejs--a83b6c705e103e81a7762d0ed5e64b .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--6ea27aa07e60d1d6e4c9782740028a{opacity:1;transform:translate(-50%,0) scale(1)}.ejs--7a5f920ceffb2913f6dbda780573cf .ejs--8732295ca5c4902a060d34706a8146:hover .ejs--74c6d4176d27e37a19d2e9e61de8f4{z-index:3}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+.ejs--8732295ca5c4902a060d34706a8146 .ejs--74c6d4176d27e37a19d2e9e61de8f4{left:0;transform:translate(0,10px) scale(0.8);transform-origin:0 100%}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child .ejs--74c6d4176d27e37a19d2e9e61de8f4::before,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+.ejs--8732295ca5c4902a060d34706a8146 .ejs--74c6d4176d27e37a19d2e9e61de8f4::before{left:16px}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:last-child .ejs--74c6d4176d27e37a19d2e9e61de8f4{left:auto;right:0;transform:translate(0,10px) scale(0.8);transform-origin:100% 100%}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:last-child .ejs--74c6d4176d27e37a19d2e9e61de8f4::before{left:auto;right:16px;transform:translateX(50%)}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child:hover .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child.ejs--a83b6c705e103e81a7762d0ed5e64b .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child .ejs--6ea27aa07e60d1d6e4c9782740028a,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+.ejs--8732295ca5c4902a060d34706a8146:hover .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+.ejs--8732295ca5c4902a060d34706a8146.ejs--a83b6c705e103e81a7762d0ed5e64b .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+.ejs--8732295ca5c4902a060d34706a8146 .ejs--6ea27aa07e60d1d6e4c9782740028a,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:last-child:hover .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:last-child.ejs--a83b6c705e103e81a7762d0ed5e64b .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:last-child .ejs--6ea27aa07e60d1d6e4c9782740028a{transform:translate(0,0) scale(1)}.ejs--d5f430a99a1619b3434bf58e34a99c{background:#000;color:#bcbcbc;overflow:hidden}.ejs--d5f430a99a1619b3434bf58e34a99c.ejs--da54136ccf8c6b0b16d98e8b8e8b88{overflow:visible}.ejs--057800d021995e1347ec07cb748672{background:#333;border-radius:inherit;height:100%;overflow:hidden;position:relative;text-align:center;z-index:0}.ejs--057800d021995e1347ec07cb748672>*{height:100% !important}.ejs--057800d021995e1347ec07cb748672 canvas{height:100% !important;width:auto !important;max-width:100% !important}.ejs--64f1256f556fb94454b930cb3ea7f2 .ejs--057800d021995e1347ec07cb748672 canvas{height:auto !important;width:100% !important}.ejs--7da7949f602347007818e6d192eb23 .ejs--057800d021995e1347ec07cb748672{background-color:transparent}.ejs--f1aa376719b564cae0e653157cde14{flex:1;left:7px;margin-right:14px;position:relative}.ejs--f1aa376719b564cae0e653157cde14 input[type='range'],.ejs--f8d706413436fd119cf01aaf5a9d9d{margin-left:-7px;margin-right:-7px;width:calc(100% + 14px)}.ejs--f1aa376719b564cae0e653157cde14 input[type='range']{position:relative;z-index:2}.ejs--f1aa376719b564cae0e653157cde14 .ejs--74c6d4176d27e37a19d2e9e61de8f4{font-size:14px;left:0}.ejs--f8d706413436fd119cf01aaf5a9d9d{-webkit-appearance:none;background:transparent;border:0;border-radius:100px;height:6px;left:0;margin-top:-3px;padding:0;position:absolute;top:50%}.ejs--f8d706413436fd119cf01aaf5a9d9d::-webkit-progress-bar{background:transparent;transition:width .2s ease}.ejs--f8d706413436fd119cf01aaf5a9d9d::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.ejs--f8d706413436fd119cf01aaf5a9d9d::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.ejs--f8d706413436fd119cf01aaf5a9d9d::-ms-fill{border-radius:100px;transition:width .2s ease}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--f8d706413436fd119cf01aaf5a9d9d{box-shadow:0 1px 1px rgba(0,0,0,0.15);color:rgba(255,255,255,0.25)}.ejs--bd0222e58d71b0a304d6037dfcffd5 .ejs--f8d706413436fd119cf01aaf5a9d9d{color:rgba(183,197,205,0.66)}.ejs--d5f430a99a1619b3434bf58e34a99c.ejs--2521e1257996f264de36e77cc9c5ee .ejs--f8d706413436fd119cf01aaf5a9d9d{background-color:rgba(255,255,255,0.25)}.ejs--bd0222e58d71b0a304d6037dfcffd5.ejs--2521e1257996f264de36e77cc9c5ee .ejs--f8d706413436fd119cf01aaf5a9d9d{background-color:rgba(183,197,205,0.66)}.ejs--36ceeeec0df37a9cf4bbe05fa204ec{max-width:120px;align-items:center;display:flex;flex:1;position:relative}.ejs--36ceeeec0df37a9cf4bbe05fa204ec input[type='range']{margin-left:5px;position:relative;z-index:2}@media(min-width:480px){.ejs--36ceeeec0df37a9cf4bbe05fa204ec{max-width:90px}}@media(min-width:768px){.ejs--36ceeeec0df37a9cf4bbe05fa204ec{max-width:110px}}.ejs--d31688f864f56d6426ebbf2217d6ee{height:100%;overflow:hidden;position:absolute;top:0;width:100%}.ejs--5e71fd80268afbb1d588e40b993508{background:rgba(0,0,0,0.8);height:100%;overflow:auto;position:relative;text-align:center;z-index:9999}.ejs--5e71fd80268afbb1d588e40b993508 h4{color:#ccc;font-size:24px;margin:0;padding:10px}.ejs--1e0f0672f67d0e96592314c9ed78b0{display:block}.ejs--d7e6a6a8f38bfaa256fe5d709a8258{background:transparent;display:block;position:absolute;top:0;width:100%;z-index:10001}.ejs--b183f581b5336c4908ad258d3e1cc7{display:block}.ejs--b183f581b5336cashrqd258d3e1cc7{display:block}.ejs--158ea9dd34e3e7af2d837f8b05babb{display:block}.ejs--3f0897a8158ba363a0ee0afe4da7c5{display:block}.ejs--38cc09882a55e98c76168dbe838aa0{height:100%;margin:0 auto;max-width:800px;overflow:hidden;position:relative;width:100%}.ejs--3f0897a8158ba363a0ee0afe4da7c5 input[type='text']{background-color:#fff;border:1px solid #000;font-size:12px;font-weight:700}.ejs--f3a002bba9836fe4ebfed357a45521 ::-webkit-scrollbar{width:8px;height:16px;background-color:transparent}.ejs--f3a002bba9836fe4ebfed357a45521 ::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3);border-radius:10px;background-color:transparent}.ejs--f3a002bba9836fe4ebfed357a45521 ::-webkit-scrollbar-thumb{border-radius:0;-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3);background-color:#f5f5f5}.ejs--f3a002bba9836fe4ebfed357a45521{scrollbar-face-color:#f5f5f5;scrollbar-highlight-color:transparent;scrollbar-3dlight-color:transparent;scrollbar-darkshadow-color:transparent;scrollbar-Shadow-color:transparent;scrollbar-arrow-color:#fff;scrollbar-track-color:transparent;scrollbar-width:thin;scrollbar-color:transparent #f5f5f5}.ejs--5e71fd80268afbb1d588e40b993508 *{color:#bcbcbc !important;border:unset}.ejs--5e71fd80268afbb1d588e40b993508 a:focus{background:inherit}.ejs--5e71fd80268afbb1d588e40b993508 input,.ejs--5e71fd80268afbb1d588e40b993508 textarea{color:#000 !important}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--b373c9d5029d49324fb8ac3ece96c1{float:none}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--a5e2629abb9a5bcbc8b2c1307922d2{height:calc(100% - 130px);overflow:auto}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--a5e2629abb9a5bcbc8b2c1307922d2 a{border:0}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--580e3c22e63f8a1eb29694fd0b141b{margin-top:10px}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--580e3c22e63f8a1eb29694fd0b141b a{border-radius:.25rem;font-size:.875rem;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.5rem;display:inline-block;background-color:rgba(var(--ejs-primary-color),1);margin:0 10px;color:#fff !important}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--580e3c22e63f8a1eb29694fd0b141b a.ejs--ad20569e1449d7b8e99e6465960456{background-color:#929292}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a{opacity:1}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a li{display:inline-block;float:none}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a li.ejs--68d337c212ec6a5bc43125440d422b{border-bottom:1px solid #fff;background-color:#fff}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a li a{padding:2px 5px;color:#bcbcbc !important}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a li.ejs--68d337c212ec6a5bc43125440d422b a{color:#000 !important}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--31eb28817642bb1bfe0a2c422108bb{opacity:1}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--f932566a0af5314da834324c901978{opacity:1}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--f932566a0af5314da834324c901978 div.ejs--c233fb69cbef43078bc39e9d1efac8:hover{background-color:#2d2d2d}.ejs--d169a219343bc32dd4aecc3f6b7f25{opacity:1}.ejs--ad20569e1449d7b8e99e6465960456{float:none}.ejs--ad20569e1449d7b8e99e6465963825{float:none}.ejs--ad20569e1449d7b8e99e6468571053{float:none}.ejs--bdb54e9fc47f9805b506b746e897bf{float:none}.ejs--67d03ee7480b871ad6507d6319a839{float:none}.ejs--c2d931157456c1d438d40a2f66af2c{float:none}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--f932566a0af5314da834324c901978 a.ejs--6604c83041a275a78837c452a71dd8,.ejs--99150e15f962c63c689cadc81ef40d{float:none;padding:.1rem .5rem;background-color:rgba(var(--ejs-primary-color),1);color:#fff !important;border-radius:.25rem;cursor:pointer}.ejs--71527b6509aa48afce3ce1a11c02f0{float:none}.ejs--7ad35768e3f6b9faf97db01d5b60ae{float:none}.ejs--9c403e5e107a3e4374ba244b636400{float:none}.ejs--d6a46533fa6e510a571af5c28b440a{float:none}.ejs--d6a46533fa6e510a571af5c28b440a table{font-size:.8rem;padding:0 10px}.ejs--d6a46533fa6e510a571af5c28b440a thead{background-color:rgba(50,50,50,0.66)}.ejs--d6a46533fa6e510a571af5c28b440a tbody tr:hover{background-color:#2d2d2d}.ejs--d6a46533fa6e510a571af5c28b440a tbody td{padding:10px 0}.ejs--d6a46533fa6e510a571af5c28b440a tbody td svg{width:12px;vertical-align:middle}.ejs--d6a46533fa6e510a571af5c28b440a table td:nth-child(2),.ejs--d6a46533fa6e510a571af5c28b440a table td:nth-child(3){text-align:center;width:80px}.ejs--57ca9b3853cc7de731483cfcc95a59{float:none}.ejs--0885d5e25e19127b6b516014426a1b{float:none}.ejs--25023d28756fdb9dfbbfb6dccb8677{float:none}.ejs--75b3a8d35aacc6424ed7422fdeaaaa{float:none}.ejs--eefdf28d69ed2d20f197308981bb61{float:none}.ejs--eefdf28d69ed2d20f197308981bb61 table{font-size:.8rem;padding:0 10px}.ejs--eefdf28d69ed2d20f197308981bb61 thead,.ejs--eefdf28d69ed2d20f197308981bb61 tbody,.ejs--eefdf28d69ed2d20f197308981bb61 tfoot,.ejs--d6a46533fa6e510a571af5c28b440a thead,.ejs--d6a46533fa6e510a571af5c28b440a tbody,.ejs--d6a46533fa6e510a571af5c28b440a tfoot{background:transparent;text-align:left}.ejs--eefdf28d69ed2d20f197308981bb61 tbody tr:hover{background-color:#2d2d2d}.ejs--eefdf28d69ed2d20f197308981bb61 tr td:nth-child(1),.ejs--eefdf28d69ed2d20f197308981bb61 tr td:nth-child(3){width:80px}.ejs--9e670880bb57e824400fa00f09aaad,.ejs--2b4e3c245b7b25dfdac5e09155a68e,.ejs--572b0b3a0345a6b01b01a15a02842c,.ejs--a7d7f80c8999469c991ea452a85dd9{float:none}.ejs--2b4e3c245b7b25dfdac5e09155a68e{max-width:320px;margin:0 auto;text-align:left;width:100%}.ejs--952c974392296e7f643d51db380157{height:100%;overflow:hidden;position:absolute;top:0;width:100%}.ejs--0d7e216cf12ae73705b5d5bb0452fc{float:none}.ejs--c0a5e71f6613caab66d6ae15a5a00f{color:rgba(255,255,255,0.8);font-size:.8rem;padding:5px;text-align:left;text-shadow:1px 1px 1px #000}.ejs--2440e3b831017ff8327c939e2a4413{display:none;position:fixed;bottom:30px;width:100%;position:absolute;bottom:80px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--b8d8b771d0bbb94e2bbd03054f53fd{position:absolute;bottom:250px;width:100%}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--c83d70cb63c933edc073c7fe92e32b{position:absolute;bottom:50px;width:125px;height:125px;left:10px}@media(min-width:480px){.ejs--2440e3b831017ff8327c939e2a4413{bottom:50px}}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--6e7015634623fd6a82e6a7d3488c84{position:absolute;font-size:20px;width:50px;height:50px;text-align:center;line-height:50px;border:1px solid #ccc;border-radius:50%;font-size:30px;font-weight:bold;background-color:rgba(255,255,255,0.15);user-select:none}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--49fa47c86a131e4ca8fb268bfdde89{position:absolute;bottom:10px;height:30px;width:124px;left:50%;margin-left:-62px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--49fa47c86a131e4ca8fb268bfdde89 .ejs--6e7015634623fd6a82e6a7d3488c84{width:60px;height:30px;font-size:12px;font-weight:bolder;border-radius:5px;border:1px solid #ccc;line-height:30px;text-align:center;text-transform:uppercase}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--7d2b19f77fd0ccabf94dc1ca39ae18{position:absolute;bottom:50px;width:130px;height:130px;right:10px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--7d2b19f77fd0ccabf94dc1ca39ae18 .ejs--6e7015634623fd6a82e6a7d3488c84{width:50px;height:50px;text-align:center;line-height:50px;border:1px solid #ccc;border-radius:50%;font-size:30px;font-weight:bold;transition:all .2s}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--6e7015634623fd6a82e6a7d3488c84.ejs--d708d9d486f1eca73a593d5c09f8ad{background-color:#000000ad}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--6e7015634623fd6a82e6a7d3488c84 img{width:100%}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--76fa7567879f97f5991c50ac600735{left:30px}.ejs--82fa3531556f97f5991c50ac600735{left:-35px}.ejs--fbd492618ebsd464fbcd1c9185cd14{left:95px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--fbd499578ebef494fbcd1c9114cd1d{left:40px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--b4c6d9bdbbd3dcfc8fa82689ecf448{left:40px;top:80px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--87c940c15830daa967b08e67e9b87e{left:0;top:40px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--b7c456c7dd7a616a55965bb134323b{left:81px;top:40px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--7930ee9bb7ae2fa6e2f7b5568f1e98,.ejs--2440e3b831017ff8327c939e2a4413 .ejs--2226100d4c5408c2699e942aabb31c{height:31px;text-align:center;border:1px solid #ccc;border-radius:5px;line-height:31px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--7930ee9bb7ae2fa6e2f7b5568f1e98{left:10px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--2226100d4c5408c2699e942aabb31c{right:10px}.ejs--eefec939452eb92fad035932d0f47c{float:none}.ejs--f1f43b27384834c8c22c6f81d0c5ae{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.6);display:flex;justify-content:center;align-items:center}.ejs--c4ee33766a01ed0356c3ec07898e96{background-color:rgba(0,0,0,0.8);border:1px solid rgba(238,238,238,0.2);padding:30px;min-width:200px;max-width:500px;max-height:100vh;border-radius:4px;overflow-y:auto;box-sizing:border-box}.ejs--a073f32023da1ced805c5f95a4e81c{display:flex;justify-content:space-between;align-items:center}.ejs--ed44f59bb8cd49177586b140658c6c{background-color:transparent;padding:0}.ejs--81470ba5e6a6d68014839ad4d9a977{margin-top:0 !important;margin-bottom:0 !important;font-weight:600 !important;font-size:1.25rem;line-height:1.25 !important;color:rgba(var(--ejs-primary-color),1) !important}.ejs--c3c85789c2a7f56d8b26dba75b7e1f{background:transparent;border:0}.ejs--a073f32023da1ced805c5f95a4e81c .ejs--c3c85789c2a7f56d8b26dba75b7e1f:before{content:"\2715"}.ejs--db44f5520e6f4fd0dd34b478bb9ee8{margin-top:2rem;margin-bottom:2rem;line-height:1.5;color:rgba(0,0,0,0.8);text-align:left}.ejs--db44f5520e6f4fd0dd34b478bb9ee8 input,.ejs--db44f5520e6f4fd0dd34b478bb9ee8 select,.ejs--db44f5520e6f4fd0dd34b478bb9ee8 textarea{font-size:1rem;padding:.4rem;max-width:100%}.ejs--319bcec5dee9444e1a2a53d6503b7c{color:#fff !important;font-size:.875rem;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.5rem;background-color:#929292;color:rgba(0,0,0,0.8);border-radius:.25rem;border-style:none;border-width:0;cursor:pointer;-webkit-appearance:button;text-transform:none;overflow:visible;line-height:1.15;margin:0;will-change:transform;-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-out;transition:transform .25s ease-out;transition:transform .25s ease-out,-webkit-transform .25s ease-out}.ejs--319bcec5dee9444e1a2a53d6503b7c:focus,.ejs--319bcec5dee9444e1a2a53d6503b7c:hover{-webkit-transform:scale(1.05);transform:scale(1.05)}.ejs--eaf3c1cba25d415d92ac48d7db34dd{background-color:rgba(var(--ejs-primary-color),1)}.ejs--940087708c06b6129ce2bfa45f1d89{color:#f00 !important}@keyframes ejs--9d7aa2bd5ee276be085e5b2a0bbc2e{from{opacity:0}to{opacity:1}}@keyframes ejs--184b7558ffeb569c1790654537477b{from{opacity:1}to{opacity:0}}@keyframes ejs--8b069266f76099cc6bc220f6ea56cc{from{transform:translateY(15%)}to{transform:translateY(0)}}@keyframes ejs--379a464ad0e66ea5fc601e5f2fd73e{from{transform:translateY(0)}to{transform:translateY(-10%)}}.ejs--bef295f3125e9ba83d4f3677264bae{display:none}.ejs--bef295f3125e9ba83d4f3677264bae.ejs--60c17e0d149099f207b06f27edae6a{position:absolute;top:0;display:block;height:100%;width:100%}.ejs--bef295f3125e9ba83d4f3677264bae[aria-hidden="false"] .ejs--f1f43b27384834c8c22c6f81d0c5ae{animation:ejs--9d7aa2bd5ee276be085e5b2a0bbc2e .3s cubic-bezier(0,0,0.2,1)}.ejs--bef295f3125e9ba83d4f3677264bae[aria-hidden="false"] .ejs--c4ee33766a01ed0356c3ec07898e96{animation:ejs--8b069266f76099cc6bc220f6ea56cc .3s cubic-bezier(0,0,0.2,1)}.ejs--bef295f3125e9ba83d4f3677264bae[aria-hidden="true"] .ejs--f1f43b27384834c8c22c6f81d0c5ae{animation:ejs--184b7558ffeb569c1790654537477b .3s cubic-bezier(0,0,0.2,1)}.ejs--bef295f3125e9ba83d4f3677264bae[aria-hidden="true"] .ejs--c4ee33766a01ed0356c3ec07898e96{animation:ejs--379a464ad0e66ea5fc601e5f2fd73e .3s cubic-bezier(0,0,0.2,1)}.ejs--bef295f3125e9ba83d4f3677264bae .ejs--c4ee33766a01ed0356c3ec07898e96,.ejs--bef295f3125e9ba83d4f3677264bae .ejs--f1f43b27384834c8c22c6f81d0c5ae{will-change:transform}.ejs--4c3e63d4005bd8a0468e9c74a35f62{padding-left:2.25rem;position:relative;padding:.2em 0;clear:both}.ejs--4c3e63d4005bd8a0468e9c74a35f62:hover{background-color:rgba(0,0,0,0.8)}.ejs--4c3e63d4005bd8a0468e9c74a35f62 input[type=checkbox]{position:absolute;z-index:-1;opacity:0;box-sizing:border-box;width:auto}.ejs--4c3e63d4005bd8a0468e9c74a35f62 label{position:relative;margin-bottom:0;vertical-align:top;word-break:break-word}.ejs--4c3e63d4005bd8a0468e9c74a35f62 label::before{position:absolute;top:.325rem;display:block;height:1rem;content:"";background-color:#fff;border:#adb5bd solid 1px;left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.ejs--4c3e63d4005bd8a0468e9c74a35f62 label::after{position:absolute;display:block;content:"";background-repeat:no-repeat;background-position:center center;top:calc(.325rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}.ejs--4c3e63d4005bd8a0468e9c74a35f62 input:checked+label::before{color:#fff;border-color:rgba(var(--ejs-primary-color),1);background-color:rgba(var(--ejs-primary-color),1)}.ejs--4c3e63d4005bd8a0468e9c74a35f62 input:checked+label::after{background-color:#fff;-webkit-transform:translateX(0.75rem);transform:translateX(0.75rem)}.ejs--90bcdd71cd0d2307e9ee0dffa916da{position:absolute;padding:.1rem .5rem;background-color:rgba(var(--ejs-primary-color),1);color:#fff !important;border-radius:.25rem;cursor:pointer;right:.025rem}.ejs--7a5f920ceffb2913f6dbda780573cf:fullscreen{background:#000;border-radius:0 !important;height:100%;margin:0;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:fullscreen canvas{height:100% !important;max-width:100%;min-width:0;width:auto}.ejs--7a5f920ceffb2913f6dbda780573cf:fullscreen .ejs--057800d021995e1347ec07cb748672{height:100%;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:fullscreen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e{display:block}.ejs--7a5f920ceffb2913f6dbda780573cf:fullscreen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e+svg{display:none}.ejs--7a5f920ceffb2913f6dbda780573cf:-webkit-full-screen{background:#000;border-radius:0 !important;height:100%;margin:0;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-webkit-full-screen canvas{height:100% !important;max-width:100%;min-width:0;width:auto}.ejs--7a5f920ceffb2913f6dbda780573cf:-webkit-full-screen .ejs--057800d021995e1347ec07cb748672{height:100%;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-webkit-full-screen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e{display:block}.ejs--7a5f920ceffb2913f6dbda780573cf:-webkit-full-screen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e+svg{display:none}.ejs--7a5f920ceffb2913f6dbda780573cf:-moz-full-screen{background:#000;border-radius:0 !important;height:100%;margin:0;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-moz-full-screen canvas{height:100% !important;max-width:100%;min-width:0;width:auto}.ejs--7a5f920ceffb2913f6dbda780573cf:-moz-full-screen .ejs--057800d021995e1347ec07cb748672{height:100%;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-moz-full-screen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e{display:block}.ejs--7a5f920ceffb2913f6dbda780573cf:-moz-full-screen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e+svg{display:none}.ejs--7a5f920ceffb2913f6dbda780573cf:-ms-fullscreen{background:#000;border-radius:0 !important;height:100%;margin:0;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-ms-fullscreen canvas{height:100% !important;max-width:100%;min-width:0;width:auto}.ejs--7a5f920ceffb2913f6dbda780573cf:-ms-fullscreen .ejs--057800d021995e1347ec07cb748672{height:100%;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-ms-fullscreen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e{display:block}.ejs--7a5f920ceffb2913f6dbda780573cf:-ms-fullscreen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e+svg{display:none}.ejs--412041671de21945d3e028b6ae84c9{background:#000;border-radius:0 !important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.ejs--412041671de21945d3e028b6ae84c9 canvas{height:100% !important;max-width:100%;min-width:0;width:auto}.ejs--412041671de21945d3e028b6ae84c9 .ejs--057800d021995e1347ec07cb748672{height:100%;width:100%}.ejs--412041671de21945d3e028b6ae84c9 .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e{display:block}.ejs--412041671de21945d3e028b6ae84c9 .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e+svg{display:none}.ejs--7a5f920ceffb2913f6dbda780573cf.ejs--64f1256f556fb94454b930cb3ea7f2:fullscreen canvas{width:100%;height:auto !important}.ejs--7a5f920ceffb2913f6dbda780573cf.ejs--64f1256f556fb94454b930cb3ea7f2:-webkit-full-screen canvas{width:100%;height:auto !important}.ejs--7a5f920ceffb2913f6dbda780573cf.ejs--64f1256f556fb94454b930cb3ea7f2:-moz-full-screen{width:100%;height:auto !important}.ejs--7a5f920ceffb2913f6dbda780573cf.ejs--64f1256f556fb94454b930cb3ea7f2:-ms-fullscreen{width:100%;height:auto !important}.ejs--33643265135cf89e6c0a0d9866d6f1{transition:none !important}.ejs--6f0e996cd15e5fb6be0256918531d7{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0 !important;height:1px !important;padding:0 !important;position:absolute !important;width:1px !important}.ejs--7a5f920ceffb2913f6dbda780573cf [hidden]{display:none !important} \ No newline at end of file +@keyframes ejs--c2532bfe04554193cc42b3be753700{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes ejs--7cadf43f3d9eb17c7e3c36de84973b{from{opacity:0}to{opacity:1}}@keyframes ejs--9bd947b3e6427453595f083d740a7c{to{box-shadow:1px 3px 15px 8px #222,0 7px 10px 0 #111,inset 0 0 1px 0 rgba(250,250,250,0.2),inset 8px 5px 35px 0 rgba(0,0,0,0.5)}}:root{--ejs-primary-color:26,175,255}.ejs--de6433374cb30211f10e148b320b2f{height:100%}.ejs--7a5f920ceffb2913f6dbda780573cf{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:100%;width:100%;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-size:14px;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ejs--666d4296310579687cf3cf3d2cf951{display:inline-block;width:30px;height:30px;color:#fff;position:absolute;top:5px;right:5px;opacity:.5;z-index:999}.ejs--666d4296310579687cf3cf3d2cf951 svg{fill:currentColor}​ .ejs--7a5f920ceffb2913f6dbda780573cf a{color:#ddd;text-decoration:none}.ejs--7a5f920ceffb2913f6dbda780573cf button{font:inherit;line-height:inherit;width:auto}.ejs--7a5f920ceffb2913f6dbda780573cf ul{list-style:none;margin:0;padding:0}.ejs--7a5f920ceffb2913f6dbda780573cf:focus{outline:0}.ejs--7a5f920ceffb2913f6dbda780573cf *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ejs--f3a002bba9836fe4ebfed357a45521{box-sizing:border-box}.ejs--f3a002bba9836fe4ebfed357a45521 *,.ejs--f3a002bba9836fe4ebfed357a45521 *::after,.ejs--f3a002bba9836fe4ebfed357a45521 *::before{box-sizing:inherit}.ejs--f3a002bba9836fe4ebfed357a45521 a,.ejs--f3a002bba9836fe4ebfed357a45521 button,.ejs--f3a002bba9836fe4ebfed357a45521 input,.ejs--f3a002bba9836fe4ebfed357a45521 label{touch-action:manipulation}.ejs--008adea3c1ef33a8fc94892a1e97e6 li{display:inline-block;background:#fff;border:1px solid #ccc;font-size:12px}.ejs--008adea3c1ef33a8fc94892a1e97e6 li a{color:#000}.ejs--85a95eb6bf74a40ab61b91a91e5bff{position:absolute;width:100%;height:100%;top:0;z-index:9999;background:rgba(0,0,0,0.3) !important;color:#fff;text-align:center}.ejs--d169a219343bc32dd4aecc3f6b7f25{position:absolute;width:300px;top:50%;margin-left:-150px;margin-top:-50px;left:50%;background:rgba(0,0,0,0.8) !important;padding:15px 0}.ejs--782e3572812f983b3a150eec177391{text-align:center;font-size:13px}.ejs--c426dd1d179aa351e6cec47e1d9438,.ejs--31e7e81db48819ee35ec6f50378a2e,.ejs--20d4eb2646d396f558a645dc0574f1,.ejs--4de05306c8b099bdeb4585571ac095{font-size:12px}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8{background:rgba(16,16,16,0.9);border-radius:3px;font-size:13px;min-width:180px;padding:8px}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8 li{padding:4px 11px;text-align:center}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8 li a{color:#999;display:block;font-size:13px}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8 li:hover{background:rgba(var(--ejs-primary-color),1);border-radius:4px;box-shadow:0 0 0 5px rgba(var(--ejs-primary-color),0.5);outline:0}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8 li:hover a{color:#fff}.ejs--c7957d8666bb6b8fc7c3e9c021aaf8 li:last-child{border:0}.ejs--cbcfe0a1421cadac9a04c81d6431d6{display:block !important;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.ejs--cbcfe0a1421cadac9a04c81d6431d6 .ejs--f3a1903d935f6cf720d4a0498db62a:after{content:"";position:absolute;border-left:20px solid transparent;border-right:20px solid #a7a7a77d;border-top:20px solid #a7a7a77d;border-bottom:20px solid transparent;right:0}.ejs--cbcfe0a1421cadac9a04c81d6431d6 .ejs--f3a1903d935f6cf720d4a0498db62a a{right:4px;top:4px;position:absolute;border:0;padding:0;width:15px;height:15px;z-index:99}.ejs--cbcfe0a1421cadac9a04c81d6431d6 .ejs--f3a1903d935f6cf720d4a0498db62a a:before{content:"";border-bottom:1px solid #fff;transform:rotate(45deg) translateY(-45%);width:15px;height:15px;display:block;position:absolute;top:0;right:0}.ejs--cbcfe0a1421cadac9a04c81d6431d6 .ejs--f3a1903d935f6cf720d4a0498db62a a:after{content:"";border-bottom:1px solid #fff;width:15px;height:15px;display:block;position:absolute;right:0;background:transparent;top:0;transform:rotate(-45deg) translateY(-50%) translateX(0)}a.ejs--73f9b4e94a7a1fe74e11107d5ab2ef{display:flex;justify-content:center;text-shadow:0 1px 1px rgba(0,0,0,0.5);font-size:20px;line-height:45px;text-transform:uppercase;font-weight:bolder;position:relative;text-decoration:none;width:200px;height:45px;border:0;color:#fff !important;border-radius:35px;text-align:center;background-color:rgba(var(--ejs-primary-color),1)}a.ejs--73f9b4e94a7a1fe74e11107d5ab2ef:active{box-shadow:0 0 0 0 #222,0 3px 7px 0 #111,inset 0 1px 1px 0 rgba(250,250,250,0.2),inset 0 -10px 35px 5px rgba(0,0,0,0.5);top:1px}a.ejs--73f9b4e94a7a1fe74e11107d5ab2ef:hover{animation:ejs--9bd947b3e6427453595f083d740a7c 1.2s linear infinite alternate}.ejs--8732295ca5c4902a060d34706a8146{background:transparent;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.ejs--8732295ca5c4902a060d34706a8146 svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.ejs--8732295ca5c4902a060d34706a8146:focus{outline:0}.ejs--8732295ca5c4902a060d34706a8146.ejs--a83b6c705e103e81a7762d0ed5e64b{box-shadow:0 0 0 5px rgba(var(--ejs-primary-color),0.5);outline:0}.ejs--8732295ca5c4902a060d34706a8146:not(.ejs--b1238136ec472a92297159882cf4b8) .ejs--ec731619062226d943da67f5d83009,.ejs--8732295ca5c4902a060d34706a8146.ejs--b1238136ec472a92297159882cf4b8 .ejs--dc7068585e3d84fe0e676864c1439e,.ejs--8732295ca5c4902a060d34706a8146:not(.ejs--b1238136ec472a92297159882cf4b8) .ejs--0c6561f9155750b0aeeed6da5da7bf,.ejs--8732295ca5c4902a060d34706a8146.ejs--b1238136ec472a92297159882cf4b8 .ejs--13d64e30c1333cc99391af48ddabaa{display:none}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146 svg{filter:drop-shadow(0 1px 1px rgba(0,0,0,0.15))}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146.ejs--a83b6c705e103e81a7762d0ed5e64b,.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146:hover,.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146[aria-expanded='true']{background:rgba(var(--ejs-primary-color),1);color:#fff}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146[disabled],.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--8732295ca5c4902a060d34706a8146[disabled]:hover{background:transparent;color:#4b4b4b}.ejs--f3a002bba9836fe4ebfed357a45521 ::-webkit-media-controls{display:none}.ejs--1acedc5ed6816abe96dd27d910fd74{align-items:center;display:flex;justify-content:flex-start;text-align:center}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--f1aa376719b564cae0e653157cde14,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--90d2780f99bcc76fdb6b0378a7238e,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--c7bfb2d1b75a40fdaaf90624bea9e7,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--36ceeeec0df37a9cf4bbe05fa204ec{margin-left:5px}.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--c7bfb2d1b75a40fdaaf90624bea9e7+.ejs--8732295ca5c4902a060d34706a8146,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146+.ejs--c7bfb2d1b75a40fdaaf90624bea9e7,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146+.ejs--8732295ca5c4902a060d34706a8146,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--f1aa376719b564cae0e653157cde14+.ejs--8732295ca5c4902a060d34706a8146{margin-left:2px}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+[data-btn='pause']{margin-left:0}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+[data-btn='netplay']{margin-right:auto}.ejs--1acedc5ed6816abe96dd27d910fd74:empty{display:none}@media(min-width:480px){.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--c7bfb2d1b75a40fdaaf90624bea9e7,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--f1aa376719b564cae0e653157cde14,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--90d2780f99bcc76fdb6b0378a7238e,.ejs--1acedc5ed6816abe96dd27d910fd74 .ejs--36ceeeec0df37a9cf4bbe05fa204ec{margin-left:10px}}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--1acedc5ed6816abe96dd27d910fd74{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media(min-width:480px){.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--1acedc5ed6816abe96dd27d910fd74{padding:15px 10px 10px}}.ejs--d5f430a99a1619b3434bf58e34a99c.ejs--1b8cb7f2294b1eb5de5238daea3513 .ejs--1acedc5ed6816abe96dd27d910fd74{opacity:0;pointer-events:none;transform:translateY(100%)}.ejs--7a5f920ceffb2913f6dbda780573cf [data-btn='fullscreen']{display:none}.ejs--19409fe2057ab935a7e46abb5b4f49 [data-btn='fullscreen']{display:inline-block}.ejs--c7bfb2d1b75a40fdaaf90624bea9e7{display:flex;position:relative}.ejs--c7bfb2d1b75a40fdaaf90624bea9e7 .ejs--8732295ca5c4902a060d34706a8146 svg{transition:transform .3s ease}.ejs--c7bfb2d1b75a40fdaaf90624bea9e7 .ejs--8732295ca5c4902a060d34706a8146[aria-expanded='true'] svg{transform:rotate(90deg)}.ejs--c7bfb2d1b75a40fdaaf90624bea9e7 .ejs--8732295ca5c4902a060d34706a8146[aria-expanded='true'] .ejs--74c6d4176d27e37a19d2e9e61de8f4{display:none}.ejs--013213afedeeb6878089b1ca1b4e47{animation:ejs--c2532bfe04554193cc42b3be753700 .2s ease;background:rgba(16,16,16,0.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,0.15);color:#4f5b5f;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.ejs--013213afedeeb6878089b1ca1b4e47>div{overflow:hidden;transition:height .35s cubic-bezier(0.4,0,0.2,1),width .35s cubic-bezier(0.4,0,0.2,1)}.ejs--013213afedeeb6878089b1ca1b4e47::after{border:4px solid transparent;border-top-color:rgba(16,16,16,0.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.ejs--013213afedeeb6878089b1ca1b4e47 [role='menu']{padding:7px}.ejs--013213afedeeb6878089b1ca1b4e47 [role='menuitem'],.ejs--013213afedeeb6878089b1ca1b4e47 [role='menuitemradio']{margin-top:2px}.ejs--013213afedeeb6878089b1ca1b4e47 [role='menuitem']:first-child,.ejs--013213afedeeb6878089b1ca1b4e47 [role='menuitemradio']:first-child{margin-top:0}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146{align-items:center;color:#999;display:flex;font-size:13px;padding:4px 11px;user-select:none;width:100%}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146>span{align-items:inherit;display:flex;width:100%}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--0b4cdb4057d1a4623e60836ccc6275{padding-right:28px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--0b4cdb4057d1a4623e60836ccc6275::after{border-left-color:rgba(79,91,95,0.8);right:5px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--0b4cdb4057d1a4623e60836ccc6275.ejs--a83b6c705e103e81a7762d0ed5e64b::after,.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--0b4cdb4057d1a4623e60836ccc6275:hover::after{border-left-color:currentColor}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--a7ad9de0cb0ca672b6703c50de7db9{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--a7ad9de0cb0ca672b6703c50de7db9::after{border-right-color:rgba(79,91,95,0.8);left:7px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--a7ad9de0cb0ca672b6703c50de7db9::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--a7ad9de0cb0ca672b6703c50de7db9.ejs--a83b6c705e103e81a7762d0ed5e64b::after,.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--a7ad9de0cb0ca672b6703c50de7db9:hover::after{border-right-color:currentColor}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']{padding-left:7px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']::before,.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']::after{border-radius:100%}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']::before{background:rgba(204,204,204,0.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio'][aria-checked='true']::before{background:rgba(var(--ejs-primary-color),1)}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio'][aria-checked='true']::after{opacity:1;transform:translateY(-50%) scale(1)}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio'].ejs--a83b6c705e103e81a7762d0ed5e64b::before,.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--8732295ca5c4902a060d34706a8146[role='menuitemradio']:hover::before{background:rgba(0,0,0,0.1)}.ejs--013213afedeeb6878089b1ca1b4e47 .ejs--f91e90fe7cabc875aff9a431bf5389{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']{-webkit-appearance:none;background:transparent;border:0;border-radius:28px;color:rgba(var(--ejs-primary-color),1);display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-webkit-slider-runnable-track{background:transparent;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2);height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-moz-range-track{background:transparent;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;user-select:none}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2);height:14px;position:relative;transition:all .2s ease;width:14px}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-ms-track{background:transparent;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;user-select:none;color:transparent}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-ms-fill-upper{background:transparent;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;user-select:none}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-ms-fill-lower{background:transparent;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;user-select:none;background:currentColor}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2);height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-ms-tooltip{display:none}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']:focus{outline:0}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range']::-moz-focus-outer{border:0}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range'].ejs--a83b6c705e103e81a7762d0ed5e64b::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(var(--ejs-primary-color),0.5);outline:0}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range'].ejs--a83b6c705e103e81a7762d0ed5e64b::-moz-range-track{box-shadow:0 0 0 5px rgba(var(--ejs-primary-color),0.5);outline:0}.ejs--f3a002bba9836fe4ebfed357a45521 input[type='range'].ejs--a83b6c705e103e81a7762d0ed5e64b::-ms-track{box-shadow:0 0 0 5px rgba(var(--ejs-primary-color),0.5);outline:0}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']::-webkit-slider-runnable-track{background-color:rgba(255,255,255,0.25)}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']::-moz-range-track{background-color:rgba(255,255,255,0.25)}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']::-ms-track{background-color:rgba(255,255,255,0.25)}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2),0 0 0 3px rgba(255,255,255,0.5)}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2),0 0 0 3px rgba(255,255,255,0.5)}.ejs--f3a002bba9836fe4ebfed357a45521.ejs--d5f430a99a1619b3434bf58e34a99c input[type='range']:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,0.15),0 0 0 1px rgba(47,52,61,0.2),0 0 0 3px rgba(255,255,255,0.5)}.ejs--90d2780f99bcc76fdb6b0378a7238e{font-size:14px}.ejs--90d2780f99bcc76fdb6b0378a7238e+.ejs--90d2780f99bcc76fdb6b0378a7238e::before{content:'\2044';margin-right:10px}@media(max-width:767px){.ejs--90d2780f99bcc76fdb6b0378a7238e+.ejs--90d2780f99bcc76fdb6b0378a7238e{display:none}}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--90d2780f99bcc76fdb6b0378a7238e{text-shadow:0 1px 1px rgba(0,0,0,0.15)}.ejs--74c6d4176d27e37a19d2e9e61de8f4{background:rgba(255,255,255,0.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,0.15);color:#4f5b5f;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(0.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.ejs--74c6d4176d27e37a19d2e9e61de8f4::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,0.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.ejs--7a5f920ceffb2913f6dbda780573cf .ejs--8732295ca5c4902a060d34706a8146:hover .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--7a5f920ceffb2913f6dbda780573cf .ejs--8732295ca5c4902a060d34706a8146.ejs--a83b6c705e103e81a7762d0ed5e64b .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--6ea27aa07e60d1d6e4c9782740028a{opacity:1;transform:translate(-50%,0) scale(1)}.ejs--7a5f920ceffb2913f6dbda780573cf .ejs--8732295ca5c4902a060d34706a8146:hover .ejs--74c6d4176d27e37a19d2e9e61de8f4{z-index:3}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+.ejs--8732295ca5c4902a060d34706a8146 .ejs--74c6d4176d27e37a19d2e9e61de8f4{left:0;transform:translate(0,10px) scale(0.8);transform-origin:0 100%}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child .ejs--74c6d4176d27e37a19d2e9e61de8f4::before,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+.ejs--8732295ca5c4902a060d34706a8146 .ejs--74c6d4176d27e37a19d2e9e61de8f4::before{left:16px}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:last-child .ejs--74c6d4176d27e37a19d2e9e61de8f4{left:auto;right:0;transform:translate(0,10px) scale(0.8);transform-origin:100% 100%}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:last-child .ejs--74c6d4176d27e37a19d2e9e61de8f4::before{left:auto;right:16px;transform:translateX(50%)}.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child:hover .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child.ejs--a83b6c705e103e81a7762d0ed5e64b .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child .ejs--6ea27aa07e60d1d6e4c9782740028a,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+.ejs--8732295ca5c4902a060d34706a8146:hover .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+.ejs--8732295ca5c4902a060d34706a8146.ejs--a83b6c705e103e81a7762d0ed5e64b .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:first-child+.ejs--8732295ca5c4902a060d34706a8146 .ejs--6ea27aa07e60d1d6e4c9782740028a,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:last-child:hover .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:last-child.ejs--a83b6c705e103e81a7762d0ed5e64b .ejs--74c6d4176d27e37a19d2e9e61de8f4,.ejs--1acedc5ed6816abe96dd27d910fd74>.ejs--8732295ca5c4902a060d34706a8146:last-child .ejs--6ea27aa07e60d1d6e4c9782740028a{transform:translate(0,0) scale(1)}.ejs--d5f430a99a1619b3434bf58e34a99c{background:#000;color:#bcbcbc;overflow:hidden}.ejs--d5f430a99a1619b3434bf58e34a99c.ejs--da54136ccf8c6b0b16d98e8b8e8b88{overflow:visible}.ejs--057800d021995e1347ec07cb748672{background:#333;border-radius:inherit;height:100%;overflow:hidden;position:relative;text-align:center;z-index:0}.ejs--057800d021995e1347ec07cb748672>*{height:100% !important}.ejs--057800d021995e1347ec07cb748672 canvas{height:100% !important;width:auto !important;max-width:100% !important}.ejs--64f1256f556fb94454b930cb3ea7f2 .ejs--057800d021995e1347ec07cb748672 canvas{height:auto !important;width:100% !important}.ejs--7da7949f602347007818e6d192eb23 .ejs--057800d021995e1347ec07cb748672{background-color:transparent}.ejs--f1aa376719b564cae0e653157cde14{flex:1;left:7px;margin-right:14px;position:relative}.ejs--f1aa376719b564cae0e653157cde14 input[type='range'],.ejs--f8d706413436fd119cf01aaf5a9d9d{margin-left:-7px;margin-right:-7px;width:calc(100% + 14px)}.ejs--f1aa376719b564cae0e653157cde14 input[type='range']{position:relative;z-index:2}.ejs--f1aa376719b564cae0e653157cde14 .ejs--74c6d4176d27e37a19d2e9e61de8f4{font-size:14px;left:0}.ejs--f8d706413436fd119cf01aaf5a9d9d{-webkit-appearance:none;background:transparent;border:0;border-radius:100px;height:6px;left:0;margin-top:-3px;padding:0;position:absolute;top:50%}.ejs--f8d706413436fd119cf01aaf5a9d9d::-webkit-progress-bar{background:transparent;transition:width .2s ease}.ejs--f8d706413436fd119cf01aaf5a9d9d::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.ejs--f8d706413436fd119cf01aaf5a9d9d::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.ejs--f8d706413436fd119cf01aaf5a9d9d::-ms-fill{border-radius:100px;transition:width .2s ease}.ejs--d5f430a99a1619b3434bf58e34a99c .ejs--f8d706413436fd119cf01aaf5a9d9d{box-shadow:0 1px 1px rgba(0,0,0,0.15);color:rgba(255,255,255,0.25)}.ejs--bd0222e58d71b0a304d6037dfcffd5 .ejs--f8d706413436fd119cf01aaf5a9d9d{color:rgba(183,197,205,0.66)}.ejs--d5f430a99a1619b3434bf58e34a99c.ejs--2521e1257996f264de36e77cc9c5ee .ejs--f8d706413436fd119cf01aaf5a9d9d{background-color:rgba(255,255,255,0.25)}.ejs--bd0222e58d71b0a304d6037dfcffd5.ejs--2521e1257996f264de36e77cc9c5ee .ejs--f8d706413436fd119cf01aaf5a9d9d{background-color:rgba(183,197,205,0.66)}.ejs--36ceeeec0df37a9cf4bbe05fa204ec{max-width:120px;align-items:center;display:flex;flex:1;position:relative}.ejs--36ceeeec0df37a9cf4bbe05fa204ec input[type='range']{margin-left:5px;position:relative;z-index:2}@media(min-width:480px){.ejs--36ceeeec0df37a9cf4bbe05fa204ec{max-width:90px}}@media(min-width:768px){.ejs--36ceeeec0df37a9cf4bbe05fa204ec{max-width:110px}}.ejs--d31688f864f56d6426ebbf2217d6ee{height:100%;overflow:hidden;position:absolute;top:0;width:100%}.ejs--5e71fd80268afbb1d588e40b993508{background:rgba(0,0,0,0.8);height:100%;overflow:auto;position:relative;text-align:center;z-index:9999}.ejs--5e71fd80268afbb1d588e40b993508 h4{color:#ccc;font-size:24px;margin:0;padding:10px}.ejs--1e0f0672f67d0e96592314c9ed78b0{display:block}.ejs--d7e6a6a8f38bfaa256fe5d709a8258{background:transparent;display:block;position:absolute;top:0;width:100%;z-index:10001}.ejs--b183f581b5336c4908ad258d3e1cc7{display:block}.ejs--b183f581b5336cashrqd258d3e1cc7{display:block}.ejs--158ea9dd34e3e7af2d837f8b05babb{display:block}.ejs--3f0897a8158ba363a0ee0afe4da7c5{display:block}.ejs--38cc09882a55e98c76168dbe838aa0{height:100%;margin:0 auto;max-width:800px;overflow:hidden;position:relative;width:100%}.ejs--3f0897a8158ba363a0ee0afe4da7c5 input[type='text']{background-color:#fff;border:1px solid #000;font-size:12px;font-weight:700}.ejs--f3a002bba9836fe4ebfed357a45521 ::-webkit-scrollbar{width:8px;height:16px;background-color:transparent}.ejs--f3a002bba9836fe4ebfed357a45521 ::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3);border-radius:10px;background-color:transparent}.ejs--f3a002bba9836fe4ebfed357a45521 ::-webkit-scrollbar-thumb{border-radius:0;-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3);background-color:#f5f5f5}.ejs--f3a002bba9836fe4ebfed357a45521{scrollbar-face-color:#f5f5f5;scrollbar-highlight-color:transparent;scrollbar-3dlight-color:transparent;scrollbar-darkshadow-color:transparent;scrollbar-Shadow-color:transparent;scrollbar-arrow-color:#fff;scrollbar-track-color:transparent;scrollbar-width:thin;scrollbar-color:transparent #f5f5f5}.ejs--5e71fd80268afbb1d588e40b993508 *{color:#bcbcbc !important;border:unset}.ejs--5e71fd80268afbb1d588e40b993508 a:focus{background:inherit}.ejs--5e71fd80268afbb1d588e40b993508 input,.ejs--5e71fd80268afbb1d588e40b993508 textarea{color:#000 !important}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--b373c9d5029d49324fb8ac3ece96c1{float:none}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--a5e2629abb9a5bcbc8b2c1307922d2{height:calc(100% - 130px);overflow:auto}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--a5e2629abb9a5bcbc8b2c1307922d2 a{border:0}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--580e3c22e63f8a1eb29694fd0b141b{margin-top:10px}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--580e3c22e63f8a1eb29694fd0b141b a{border-radius:.25rem;font-size:.875rem;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.5rem;display:inline-block;background-color:rgba(var(--ejs-primary-color),1);margin:0 10px;color:#fff !important}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--580e3c22e63f8a1eb29694fd0b141b a.ejs--ad20569e1449d7b8e99e6465960456 a.ejs--ad20569e1449d54yiohfg8u8559656{background-color:#929292}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a{opacity:1}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a li{display:inline-block;float:none}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a li.ejs--68d337c212ec6a5bc43125440d422b{border-bottom:1px solid #fff;background-color:#fff}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a li a{padding:2px 5px;color:#bcbcbc !important}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--8e7922427f460a31935084b7acfb1a li.ejs--68d337c212ec6a5bc43125440d422b a{color:#000 !important}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--31eb28817642bb1bfe0a2c422108bb{opacity:1}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--f932566a0af5314da834324c901978{opacity:1}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--f932566a0af5314da834324c901978 div.ejs--c233fb69cbef43078bc39e9d1efac8:hover{background-color:#2d2d2d}.ejs--d169a219343bc32dd4aecc3f6b7f25{opacity:1}.ejs--ad20569e1449d7b8e99e6465960456{float:none}.ejs--ad20569e1449d54yiohfg8u8559656{float:none}.ejs--ad20569e1449d7b8e99e6465963825{float:none}.ejs--ad20569e1449d7b8e99e6468571053{float:none}.ejs--bdb54e9fc47f9805b506b746e897bf{float:none}.ejs--67d03ee7480b871ad6507d6319a839{float:none}.ejs--c2d931157456c1d438d40a2f66af2c{float:none}.ejs--5e71fd80268afbb1d588e40b993508 .ejs--f932566a0af5314da834324c901978 a.ejs--6604c83041a275a78837c452a71dd8,.ejs--99150e15f962c63c689cadc81ef40d{float:none;padding:.1rem .5rem;background-color:rgba(var(--ejs-primary-color),1);color:#fff !important;border-radius:.25rem;cursor:pointer}.ejs--71527b6509aa48afce3ce1a11c02f0{float:none}.ejs--7ad35768e3f6b9faf97db01d5b60ae{float:none}.ejs--9c403e5e107a3e4374ba244b636400{float:none}.ejs--d6a46533fa6e510a571af5c28b440a{float:none}.ejs--d6a46533fa6e510a571af5c28b440a table{font-size:.8rem;padding:0 10px}.ejs--d6a46533fa6e510a571af5c28b440a thead{background-color:rgba(50,50,50,0.66)}.ejs--d6a46533fa6e510a571af5c28b440a tbody tr:hover{background-color:#2d2d2d}.ejs--d6a46533fa6e510a571af5c28b440a tbody td{padding:10px 0}.ejs--d6a46533fa6e510a571af5c28b440a tbody td svg{width:12px;vertical-align:middle}.ejs--d6a46533fa6e510a571af5c28b440a table td:nth-child(2),.ejs--d6a46533fa6e510a571af5c28b440a table td:nth-child(3){text-align:center;width:80px}.ejs--57ca9b3853cc7de731483cfcc95a59{float:none}.ejs--0885d5e25e19127b6b516014426a1b{float:none}.ejs--25023d28756fdb9dfbbfb6dccb8677{float:none}.ejs--75b3a8d35aacc6424ed7422fdeaaaa{float:none}.ejs--eefdf28d69ed2d20f197308981bb61{float:none}.ejs--eefdf28d69ed2d20f197308981bb61 table{font-size:.8rem;padding:0 10px}.ejs--eefdf28d69ed2d20f197308981bb61 thead,.ejs--eefdf28d69ed2d20f197308981bb61 tbody,.ejs--eefdf28d69ed2d20f197308981bb61 tfoot,.ejs--d6a46533fa6e510a571af5c28b440a thead,.ejs--d6a46533fa6e510a571af5c28b440a tbody,.ejs--d6a46533fa6e510a571af5c28b440a tfoot{background:transparent;text-align:left}.ejs--eefdf28d69ed2d20f197308981bb61 tbody tr:hover{background-color:#2d2d2d}.ejs--eefdf28d69ed2d20f197308981bb61 tr td:nth-child(1),.ejs--eefdf28d69ed2d20f197308981bb61 tr td:nth-child(3){width:80px}.ejs--9e670880bb57e824400fa00f09aaad,.ejs--2b4e3c245b7b25dfdac5e09155a68e,.ejs--572b0b3a0345a6b01b01a15a02842c,.ejs--a7d7f80c8999469c991ea452a85dd9{float:none}.ejs--2b4e3c245b7b25dfdac5e09155a68e{max-width:320px;margin:0 auto;text-align:left;width:100%}.ejs--952c974392296e7f643d51db380157{height:100%;overflow:hidden;position:absolute;top:0;width:100%}.ejs--0d7e216cf12ae73705b5d5bb0452fc{float:none}.ejs--c0a5e71f6613caab66d6ae15a5a00f{color:rgba(255,255,255,0.8);font-size:.8rem;padding:5px;text-align:left;text-shadow:1px 1px 1px #000}.ejs--2440e3b831017ff8327c939e2a4413{display:none;position:fixed;bottom:30px;width:100%;position:absolute;bottom:80px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--b8d8b771d0bbb94e2bbd03054f53fd{position:absolute;bottom:250px;width:100%}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--c83d70cb63c933edc073c7fe92e32b{position:absolute;bottom:50px;width:125px;height:125px;left:10px}@media(min-width:480px){.ejs--2440e3b831017ff8327c939e2a4413{bottom:50px}}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--6e7015634623fd6a82e6a7d3488c84{position:absolute;font-size:20px;width:50px;height:50px;text-align:center;line-height:50px;border:1px solid #ccc;border-radius:50%;font-size:30px;font-weight:bold;background-color:rgba(255,255,255,0.15);user-select:none}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--49fa47c86a131e4ca8fb268bfdde89{position:absolute;bottom:10px;height:30px;width:124px;left:50%;margin-left:-62px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--49fa47c86a131e4ca8fb268bfdde89 .ejs--6e7015634623fd6a82e6a7d3488c84{width:60px;height:30px;font-size:12px;font-weight:bolder;border-radius:5px;border:1px solid #ccc;line-height:30px;text-align:center;text-transform:uppercase}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--7d2b19f77fd0ccabf94dc1ca39ae18{position:absolute;bottom:50px;width:130px;height:130px;right:10px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--7d2b19f77fd0ccabf94dc1ca39ae18 .ejs--6e7015634623fd6a82e6a7d3488c84{width:50px;height:50px;text-align:center;line-height:50px;border:1px solid #ccc;border-radius:50%;font-size:30px;font-weight:bold;transition:all .2s}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--6e7015634623fd6a82e6a7d3488c84.ejs--d708d9d486f1eca73a593d5c09f8ad{background-color:#000000ad}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--6e7015634623fd6a82e6a7d3488c84 img{width:100%}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--76fa7567879f97f5991c50ac600735{left:30px}.ejs--82fa3531556f97f5991c50ac600735{left:-35px}.ejs--fbd492618ebsd464fbcd1c9185cd14{left:95px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--fbd499578ebef494fbcd1c9114cd1d{left:40px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--b4c6d9bdbbd3dcfc8fa82689ecf448{left:40px;top:80px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--87c940c15830daa967b08e67e9b87e{left:0;top:40px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--b7c456c7dd7a616a55965bb134323b{left:81px;top:40px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--7930ee9bb7ae2fa6e2f7b5568f1e98,.ejs--2440e3b831017ff8327c939e2a4413 .ejs--2226100d4c5408c2699e942aabb31c{height:31px;text-align:center;border:1px solid #ccc;border-radius:5px;line-height:31px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--7930ee9bb7ae2fa6e2f7b5568f1e98{left:10px}.ejs--2440e3b831017ff8327c939e2a4413 .ejs--2226100d4c5408c2699e942aabb31c{right:10px}.ejs--eefec939452eb92fad035932d0f47c{float:none}.ejs--f1f43b27384834c8c22c6f81d0c5ae{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.6);display:flex;justify-content:center;align-items:center}.ejs--c4ee33766a01ed0356c3ec07898e96{background-color:rgba(0,0,0,0.8);border:1px solid rgba(238,238,238,0.2);padding:30px;min-width:200px;max-width:500px;max-height:100vh;border-radius:4px;overflow-y:auto;box-sizing:border-box}.ejs--a073f32023da1ced805c5f95a4e81c{display:flex;justify-content:space-between;align-items:center}.ejs--ed44f59bb8cd49177586b140658c6c{background-color:transparent;padding:0}.ejs--81470ba5e6a6d68014839ad4d9a977{margin-top:0 !important;margin-bottom:0 !important;font-weight:600 !important;font-size:1.25rem;line-height:1.25 !important;color:rgba(var(--ejs-primary-color),1) !important}.ejs--c3c85789c2a7f56d8b26dba75b7e1f{background:transparent;border:0}.ejs--a073f32023da1ced805c5f95a4e81c .ejs--c3c85789c2a7f56d8b26dba75b7e1f:before{content:"\2715"}.ejs--db44f5520e6f4fd0dd34b478bb9ee8{margin-top:2rem;margin-bottom:2rem;line-height:1.5;color:rgba(0,0,0,0.8);text-align:left}.ejs--db44f5520e6f4fd0dd34b478bb9ee8 input,.ejs--db44f5520e6f4fd0dd34b478bb9ee8 select,.ejs--db44f5520e6f4fd0dd34b478bb9ee8 textarea{font-size:1rem;padding:.4rem;max-width:100%}.ejs--319bcec5dee9444e1a2a53d6503b7c{color:#fff !important;font-size:.875rem;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.5rem;background-color:#929292;color:rgba(0,0,0,0.8);border-radius:.25rem;border-style:none;border-width:0;cursor:pointer;-webkit-appearance:button;text-transform:none;overflow:visible;line-height:1.15;margin:0;will-change:transform;-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-out;transition:transform .25s ease-out;transition:transform .25s ease-out,-webkit-transform .25s ease-out}.ejs--319bcec5dee9444e1a2a53d6503b7c:focus,.ejs--319bcec5dee9444e1a2a53d6503b7c:hover{-webkit-transform:scale(1.05);transform:scale(1.05)}.ejs--eaf3c1cba25d415d92ac48d7db34dd{background-color:rgba(var(--ejs-primary-color),1)}.ejs--940087708c06b6129ce2bfa45f1d89{color:#f00 !important}@keyframes ejs--9d7aa2bd5ee276be085e5b2a0bbc2e{from{opacity:0}to{opacity:1}}@keyframes ejs--184b7558ffeb569c1790654537477b{from{opacity:1}to{opacity:0}}@keyframes ejs--8b069266f76099cc6bc220f6ea56cc{from{transform:translateY(15%)}to{transform:translateY(0)}}@keyframes ejs--379a464ad0e66ea5fc601e5f2fd73e{from{transform:translateY(0)}to{transform:translateY(-10%)}}.ejs--bef295f3125e9ba83d4f3677264bae{display:none}.ejs--bef295f3125e9ba83d4f3677264bae.ejs--60c17e0d149099f207b06f27edae6a{position:absolute;top:0;display:block;height:100%;width:100%}.ejs--bef295f3125e9ba83d4f3677264bae[aria-hidden="false"] .ejs--f1f43b27384834c8c22c6f81d0c5ae{animation:ejs--9d7aa2bd5ee276be085e5b2a0bbc2e .3s cubic-bezier(0,0,0.2,1)}.ejs--bef295f3125e9ba83d4f3677264bae[aria-hidden="false"] .ejs--c4ee33766a01ed0356c3ec07898e96{animation:ejs--8b069266f76099cc6bc220f6ea56cc .3s cubic-bezier(0,0,0.2,1)}.ejs--bef295f3125e9ba83d4f3677264bae[aria-hidden="true"] .ejs--f1f43b27384834c8c22c6f81d0c5ae{animation:ejs--184b7558ffeb569c1790654537477b .3s cubic-bezier(0,0,0.2,1)}.ejs--bef295f3125e9ba83d4f3677264bae[aria-hidden="true"] .ejs--c4ee33766a01ed0356c3ec07898e96{animation:ejs--379a464ad0e66ea5fc601e5f2fd73e .3s cubic-bezier(0,0,0.2,1)}.ejs--bef295f3125e9ba83d4f3677264bae .ejs--c4ee33766a01ed0356c3ec07898e96,.ejs--bef295f3125e9ba83d4f3677264bae .ejs--f1f43b27384834c8c22c6f81d0c5ae{will-change:transform}.ejs--4c3e63d4005bd8a0468e9c74a35f62{padding-left:2.25rem;position:relative;padding:.2em 0;clear:both}.ejs--4c3e63d4005bd8a0468e9c74a35f62:hover{background-color:rgba(0,0,0,0.8)}.ejs--4c3e63d4005bd8a0468e9c74a35f62 input[type=checkbox]{position:absolute;z-index:-1;opacity:0;box-sizing:border-box;width:auto}.ejs--4c3e63d4005bd8a0468e9c74a35f62 label{position:relative;margin-bottom:0;vertical-align:top;word-break:break-word}.ejs--4c3e63d4005bd8a0468e9c74a35f62 label::before{position:absolute;top:.325rem;display:block;height:1rem;content:"";background-color:#fff;border:#adb5bd solid 1px;left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.ejs--4c3e63d4005bd8a0468e9c74a35f62 label::after{position:absolute;display:block;content:"";background-repeat:no-repeat;background-position:center center;top:calc(.325rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}.ejs--4c3e63d4005bd8a0468e9c74a35f62 input:checked+label::before{color:#fff;border-color:rgba(var(--ejs-primary-color),1);background-color:rgba(var(--ejs-primary-color),1)}.ejs--4c3e63d4005bd8a0468e9c74a35f62 input:checked+label::after{background-color:#fff;-webkit-transform:translateX(0.75rem);transform:translateX(0.75rem)}.ejs--90bcdd71cd0d2307e9ee0dffa916da{position:absolute;padding:.1rem .5rem;background-color:rgba(var(--ejs-primary-color),1);color:#fff !important;border-radius:.25rem;cursor:pointer;right:.025rem}.ejs--7a5f920ceffb2913f6dbda780573cf:fullscreen{background:#000;border-radius:0 !important;height:100%;margin:0;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:fullscreen canvas{height:100% !important;max-width:100%;min-width:0;width:auto}.ejs--7a5f920ceffb2913f6dbda780573cf:fullscreen .ejs--057800d021995e1347ec07cb748672{height:100%;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:fullscreen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e{display:block}.ejs--7a5f920ceffb2913f6dbda780573cf:fullscreen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e+svg{display:none}.ejs--7a5f920ceffb2913f6dbda780573cf:-webkit-full-screen{background:#000;border-radius:0 !important;height:100%;margin:0;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-webkit-full-screen canvas{height:100% !important;max-width:100%;min-width:0;width:auto}.ejs--7a5f920ceffb2913f6dbda780573cf:-webkit-full-screen .ejs--057800d021995e1347ec07cb748672{height:100%;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-webkit-full-screen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e{display:block}.ejs--7a5f920ceffb2913f6dbda780573cf:-webkit-full-screen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e+svg{display:none}.ejs--7a5f920ceffb2913f6dbda780573cf:-moz-full-screen{background:#000;border-radius:0 !important;height:100%;margin:0;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-moz-full-screen canvas{height:100% !important;max-width:100%;min-width:0;width:auto}.ejs--7a5f920ceffb2913f6dbda780573cf:-moz-full-screen .ejs--057800d021995e1347ec07cb748672{height:100%;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-moz-full-screen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e{display:block}.ejs--7a5f920ceffb2913f6dbda780573cf:-moz-full-screen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e+svg{display:none}.ejs--7a5f920ceffb2913f6dbda780573cf:-ms-fullscreen{background:#000;border-radius:0 !important;height:100%;margin:0;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-ms-fullscreen canvas{height:100% !important;max-width:100%;min-width:0;width:auto}.ejs--7a5f920ceffb2913f6dbda780573cf:-ms-fullscreen .ejs--057800d021995e1347ec07cb748672{height:100%;width:100%}.ejs--7a5f920ceffb2913f6dbda780573cf:-ms-fullscreen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e{display:block}.ejs--7a5f920ceffb2913f6dbda780573cf:-ms-fullscreen .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e+svg{display:none}.ejs--412041671de21945d3e028b6ae84c9{background:#000;border-radius:0 !important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.ejs--412041671de21945d3e028b6ae84c9 canvas{height:100% !important;max-width:100%;min-width:0;width:auto}.ejs--412041671de21945d3e028b6ae84c9 .ejs--057800d021995e1347ec07cb748672{height:100%;width:100%}.ejs--412041671de21945d3e028b6ae84c9 .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e{display:block}.ejs--412041671de21945d3e028b6ae84c9 .ejs--8732295ca5c4902a060d34706a8146 .ejs--2b3dd6e2e26c0f0dc4ac5779dedd5e+svg{display:none}.ejs--7a5f920ceffb2913f6dbda780573cf.ejs--64f1256f556fb94454b930cb3ea7f2:fullscreen canvas{width:100%;height:auto !important}.ejs--7a5f920ceffb2913f6dbda780573cf.ejs--64f1256f556fb94454b930cb3ea7f2:-webkit-full-screen canvas{width:100%;height:auto !important}.ejs--7a5f920ceffb2913f6dbda780573cf.ejs--64f1256f556fb94454b930cb3ea7f2:-moz-full-screen{width:100%;height:auto !important}.ejs--7a5f920ceffb2913f6dbda780573cf.ejs--64f1256f556fb94454b930cb3ea7f2:-ms-fullscreen{width:100%;height:auto !important}.ejs--33643265135cf89e6c0a0d9866d6f1{transition:none !important}.ejs--6f0e996cd15e5fb6be0256918531d7{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0 !important;height:1px !important;padding:0 !important;position:absolute !important;width:1px !important}.ejs--7a5f920ceffb2913f6dbda780573cf [hidden]{display:none !important}.ejs--914358605501b11476e86626b2ff16{width:120px;height:120px;user-select:none}@media(min-width:480px){.ejs--914358605501b11476e86626b2ff16{width:130px;height:130px}}.ejs--be66239219d594001da38f91c9ad02{opacity:.7}.ejs--be66239219d594001da38f91c9ad02,.ejs--9dbb9be3403878e912527181e2d41b{touch-action:none;position:absolute;top:0;left:0;width:100%;height:100%}.ejs--f9c7797bdf05569bdc13b4f2074270{width:36px;height:100%;transform:translate(-50%,0);position:absolute;left:50%;border-radius:5px;overflow:hidden}.ejs--f9c7797bdf05569bdc13b4f2074270:before{content:"";position:absolute;top:0;left:50%;z-index:1;transform:translate(-50%,0);width:0;height:0;border:8px solid;border-color:transparent transparent #333 transparent}.ejs--f9c7797bdf05569bdc13b4f2074270:after{content:"";position:absolute;bottom:0;left:50%;z-index:1;transform:translate(-50%,0);width:0;height:0;border:8px solid;border-color:#333 transparent transparent transparent}.ejs--f0b89ca5b5621659af184c8e012ccb .ejs--f9c7797bdf05569bdc13b4f2074270:before{border-bottom-color:#fff}.ejs--8de361d6b01eaa181f8db4ac3eb7af .ejs--f9c7797bdf05569bdc13b4f2074270:after{border-top-color:#fff}.ejs--2645f3bad105488a313c5e30dab74f{width:100%;height:36px;transform:translate(0,-50%);position:absolute;left:0;top:50%;border-radius:5px;overflow:hidden}.ejs--2645f3bad105488a313c5e30dab74f:before{content:"";position:absolute;left:0;top:50%;z-index:1;transform:translate(0,-50%);width:0;height:0;border:8px solid;border-color:transparent #333 transparent transparent}.ejs--2645f3bad105488a313c5e30dab74f:after{content:"";position:absolute;right:0;top:50%;z-index:1;transform:translate(0,-50%);width:0;height:0;border:8px solid;border-color:transparent transparent transparent #333}.ejs--bd9311b0a4f654af6ab5ba28bcf358 .ejs--2645f3bad105488a313c5e30dab74f:before{border-right-color:#fff}.ejs--704d45ea060cc6809451a0d9d47ad7 .ejs--2645f3bad105488a313c5e30dab74f:after{border-left-color:#fff}.ejs--a57cf324c8ff108947112e35e589b5,.ejs--4873d94c18140ab195da609b40b71a{position:absolute;width:100%;height:100%;background:#787878} \ No newline at end of file diff --git a/data/emu-main.js b/data/emu-main.js index 170c2cf..350fd4c 100644 --- a/data/emu-main.js +++ b/data/emu-main.js @@ -22,7 +22,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'saveState': 'Save State (Shift + F2)', 'loadState': 'Load State (Shift + F4)', 'screenRecord': 'Start Screen Recording', - //'netplay': 'Netplay', + 'cacheManager': 'Cache Manager', + 'netplay': 'Netplay', 'gamepad': 'Control Settings', 'cheat': 'Cheats', 'menuBack': 'Go back to previous menu', @@ -59,8 +60,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'saveState': '[data-btn="save-state"]', 'loadState': '[data-btn="load-state"]', 'screenRecord': '[data-btn="screen-record"]', + 'cacheManager': '[data-btn="cache-manager"]', 'gamepad': '[data-btn="gamepad"]', - //'netplay': '[data-btn="netplay"]', + 'netplay': '[data-btn="netplay"]', 'cheat': '[data-btn="cheat"]' }, 'inputs': { @@ -168,13 +170,13 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { try { return !_0x555ee8(new URL(_0x17edbf).hostname); } catch (_0x5e6cd2) { - return !0x1; + return false; } }, 'empty': _0x555ee8 }, _0x168698 = function() { - let _0xa88a13 = !0x1; + let _0xa88a13 = false; try { let _0x17edbf = Object.defineProperty({}, 'passive', { 'get': function() { @@ -188,9 +190,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { function _0x1ef215(_0xa482e6, _0x474854, _0xc30d6e) { let _0x57056f = this, - _0x3f468e = arguments.length > 0x3 && void 0x0 !== arguments[0x3] && arguments[0x3], - _0x79ce58 = !(arguments.length > 0x4 && void 0x0 !== arguments[0x4]) || arguments[0x4], - _0x23848b = arguments.length > 0x5 && void 0x0 !== arguments[0x5] && arguments[0x5]; + _0x3f468e = arguments.length > 3 && void 0 !== arguments[3] && arguments[3], + _0x79ce58 = !(arguments.length > 4 && void 0 !== arguments[4]) || arguments[4], + _0x23848b = arguments.length > 5 && void 0 !== arguments[5] && arguments[5]; if (_0xa482e6 && 'addEventListener' in _0xa482e6 && !_0x1e2c68.empty(_0x474854) && _0x1e2c68.function(_0xc30d6e)) { let _0x4a2da0 = _0x474854.split(' '), _0x40de8d = _0x23848b; @@ -203,25 +205,25 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'type': _0x487d3c, 'callback': _0xc30d6e, 'options': _0x40de8d - }), _0xa482e6[_0x3f468e ? 'addEventListener' : 'removeEventListener'](_0x487d3c, _0xc30d6e, _0x40de8d); + }), _0xa482e6[_0x3f468e ? 'addEventListener' : 'removeEventListener'](_0x487d3c, _0xc30d6e); }); } } function _0x1093f4(_0x4d8d94) { - let _0x17edbf = arguments.length > 0x1 && void 0x0 !== arguments[0x1] ? arguments[0x1] : '', - _0x2c1832 = arguments.length > 0x2 ? arguments[0x2] : void 0x0, - _0x4adcdf = !(arguments.length > 0x3 && void 0x0 !== arguments[0x3]) || arguments[0x3], - _0x2f85bc = arguments.length > 0x4 && void 0x0 !== arguments[0x4] && arguments[0x4]; + let _0x17edbf = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : '', + _0x2c1832 = arguments.length > 2 ? arguments[2] : undefined, + _0x4adcdf = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], + _0x2f85bc = arguments.length > 4 && void 0 !== arguments[4] && arguments[4]; _0x1ef215.call(this, _0x4d8d94, _0x17edbf, _0x2c1832, true, _0x4adcdf, _0x2f85bc); } function _0x20109b(_0x550b1a) { - let _0x17edbf = arguments.length > 0x1 && void 0x0 !== arguments[0x1] ? arguments[0x1] : '', - _0x2c1832 = arguments.length > 0x2 ? arguments[0x2] : void 0x0, - _0x5e10a2 = !(arguments.length > 0x3 && void 0x0 !== arguments[0x3]) || arguments[0x3], - _0x5c9512 = arguments.length > 0x4 && void 0x0 !== arguments[0x4] && arguments[0x4]; - _0x1ef215.call(this, _0x550b1a, _0x17edbf, _0x2c1832, !0x1, _0x5e10a2, _0x5c9512); + let _0x17edbf = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : '', + _0x2c1832 = arguments.length > 2 ? arguments[2] : undefined, + _0x5e10a2 = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], + _0x5c9512 = arguments.length > 4 && void 0 !== arguments[4] && arguments[4]; + _0x1ef215.call(this, _0x550b1a, _0x17edbf, _0x2c1832, false, _0x5e10a2, _0x5c9512); } function _0x455c85(_0x4e4b15) { @@ -234,15 +236,15 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x20109b(_0x4e4b15, _0x17edbf, _0x5127f4, _0x2b8c91, _0x23e991); let _0x1fe440 = arguments.length, _0x1d3219 = new Array(_0x1fe440); - for (let _0x54457c = 0x0; _0x54457c < _0x1fe440; _0x54457c++) _0x1d3219[_0x54457c] = arguments[_0x54457c]; + for (let _0x54457c = 0; _0x54457c < _0x1fe440; _0x54457c++) _0x1d3219[_0x54457c] = arguments[_0x54457c]; _0x2c1832.apply(this, _0x1d3219); }, true, _0x2b8c91, _0x23e991); } function _0xbae705(_0x975ccc) { - let _0x17edbf = arguments.length > 0x1 && void 0x0 !== arguments[0x1] ? arguments[0x1] : '', - _0x2c1832 = arguments.length > 0x2 && void 0x0 !== arguments[0x2] && arguments[0x2], - _0x57297b = arguments.length > 0x3 && void 0x0 !== arguments[0x3] ? arguments[0x3] : {}; + let _0x17edbf = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : '', + _0x2c1832 = arguments.length > 2 && void 0 !== arguments[2] && arguments[2], + _0x57297b = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}; if (_0x1e2c68.element(_0x975ccc) && !_0x1e2c68.empty(_0x17edbf)) { let _0x4f631e = new CustomEvent(_0x17edbf, { 'bubbles': _0x2c1832, @@ -262,8 +264,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }(_0x3ed035) || function(_0x2bb2ab, _0x4993ee) { let _0x2c1832 = [], _0x629f39 = true, - _0xde5653 = !0x1, - _0x346a0d = void 0x0; + _0xde5653 = false, + _0x346a0d = undefined; try { for (let _0x57d79d, _0x557ef0 = _0x2bb2ab[Symbol.iterator](); !(_0x629f39 = (_0x57d79d = _0x557ef0.next()).done) && (_0x2c1832.push(_0x57d79d.value), !_0x4993ee || _0x2c1832.length !== _0x4993ee); _0x629f39 = true); } catch (_0x54a546) { @@ -284,7 +286,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { function _0x580edd(_0x39eb34, _0x86c3db) { let _0x2c1832 = _0x39eb34.length ? _0x39eb34 : [_0x39eb34]; Array.from(_0x2c1832).reverse().forEach(function(_0x35fc48, _0x79e6bf) { - let _0x1510e4 = _0x79e6bf > 0x0 ? _0x86c3db.cloneNode(true) : _0x86c3db, + let _0x1510e4 = _0x79e6bf > 0 ? _0x86c3db.cloneNode(true) : _0x86c3db, _0x247f26 = _0x35fc48.parentNode, _0x3a5422 = _0x35fc48.nextSibling; _0x1510e4.appendChild(_0x35fc48), _0x3a5422 ? _0x247f26.insertBefore(_0x1510e4, _0x3a5422) : _0x247f26.appendChild(_0x1510e4); @@ -293,12 +295,12 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { function _0x154f99(_0x5e4eb3, _0x1acdad) { _0x1e2c68.element(_0x5e4eb3) && !_0x1e2c68.empty(_0x1acdad) && Object.entries(_0x1acdad).filter(function(_0x37e04b) { - let _0x1acdad = _0x30f85e(_0x37e04b, 0x2)[0x1]; + let _0x1acdad = _0x30f85e(_0x37e04b, 2)[1]; return !_0x1e2c68.nullOrUndefined(_0x1acdad); }).forEach(function(_0x4993dd) { - let _0x2c1832 = _0x30f85e(_0x4993dd, 0x2), - _0x24704f = _0x2c1832[0x0], - _0x52ac21 = _0x2c1832[0x1]; + let _0x2c1832 = _0x30f85e(_0x4993dd, 2), + _0x24704f = _0x2c1832[0], + _0x52ac21 = _0x2c1832[1]; return _0x5e4eb3.setAttribute(_0x24704f, _0x52ac21); }); } @@ -320,9 +322,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x215e7f = _0x2b6c5b.trim(), _0x2b2f76 = _0x215e7f.replace('.', ''), _0x499377 = _0x215e7f.replace(/[[\]]/g, '').split('='), - _0x1db3b8 = _0x499377[0x0], - _0x520bcf = _0x499377.length > 0x1 ? _0x499377[0x1].replace(/["']/g, '') : ''; - switch (_0x215e7f.charAt(0x0)) { + _0x1db3b8 = _0x499377[0], + _0x520bcf = _0x499377.length > 1 ? _0x499377[1].replace(/["']/g, '') : ''; + switch (_0x215e7f.charAt(0)) { case '.': _0x1e2c68.object(_0x3ab896) && _0x1e2c68.string(_0x3ab896.class) && (_0x3ab896.class += ' ' .concat(_0x2b2f76)), _0x2c1832.class = _0x2b2f76; break; @@ -348,9 +350,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }); if (_0x1e2c68.element(_0x2bf197)) { let _0x34f25e = 'toggle'; - return void 0x0 !== _0x3b6b0b && (_0x34f25e = _0x3b6b0b ? 'add' : 'remove'), _0x2bf197.classList[_0x34f25e](_0x46e2bb), _0x2bf197.classList.contains(_0x46e2bb); + return void 0 !== _0x3b6b0b && (_0x34f25e = _0x3b6b0b ? 'add' : 'remove'), _0x2bf197.classList[_0x34f25e](_0x46e2bb), _0x2bf197.classList.contains(_0x46e2bb); } - return !0x1; + return false; } function _0x350d73(_0x273517, _0x36ffc8) { @@ -375,28 +377,28 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } function _0x5e0c7d() { - let _0xa88a13 = arguments.length > 0x0 && void 0x0 !== arguments[0x0] ? arguments[0x0] : null, - _0x17edbf = arguments.length > 0x1 && void 0x0 !== arguments[0x1] && arguments[0x1]; + let _0xa88a13 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, + _0x17edbf = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; if (_0x1e2c68.element(_0xa88a13)) { let _0x2c1832 = _0x23ffa1.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]'), - _0x1c6631 = _0x2c1832[0x0], - _0x52c9df = _0x2c1832[_0x2c1832.length - 0x1]; + _0x1c6631 = _0x2c1832[0], + _0x52c9df = _0x2c1832[_0x2c1832.length - 1]; _0x1ef215.call(this, this.elements.container, 'keydown', function(_0x1bba02) { if ('Tab' === _0x1bba02.key && 0x9 === _0x1bba02.keyCode) { let _0x17edbf = document.activeElement; _0x17edbf !== _0x52c9df || _0x1bba02.shiftKey ? _0x17edbf === _0x1c6631 && _0x1bba02.shiftKey && (_0x52c9df.focus(), _0x1bba02.preventDefault()) : (_0x1c6631.focus(), _0x1bba02.preventDefault()); } - }, _0x17edbf, !0x1); + }, _0x17edbf, false); } } function _0x31cc23() { - let _0xa88a13 = arguments.length > 0x0 && void 0x0 !== arguments[0x0] ? arguments[0x0] : null, - _0x17edbf = arguments.length > 0x1 && void 0x0 !== arguments[0x1] && arguments[0x1]; + let _0xa88a13 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, + _0x17edbf = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; _0x1e2c68.element(_0xa88a13) && (_0xa88a13.focus(), _0x17edbf && _0x3a8e2f(_0xa88a13, this.config.classNames.tabFocus)); } - function _0x449eac(_0x589e98) { + function getClass(_0x589e98) { return _0x48e5ff.a.bind(_0x42870c.a)(_0x589e98); } let _0x32d193, _0x5f365a, _0x820caf, _0x5a2767 = (_0x32d193 = document.createElement('span'), _0x5f365a = { @@ -405,18 +407,18 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'OTransition': 'oTransitionEnd otransitionend', 'transition': 'transitionend' }, _0x820caf = Object.keys(_0x5f365a).find(function(_0x5bdb45) { - return void 0x0 !== _0x32d193.style[_0x5bdb45]; + return void 0 !== _0x32d193.style[_0x5bdb45]; }), !!_0x1e2c68.string(_0x820caf) && _0x5f365a[_0x820caf]); function _0x2b30e0(_0x1fb76b) { setTimeout(function() { try { - _0x132da7(_0x1fb76b, true), _0x1fb76b.offsetHeight, _0x132da7(_0x1fb76b, !0x1); + _0x132da7(_0x1fb76b, true), _0x1fb76b.offsetHeight, _0x132da7(_0x1fb76b, false); } catch (_0x517747) {} - }, 0x0); + }, 0); } let _0x296fa9, _0x59aa33 = { - 'isEdge': 'Netscape' === navigator.appName && navigator.appVersion.indexOf('Edge') > -0x1, + 'isEdge': 'Netscape' === navigator.appName && navigator.appVersion.indexOf('Edge') > -1, 'isIE': !!document.documentMode, 'isWebkit': 'WebkitAppearance' in document.documentElement.style && !/Edge/ .test(navigator.userAgent), 'isIPhone': /(iPhone|iPod)/gi .test(navigator.platform), @@ -424,24 +426,24 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'info': function() { let _0xa88a13 = /(MSIE|(?!Gecko.+)Firefox|(?!AppleWebKit.+Chrome.+)Safari|(?!AppleWebKit.+)Chrome|AppleWebKit(?!.+Chrome|.+Safari)|Gecko(?!.+Firefox))(?: |\/)([\d\.apre]+)/ .exec(navigator.userAgent); return { - 'name': _0xa88a13[0x1].toLowerCase(), - 'version': _0xa88a13[0x2] + 'name': _0xa88a13[1].toLowerCase(), + 'version': _0xa88a13[2] }; } }, _0x2d904a = { 'rangeInput': (_0x296fa9 = document.createElement('input'), _0x296fa9.type = 'range', 'range' === _0x296fa9.type), 'touch': 'ontouchstart' in document.documentElement, - 'transitions': !0x1 !== _0x5a2767, + 'transitions': false !== _0x5a2767, 'reducedMotion': 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches, 'webgl': function() { let _0xa88a13 = { - 'DETECTED': !0x1 + 'DETECTED': false }; if (!_0xa88a13.DETECTED) { let _0x17edbf = document.createElement('canvas'); if (_0x17edbf && _0x17edbf.getContext) - for (let _0x2c1832 = ['webgl2', 'experimental-webgl2', 'webgl', 'experimental-webgl'], _0x44cd27 = 0x0, _0x12b7b8 = _0x2c1832.length; _0x44cd27 < _0x12b7b8; ++_0x44cd27) { + for (let _0x2c1832 = ['webgl2', 'experimental-webgl2', 'webgl', 'experimental-webgl'], _0x44cd27 = 0, _0x12b7b8 = _0x2c1832.length; _0x44cd27 < _0x12b7b8; ++_0x44cd27) { let _0x11cb40 = _0x2c1832[_0x44cd27], _0x26b3b2 = _0x17edbf.getContext(_0x11cb40); if (_0x26b3b2) { @@ -474,33 +476,33 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } function _0x5dc0c0() { - let _0xa88a13 = arguments.length > 0x0 && void 0x0 !== arguments[0x0] ? arguments[0x0] : {}, - _0x2c1832 = new Array(_0x17edbf > 0x1 ? _0x17edbf - 0x1 : 0x0); - for (let _0x17edbf = arguments.length, _0x189546 = 0x1; _0x189546 < _0x17edbf; _0x189546++) _0x2c1832[_0x189546 - 0x1] = arguments[_0x189546]; + let _0xa88a13 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, + _0x2c1832 = new Array(_0x17edbf > 1 ? _0x17edbf - 1 : 0); + for (let _0x17edbf = arguments.length, _0x189546 = 1; _0x189546 < _0x17edbf; _0x189546++) _0x2c1832[_0x189546 - 1] = arguments[_0x189546]; if (!_0x2c1832.length) return _0xa88a13; let _0x279e54 = _0x2c1832.shift(); return _0x1e2c68.object(_0x279e54) ? (Object.keys(_0x279e54).forEach(function(_0x53b45a) { _0x1e2c68.object(_0x279e54[_0x53b45a]) ? (Object.keys(_0xa88a13).includes(_0x53b45a) || Object.assign(_0xa88a13, _0x55cbbe({}, _0x53b45a, {})), _0x5dc0c0(_0xa88a13[_0x53b45a], _0x279e54[_0x53b45a])) : Object.assign(_0xa88a13, _0x55cbbe({}, _0x53b45a, _0x279e54[_0x53b45a])); - }), _0x5dc0c0.apply(void 0x0, [_0xa88a13].concat(_0x2c1832))) : _0xa88a13; + }), _0x5dc0c0.apply(undefined, [_0xa88a13].concat(_0x2c1832))) : _0xa88a13; } function _0x1a0e98() { - let _0xa88a13 = arguments.length > 0x0 && void 0x0 !== arguments[0x0] ? arguments[0x0] : '', - _0x17edbf = arguments.length > 0x1 && void 0x0 !== arguments[0x1] ? arguments[0x1] : '', - _0x2c1832 = arguments.length > 0x2 && void 0x0 !== arguments[0x2] ? arguments[0x2] : ''; + let _0xa88a13 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : '', + _0x17edbf = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : '', + _0x2c1832 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : ''; return _0xa88a13.replace(new RegExp(_0x17edbf.toString().replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\x5c$1'), 'g'), _0x2c1832.toString()); } function _0x9fdcea() { - let _0xa88a13 = (arguments.length > 0x0 && void 0x0 !== arguments[0x0] ? arguments[0x0] : '').toString(); + let _0xa88a13 = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : '').toString(); return (_0xa88a13 = function() { - let _0xa88a13 = (arguments.length > 0x0 && void 0x0 !== arguments[0x0] ? arguments[0x0] : '').toString(); + let _0xa88a13 = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : '').toString(); return _0xa88a13 = _0x1a0e98(_0xa88a13, '-', ' '), _0xa88a13 = _0x1a0e98(_0xa88a13, '_', ' '), _0x1a0e98(_0xa88a13 = function() { - return (arguments.length > 0x0 && void 0x0 !== arguments[0x0] ? arguments[0x0] : '').toString().replace(/\w\S*/g, function(_0x5b5cba) { - return _0x5b5cba.charAt(0x0).toUpperCase() + _0x5b5cba.substr(0x1).toLowerCase(); + return (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : '').toString().replace(/\w\S*/g, function(_0x5b5cba) { + return _0x5b5cba.charAt(0).toUpperCase() + _0x5b5cba.substr(1).toLowerCase(); }); }(_0xa88a13), ' ', ''); - }(_0xa88a13)).charAt(0x0).toLowerCase() + _0xa88a13.slice(0x1); + }(_0xa88a13)).charAt(0).toLowerCase() + _0xa88a13.slice(1); } function _0x419e30(_0x3614ce, _0x5196ee) { @@ -509,8 +511,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }(_0x3614ce) || function(_0x20a132, _0x481bd0) { let _0x2c1832 = [], _0x930e75 = true, - _0x40863e = !0x1, - _0xf7a5cf = void 0x0; + _0x40863e = false, + _0xf7a5cf = undefined; try { for (let _0x9d4c5a, _0x2f59ed = _0x20a132[Symbol.iterator](); !(_0x930e75 = (_0x9d4c5a = _0x2f59ed.next()).done) && (_0x2c1832.push(_0x9d4c5a.value), !_0x481bd0 || _0x2c1832.length !== _0x481bd0); _0x930e75 = true); } catch (_0x383181) { @@ -529,8 +531,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } let _0xb9b2ff = { 'get': function() { - let _0xa88a13 = arguments.length > 0x0 && void 0x0 !== arguments[0x0] ? arguments[0x0] : '', - _0x17edbf = arguments.length > 0x1 && void 0x0 !== arguments[0x1] ? arguments[0x1] : {}; + let _0xa88a13 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : '', + _0x17edbf = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (_0x1e2c68.empty(_0xa88a13) || _0x1e2c68.empty(_0x17edbf)) return ''; let _0x2c1832 = _0x344e81(_0x17edbf.i18n, _0xa88a13); if (_0x1e2c68.empty(_0x2c1832)) return ''; @@ -539,18 +541,18 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { '{title}': _0x17edbf.title }; return Object.entries(_0x54bf45).forEach(function(_0x34ee43) { - let _0x17edbf = _0x419e30(_0x34ee43, 0x2), - _0x473ebb = _0x17edbf[0x0], - _0x56ec0 = _0x17edbf[0x1]; + let _0x17edbf = _0x419e30(_0x34ee43, 2), + _0x473ebb = _0x17edbf[0], + _0x56ec0 = _0x17edbf[1]; _0x2c1832 = _0x1a0e98(_0x2c1832, _0x473ebb, _0x56ec0); }), _0x2c1832; } }; function _0x4c97b0(_0xb3d5fd, _0x2cda5d) { - for (let _0x2c1832 = 0x0; _0x2c1832 < _0x2cda5d.length; _0x2c1832++) { + for (let _0x2c1832 = 0; _0x2c1832 < _0x2cda5d.length; _0x2c1832++) { let _0x3f3944 = _0x2cda5d[_0x2c1832]; - _0x3f3944.enumerable = _0x3f3944.enumerable || !0x1, _0x3f3944.configurable = true, 'value' in _0x3f3944 && (_0x3f3944.writable = true), Object.defineProperty(_0xb3d5fd, _0x3f3944.key, _0x3f3944); + _0x3f3944.enumerable = _0x3f3944.enumerable || false, _0x3f3944.configurable = true, 'value' in _0x3f3944 && (_0x3f3944.writable = true), Object.defineProperty(_0xb3d5fd, _0x3f3944.key, _0x3f3944); } } let _0x2f61ba = function() { @@ -566,7 +568,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { try { return 'localStorage' in window && (window.localStorage.getItem('___test') || window.localStorage.setItem('___test', '___test'), true); } catch (_0x42cafd) { - return !0x1; + return false; } } }], (_0x2c1832 = [{ @@ -617,15 +619,15 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'toggleControls': function(_0x4dbb7a) { let _0x17edbf = this.elements.controls; if (_0x17edbf) { - let _0x2c1832 = 0x0, - _0x4b4cd5 = _0x23ffa1.call(this, '.' .concat(_0x449eac({ + let _0x2c1832 = 0, + _0x4b4cd5 = _0x23ffa1.call(this, '.' .concat(getClass({ 'ejs__dialogs': true - }), ' > .').concat(_0x449eac({ + }), ' > .').concat(getClass({ 'ejs__dialog': true }))); Array.from(_0x4b4cd5).forEach(function(_0x208a40, _0xd7fcf0) { - true !== _0x208a40.hidden && (_0x2c1832 += 0x1); - }), _0x2c1832 > 0x0 ? this.toggleControls(!0x1) : this.toggleControls(Boolean(_0x4dbb7a || this.paused || _0x17edbf.pressed || _0x17edbf.hover)); + true !== _0x208a40.hidden && (_0x2c1832 += 1); + }), _0x2c1832 > 0 ? this.toggleControls(false) : this.toggleControls(Boolean(_0x4dbb7a || this.paused || _0x17edbf.pressed || _0x17edbf.hover)); } } }; @@ -639,16 +641,16 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } function _0x3189ba(_0x4380c5, _0x3c0d58) { - if ('object' === _0x5272a8(_0x4380c5) && _0x4380c5.files && (_0x4380c5 = _0x4380c5.files[0x0]), this.littleEndian = !0x1, this.offset = 0x0, this._lastRead = null, 'object' === _0x5272a8(_0x4380c5) && _0x4380c5.name && _0x4380c5.size) { + if ('object' === _0x5272a8(_0x4380c5) && _0x4380c5.files && (_0x4380c5 = _0x4380c5.files[0]), this.littleEndian = false, this.offset = 0, this._lastRead = null, 'object' === _0x5272a8(_0x4380c5) && _0x4380c5.name && _0x4380c5.size) { if ('function' != typeof window.FileReader) throw new Error('Incompatible Browser'); this.fileName = _0x4380c5.name, this.fileType = _0x4380c5.type, this.fileSize = _0x4380c5.size, this._fileReader = new FileReader(), this._fileReader.marcFile = this, this._fileReader.addEventListener('load', function() { this.marcFile._u8array = new Uint8Array(this.result), this.marcFile._dataView = new DataView(this.result), _0x3c0d58 && _0x3c0d58.call(); - }, !0x1), this._fileReader.readAsArrayBuffer(_0x4380c5); + }, false), this._fileReader.readAsArrayBuffer(_0x4380c5); } else if ('object' === _0x5272a8(_0x4380c5) && 'string' == typeof _0x4380c5.fileName && 'boolean' == typeof _0x4380c5.littleEndian) { this.fileName = _0x4380c5.fileName, this.fileType = _0x4380c5.fileType, this.fileSize = _0x4380c5.fileSize; let _0x2c1832 = new ArrayBuffer(_0x4380c5); - this._u8array = new Uint8Array(this.fileType), this._dataView = new DataView(this.fileType), _0x4380c5.copyToFile(this, 0x0), _0x3c0d58 && _0x3c0d58.call(); - } else if ('object' === _0x5272a8(_0x4380c5) && 'number' == typeof _0x4380c5.byteLength) this.fileName = 'file.bin', this.fileType = 'application/octet-stream', this.fileSize = _0x4380c5.byteLength, void 0x0 !== _0x4380c5.buffer && (_0x4380c5 = _0x4380c5.buffer), this._u8array = new Uint8Array(_0x4380c5), this._dataView = new DataView(_0x4380c5), _0x3c0d58 && _0x3c0d58.call(); + this._u8array = new Uint8Array(this.fileType), this._dataView = new DataView(this.fileType), _0x4380c5.copyToFile(this, 0), _0x3c0d58 && _0x3c0d58.call(); + } else if ('object' === _0x5272a8(_0x4380c5) && 'number' == typeof _0x4380c5.byteLength) this.fileName = 'file.bin', this.fileType = 'application/octet-stream', this.fileSize = _0x4380c5.byteLength, void 0 !== _0x4380c5.buffer && (_0x4380c5 = _0x4380c5.buffer), this._u8array = new Uint8Array(_0x4380c5), this._dataView = new DataView(_0x4380c5), _0x3c0d58 && _0x3c0d58.call(); else { if ('number' != typeof _0x4380c5) throw new Error('Invalid source'); this.fileName = 'file.bin', this.fileType = 'application/octet-stream', this.fileSize = _0x4380c5; @@ -656,7 +658,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { this._u8array = new Uint8Array(_0x2c1832), this._dataView = new DataView(_0x2c1832), _0x3c0d58 && _0x3c0d58.call(); } } - _0x3189ba.IS_MACHINE_LITTLE_ENDIAN = (_0x13fb79 = new ArrayBuffer(0x2), new DataView(_0x13fb79).setInt16(0x0, 0x100, true), 0x100 === new Int16Array(_0x13fb79)[0x0]), _0x3189ba.prototype.seek = function(_0x13e235) { + _0x3189ba.IS_MACHINE_LITTLE_ENDIAN = (_0x13fb79 = new ArrayBuffer(2), new DataView(_0x13fb79).setInt16(0, 0x100, true), 0x100 === new Int16Array(_0x13fb79)[0]), _0x3189ba.prototype.seek = function(_0x13e235) { this.offset = _0x13e235; }, _0x3189ba.prototype.skip = function(_0xfa033c) { this.offset += _0xfa033c; @@ -664,10 +666,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { return !(this.offset < this.fileSize); }, _0x3189ba.prototype.slice = function(_0x2bfcbb, _0x8026e) { let _0x2c1832; - return _0x8026e = _0x8026e || this.fileSize - _0x2bfcbb, void 0x0 !== this._u8array.buffer.slice ? ((_0x2c1832 = new _0x3189ba(0x0)).fileSize = _0x8026e, _0x2c1832._u8array = new Uint8Array(this._u8array.buffer.slice(_0x2bfcbb, _0x2bfcbb + _0x8026e))) : (_0x2c1832 = new _0x3189ba(_0x8026e), this.copyToFile(_0x2c1832, _0x2bfcbb, _0x8026e, 0x0)), _0x2c1832.fileName = this.fileName, _0x2c1832.fileType = this.fileType, _0x2c1832.littleEndian = this.littleEndian, _0x2c1832; + return _0x8026e = _0x8026e || this.fileSize - _0x2bfcbb, void 0 !== this._u8array.buffer.slice ? ((_0x2c1832 = new _0x3189ba(0)).fileSize = _0x8026e, _0x2c1832._u8array = new Uint8Array(this._u8array.buffer.slice(_0x2bfcbb, _0x2bfcbb + _0x8026e))) : (_0x2c1832 = new _0x3189ba(_0x8026e), this.copyToFile(_0x2c1832, _0x2bfcbb, _0x8026e, 0)), _0x2c1832.fileName = this.fileName, _0x2c1832.fileType = this.fileType, _0x2c1832.littleEndian = this.littleEndian, _0x2c1832; }, _0x3189ba.prototype.copyToFile = function(_0x51f9b5, _0x1ada3e, _0x3997cd, _0x38ae1a) { - void 0x0 === _0x38ae1a && (_0x38ae1a = _0x1ada3e), _0x3997cd = _0x3997cd || this.fileSize - _0x1ada3e; - for (let _0x3bc3d8 = 0x0; _0x3bc3d8 < _0x3997cd; _0x3bc3d8++) _0x51f9b5._u8array[_0x38ae1a + _0x3bc3d8] = this._u8array[_0x1ada3e + _0x3bc3d8]; + void 0 === _0x38ae1a && (_0x38ae1a = _0x1ada3e), _0x3997cd = _0x3997cd || this.fileSize - _0x1ada3e; + for (let _0x3bc3d8 = 0; _0x3bc3d8 < _0x3997cd; _0x3bc3d8++) _0x51f9b5._u8array[_0x38ae1a + _0x3bc3d8] = this._u8array[_0x1ada3e + _0x3bc3d8]; }, _0x3189ba.prototype.save = function() { let _0xa88a13; try { @@ -683,50 +685,50 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, _0x3189ba.prototype.readU8 = function() { return this._lastRead = this._u8array[this.offset], this.offset++, this._lastRead; }, _0x3189ba.prototype.readU16 = function() { - return this.littleEndian ? this._lastRead = this._u8array[this.offset] + (this._u8array[this.offset + 0x1] << 0x8) : this._lastRead = (this._u8array[this.offset] << 0x8) + this._u8array[this.offset + 0x1], this.offset += 0x2, this._lastRead >>> 0x0; + return this.littleEndian ? this._lastRead = this._u8array[this.offset] + (this._u8array[this.offset + 1] << 0x8) : this._lastRead = (this._u8array[this.offset] << 0x8) + this._u8array[this.offset + 1], this.offset += 2, this._lastRead >>> 0; }, _0x3189ba.prototype.readU24 = function() { - return this.littleEndian ? this._lastRead = this._u8array[this.offset] + (this._u8array[this.offset + 0x1] << 0x8) + (this._u8array[this.offset + 0x2] << 0x10) : this._lastRead = (this._u8array[this.offset] << 0x10) + (this._u8array[this.offset + 0x1] << 0x8) + this._u8array[this.offset + 0x2], this.offset += 0x3, this._lastRead >>> 0x0; + return this.littleEndian ? this._lastRead = this._u8array[this.offset] + (this._u8array[this.offset + 1] << 0x8) + (this._u8array[this.offset + 2] << 0x10) : this._lastRead = (this._u8array[this.offset] << 0x10) + (this._u8array[this.offset + 1] << 0x8) + this._u8array[this.offset + 2], this.offset += 3, this._lastRead >>> 0; }, _0x3189ba.prototype.readU32 = function() { - return this.littleEndian ? this._lastRead = this._u8array[this.offset] + (this._u8array[this.offset + 0x1] << 0x8) + (this._u8array[this.offset + 0x2] << 0x10) + (this._u8array[this.offset + 0x3] << 0x18) : this._lastRead = (this._u8array[this.offset] << 0x18) + (this._u8array[this.offset + 0x1] << 0x10) + (this._u8array[this.offset + 0x2] << 0x8) + this._u8array[this.offset + 0x3], this.offset += 0x4, this._lastRead >>> 0x0; + return this.littleEndian ? this._lastRead = this._u8array[this.offset] + (this._u8array[this.offset + 1] << 0x8) + (this._u8array[this.offset + 2] << 0x10) + (this._u8array[this.offset + 3] << 0x18) : this._lastRead = (this._u8array[this.offset] << 0x18) + (this._u8array[this.offset + 1] << 0x10) + (this._u8array[this.offset + 2] << 0x8) + this._u8array[this.offset + 3], this.offset += 4, this._lastRead >>> 0; }, _0x3189ba.prototype.readBytes = function(_0x455cfd) { this._lastRead = new Array(_0x455cfd); - for (let _0x17edbf = 0x0; _0x17edbf < _0x455cfd; _0x17edbf++) this._lastRead[_0x17edbf] = this._u8array[this.offset + _0x17edbf]; + for (let _0x17edbf = 0; _0x17edbf < _0x455cfd; _0x17edbf++) this._lastRead[_0x17edbf] = this._u8array[this.offset + _0x17edbf]; return this.offset += _0x455cfd, this._lastRead; }, _0x3189ba.prototype.readString = function(_0x4fe914) { this._lastRead = ''; - for (let _0x17edbf = 0x0; _0x17edbf < _0x4fe914 && this.offset + _0x17edbf < this.fileSize && this._u8array[this.offset + _0x17edbf] > 0x0; _0x17edbf++) this._lastRead = this._lastRead + String.fromCharCode(this._u8array[this.offset + _0x17edbf]); + for (let _0x17edbf = 0; _0x17edbf < _0x4fe914 && this.offset + _0x17edbf < this.fileSize && this._u8array[this.offset + _0x17edbf] > 0; _0x17edbf++) this._lastRead = this._lastRead + String.fromCharCode(this._u8array[this.offset + _0x17edbf]); return this.offset += _0x4fe914, this._lastRead; }, _0x3189ba.prototype.writeU8 = function(_0x276206) { this._u8array[this.offset] = _0x276206, this.offset++; }, _0x3189ba.prototype.writeU16 = function(_0x1bfd8f) { - this.littleEndian ? (this._u8array[this.offset] = 0xff & _0x1bfd8f, this._u8array[this.offset + 0x1] = _0x1bfd8f >> 0x8) : (this._u8array[this.offset] = _0x1bfd8f >> 0x8, this._u8array[this.offset + 0x1] = 0xff & _0x1bfd8f), this.offset += 0x2; + this.littleEndian ? (this._u8array[this.offset] = 0xff & _0x1bfd8f, this._u8array[this.offset + 1] = _0x1bfd8f >> 0x8) : (this._u8array[this.offset] = _0x1bfd8f >> 0x8, this._u8array[this.offset + 1] = 0xff & _0x1bfd8f), this.offset += 2; }, _0x3189ba.prototype.writeU24 = function(_0x3d6067) { - this.littleEndian ? (this._u8array[this.offset] = 0xff & _0x3d6067, this._u8array[this.offset + 0x1] = (0xff00 & _0x3d6067) >> 0x8, this._u8array[this.offset + 0x2] = (0xff0000 & _0x3d6067) >> 0x10) : (this._u8array[this.offset] = (0xff0000 & _0x3d6067) >> 0x10, this._u8array[this.offset + 0x1] = (0xff00 & _0x3d6067) >> 0x8, this._u8array[this.offset + 0x2] = 0xff & _0x3d6067), this.offset += 0x3; + this.littleEndian ? (this._u8array[this.offset] = 0xff & _0x3d6067, this._u8array[this.offset + 1] = (0xff00 & _0x3d6067) >> 0x8, this._u8array[this.offset + 2] = (0xff0000 & _0x3d6067) >> 0x10) : (this._u8array[this.offset] = (0xff0000 & _0x3d6067) >> 0x10, this._u8array[this.offset + 1] = (0xff00 & _0x3d6067) >> 0x8, this._u8array[this.offset + 2] = 0xff & _0x3d6067), this.offset += 3; }, _0x3189ba.prototype.writeU32 = function(_0xa4dd26) { - this.littleEndian ? (this._u8array[this.offset] = 0xff & _0xa4dd26, this._u8array[this.offset + 0x1] = (0xff00 & _0xa4dd26) >> 0x8, this._u8array[this.offset + 0x2] = (0xff0000 & _0xa4dd26) >> 0x10, this._u8array[this.offset + 0x3] = (0xff000000 & _0xa4dd26) >> 0x18) : (this._u8array[this.offset] = (0xff000000 & _0xa4dd26) >> 0x18, this._u8array[this.offset + 0x1] = (0xff0000 & _0xa4dd26) >> 0x10, this._u8array[this.offset + 0x2] = (0xff00 & _0xa4dd26) >> 0x8, this._u8array[this.offset + 0x3] = 0xff & _0xa4dd26), this.offset += 0x4; + this.littleEndian ? (this._u8array[this.offset] = 0xff & _0xa4dd26, this._u8array[this.offset + 1] = (0xff00 & _0xa4dd26) >> 0x8, this._u8array[this.offset + 2] = (0xff0000 & _0xa4dd26) >> 0x10, this._u8array[this.offset + 3] = (0xff000000 & _0xa4dd26) >> 0x18) : (this._u8array[this.offset] = (0xff000000 & _0xa4dd26) >> 0x18, this._u8array[this.offset + 1] = (0xff0000 & _0xa4dd26) >> 0x10, this._u8array[this.offset + 2] = (0xff00 & _0xa4dd26) >> 0x8, this._u8array[this.offset + 3] = 0xff & _0xa4dd26), this.offset += 0x4; }, _0x3189ba.prototype.writeBytes = function(_0x5ad6b9) { - for (let _0x17edbf = 0x0; _0x17edbf < _0x5ad6b9.length; _0x17edbf++) this._u8array[this.offset + _0x17edbf] = _0x5ad6b9[_0x17edbf]; + for (let _0x17edbf = 0; _0x17edbf < _0x5ad6b9.length; _0x17edbf++) this._u8array[this.offset + _0x17edbf] = _0x5ad6b9[_0x17edbf]; this.offset += _0x5ad6b9.length; }, _0x3189ba.prototype.writeString = function(_0x58c146, _0x23e582) { _0x23e582 = _0x23e582 || _0x58c146.length; - for (let _0x2c1832 = 0x0; _0x2c1832 < _0x58c146.length && _0x2c1832 < _0x23e582; _0x2c1832++) this._u8array[this.offset + _0x2c1832] = _0x58c146.charCodeAt(_0x2c1832); - for (; _0x2c1832 < _0x23e582; _0x2c1832++) this._u8array[this.offset + _0x2c1832] = 0x0; + for (let _0x2c1832 = 0; _0x2c1832 < _0x58c146.length && _0x2c1832 < _0x23e582; _0x2c1832++) this._u8array[this.offset + _0x2c1832] = _0x58c146.charCodeAt(_0x2c1832); + for (; _0x2c1832 < _0x23e582; _0x2c1832++) this._u8array[this.offset + _0x2c1832] = 0; this.offset += _0x23e582; }; let _0x863031 = _0x3189ba, - _0x34e7cf = 0x0; + _0x34e7cf = 0; function _0x454881() { - this.records = [], this.truncate = !0x1; + this.records = [], this.truncate = false; } function _0x288092(_0x1ab789) { let _0x17edbf = new _0x454881(); _0x1ab789.seek(0x5); - for (let _0x2c1832 = 0x0, _0x195f00 = 0x0; !_0x1ab789.isEOF();) { + for (let _0x2c1832 = 0, _0x195f00 = 0; !_0x1ab789.isEOF();) { if (0x454f46 === (_0x2c1832 = _0x1ab789.readU24())) { if (_0x1ab789.isEOF()) break; - if (_0x1ab789.offset + 0x3 === _0x1ab789.fileSize) { + if (_0x1ab789.offset + 3 === _0x1ab789.fileSize) { _0x17edbf.truncate = _0x1ab789.readU24(); break; } @@ -737,7 +739,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x454881.prototype.addSimpleRecord = function(_0x37166f, _0x2e61e0) { this.records.push({ 'offset': _0x37166f, - 'type': 0x1, + 'type': 1, 'length': _0x2e61e0.length, 'data': _0x2e61e0 }); @@ -749,56 +751,56 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'byte': _0x92bb02 }); }, _0x454881.prototype.toString = function() { - nSimpleRecords = 0x0, nRLERecords = 0x0; - for (let _0xa88a13 = 0x0; _0xa88a13 < this.records.length; _0xa88a13++) this.records[_0xa88a13].type === _0x34e7cf ? nRLERecords++ : nSimpleRecords++; + nSimpleRecords = 0, nRLERecords = 0; + for (let _0xa88a13 = 0; _0xa88a13 < this.records.length; _0xa88a13++) this.records[_0xa88a13].type === _0x34e7cf ? nRLERecords++ : nSimpleRecords++; let _0x17edbf = 'Simple records: ' + nSimpleRecords; return _0x17edbf += '\nRLE records: ' + nRLERecords, _0x17edbf += '\nTotal records: ' + this.records.length, this.truncate && (_0x17edbf += '\nTruncate at: 0x' + this.truncate.toString(0x10)), _0x17edbf; }, _0x454881.prototype.export = function(_0x4d18dc) { - for (let _0x17edbf = 0x5, _0x2c1832 = 0x0; _0x2c1832 < this.records.length; _0x2c1832++) this.records[_0x2c1832].type === _0x34e7cf ? _0x17edbf += 0x8 : _0x17edbf += 0x5 + this.records[_0x2c1832].data.length; - _0x17edbf += 0x3, this.truncate && (_0x17edbf += 0x3), tempFile = new _0x863031(_0x17edbf), tempFile.fileName = _0x4d18dc + '.ips', tempFile.writeString('PATCH'); - for (_0x2c1832 = 0x0; _0x2c1832 < this.records.length; _0x2c1832++) { + for (let _0x17edbf = 5, _0x2c1832 = 0; _0x2c1832 < this.records.length; _0x2c1832++) this.records[_0x2c1832].type === _0x34e7cf ? _0x17edbf += 0x8 : _0x17edbf += 5 + this.records[_0x2c1832].data.length; + _0x17edbf += 3, this.truncate && (_0x17edbf += 3), tempFile = new _0x863031(_0x17edbf), tempFile.fileName = _0x4d18dc + '.ips', tempFile.writeString('PATCH'); + for (_0x2c1832 = 0; _0x2c1832 < this.records.length; _0x2c1832++) { let _0x512785 = this.records[_0x2c1832]; - tempFile.writeU24(_0x512785.offset), _0x512785.type === _0x34e7cf ? (tempFile.writeU16(0x0), tempFile.writeU16(_0x512785.length), tempFile.writeU8(_0x512785.byte)) : (tempFile.writeU16(_0x512785.data.length), tempFile.writeBytes(_0x512785.data)); + tempFile.writeU24(_0x512785.offset), _0x512785.type === _0x34e7cf ? (tempFile.writeU16(0), tempFile.writeU16(_0x512785.length), tempFile.writeU8(_0x512785.byte)) : (tempFile.writeU16(_0x512785.data.length), tempFile.writeBytes(_0x512785.data)); } return tempFile.writeString('EOF'), _0x512785.truncate && tempFile.writeU24(_0x512785.truncate), tempFile; }, _0x454881.prototype.apply = function(_0xefa71d) { let _0x17edbf; - if (this.truncate) _0x17edbf = _0xefa71d.slice(0x0, this.truncate); + if (this.truncate) _0x17edbf = _0xefa71d.slice(0, this.truncate); else { - for (let _0x2c1832 = _0xefa71d.fileSize, _0x5a0a71 = 0x0; _0x5a0a71 < this.records.length; _0x5a0a71++) { + for (let _0x2c1832 = _0xefa71d.fileSize, _0x5a0a71 = 0; _0x5a0a71 < this.records.length; _0x5a0a71++) { let _0x105576 = this.records[_0x5a0a71]; _0x105576.type === _0x34e7cf ? _0x105576.offset + _0x105576.length > _0x2c1832 && (_0x2c1832 = _0x105576.offset + _0x105576.length) : _0x105576.offset + _0x105576.data.length > _0x2c1832 && (_0x2c1832 = _0x105576.offset + _0x105576.data.length); } - _0x2c1832 === _0xefa71d.fileSize ? _0x17edbf = _0xefa71d.slice(0x0, _0xefa71d.fileSize) : (_0x17edbf = new _0x863031(_0x2c1832), _0xefa71d.copyToFile(_0x17edbf, 0x0)); + _0x2c1832 === _0xefa71d.fileSize ? _0x17edbf = _0xefa71d.slice(0, _0xefa71d.fileSize) : (_0x17edbf = new _0x863031(_0x2c1832), _0xefa71d.copyToFile(_0x17edbf, 0)); } - _0xefa71d.seek(0x0); - for (_0x5a0a71 = 0x0; _0x5a0a71 < this.records.length; _0x5a0a71++) + _0xefa71d.seek(0); + for (_0x5a0a71 = 0; _0x5a0a71 < this.records.length; _0x5a0a71++) if (_0x17edbf.seek(this.records[_0x5a0a71].offset), this.records[_0x5a0a71].type === _0x34e7cf) - for (let _0x729105 = 0x0; _0x729105 < this.records[_0x5a0a71].length; _0x729105++) _0x17edbf.writeU8(this.records[_0x5a0a71].byte); + for (let _0x729105 = 0; _0x729105 < this.records[_0x5a0a71].length; _0x729105++) _0x17edbf.writeU8(this.records[_0x5a0a71].byte); else _0x17edbf.writeBytes(this.records[_0x5a0a71].data); return _0x17edbf; }; '0123456789abcdef' .split(''); let _0x1aa7ba = function() { - for (let _0xa88a13, _0x17edbf = [], _0x2c1832 = 0x0; _0x2c1832 < 0x100; _0x2c1832++) { + for (let _0xa88a13, _0x17edbf = [], _0x2c1832 = 0; _0x2c1832 < 0x100; _0x2c1832++) { _0xa88a13 = _0x2c1832; - for (let _0x32bcf1 = 0x0; _0x32bcf1 < 0x8; _0x32bcf1++) _0xa88a13 = 0x1 & _0xa88a13 ? 0xedb88320 ^ _0xa88a13 >>> 0x1 : _0xa88a13 >>> 0x1; + for (let _0x32bcf1 = 0; _0x32bcf1 < 0x8; _0x32bcf1++) _0xa88a13 = 1 & _0xa88a13 ? 0xedb88320 ^ _0xa88a13 >>> 1 : _0xa88a13 >>> 1; _0x17edbf[_0x2c1832] = _0xa88a13; } return _0x17edbf; }(); function _0x2d78e9(_0x509ecf, _0x4219e1, _0xd66d2b) { - for (let _0x185f93 = _0x4219e1 ? new Uint8Array(_0x509ecf._u8array.buffer, _0x4219e1) : _0x509ecf._u8array, _0x20e2c1 = -0x1, _0x3d100a = _0xd66d2b ? _0x185f93.length - 0x4 : _0x185f93.length, _0x56a6e6 = 0x0; _0x56a6e6 < _0x3d100a; _0x56a6e6++) _0x20e2c1 = _0x20e2c1 >>> 0x8 ^ _0x1aa7ba[0xff & (_0x20e2c1 ^ _0x185f93[_0x56a6e6])]; - return (-0x1 ^ _0x20e2c1) >>> 0x0; + for (let _0x185f93 = _0x4219e1 ? new Uint8Array(_0x509ecf._u8array.buffer, _0x4219e1) : _0x509ecf._u8array, _0x20e2c1 = -1, _0x3d100a = _0xd66d2b ? _0x185f93.length - 4 : _0x185f93.length, _0x56a6e6 = 0; _0x56a6e6 < _0x3d100a; _0x56a6e6++) _0x20e2c1 = _0x20e2c1 >>> 0x8 ^ _0x1aa7ba[0xff & (_0x20e2c1 ^ _0x185f93[_0x56a6e6])]; + return (-0x1 ^ _0x20e2c1) >>> 0; } - let _0x37eff4 = 0x0, - _0x34d681 = 0x1, - _0x4c50e7 = 0x2, - _0xf9eeea = 0x3; + let _0x37eff4 = 0, + _0x34d681 = 1, + _0x4c50e7 = 2, + _0xf9eeea = 3; function _0x5b02d3() { - this.sourceSize = 0x0, this.targetSize = 0x0, this.metaData = '', this.actions = [], this.sourceChecksum = 0x0, this.targetChecksum = 0x0, this.patchChecksum = 0x0; + this.sourceSize = 0, this.targetSize = 0, this.metaData = '', this.actions = [], this.sourceChecksum = 0, this.targetChecksum = 0, this.patchChecksum = 0; } function _0x356089(_0x1bf770) { @@ -810,22 +812,22 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { for (let _0x157bba = _0x1bf770.fileSize - 0xc; _0x1bf770.offset < _0x157bba;) { let _0x31dcc2 = _0x1bf770.readVLV(), _0x21bafe = { - 'type': 0x3 & _0x31dcc2, - 'length': 0x1 + (_0x31dcc2 >> 0x2) + 'type': 3 & _0x31dcc2, + 'length': 1 + (_0x31dcc2 >> 2) }; if (_0x21bafe.type === _0x34d681) _0x21bafe.bytes = _0x1bf770.readBytes(_0x21bafe.length); else if (_0x21bafe.type === _0x4c50e7 || _0x21bafe.type === _0xf9eeea) { let _0x4c6327 = _0x1bf770.readVLV(); - _0x21bafe.relativeOffset = (0x1 & _0x4c6327 ? -0x1 : 0x1) * (_0x4c6327 >> 0x1); + _0x21bafe.relativeOffset = (0x1 & _0x4c6327 ? -0x1 : 1) * (_0x4c6327 >> 1); } _0x17edbf.actions.push(_0x21bafe); } - if (_0x17edbf.sourceChecksum = _0x1bf770.readU32(), _0x17edbf.targetChecksum = _0x1bf770.readU32(), _0x17edbf.patchChecksum = _0x1bf770.readU32(), _0x17edbf.patchChecksum !== _0x2d78e9(_0x1bf770, 0x0, true)) throw new Error('error_crc_patch'); + if (_0x17edbf.sourceChecksum = _0x1bf770.readU32(), _0x17edbf.targetChecksum = _0x1bf770.readU32(), _0x17edbf.patchChecksum = _0x1bf770.readU32(), _0x17edbf.patchChecksum !== _0x2d78e9(_0x1bf770, 0, true)) throw new Error('error_crc_patch'); return _0x17edbf; } function _0x45da2c() { - for (let _0xa88a13 = 0x0, _0x17edbf = 0x1;;) { + for (let _0xa88a13 = 0, _0x17edbf = 1;;) { let _0x2c1832 = this.readU8(); if (_0xa88a13 += (0x7f & _0x2c1832) * _0x17edbf, 0x80 & _0x2c1832) break; _0xa88a13 += _0x17edbf <<= 0x7; @@ -845,7 +847,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } function _0x5a4975(_0x221175) { - for (let _0x17edbf = 0x0;;) { + for (let _0x17edbf = 0;;) { if (0x0 === (_0x221175 >>= 0x7)) { _0x17edbf++; break; @@ -856,7 +858,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } function _0x562e68() { - this.offset = 0x0, this.next = null; + this.offset = 0, this.next = null; } _0x5b02d3.prototype.toString = function() { let _0xa88a13 = 'Source size: ' + this.sourceSize; @@ -865,7 +867,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { return this.sourceChecksum === _0x2d78e9(_0x48d2df, _0x3c15dd); }, _0x5b02d3.prototype.apply = function(_0x393f39, _0x76e509) { if (_0x76e509 && !this.validateSource(_0x393f39)) throw new Error('error_crc_input'); - for (let _0x2c1832 = new _0x863031(this.targetSize), _0x4df6ae = 0x0, _0xad0fa9 = 0x0, _0x38240a = 0x0; _0x38240a < this.actions.length; _0x38240a++) { + for (let _0x2c1832 = new _0x863031(this.targetSize), _0x4df6ae = 0, _0xad0fa9 = 0, _0x38240a = 0; _0x38240a < this.actions.length; _0x38240a++) { let _0x4b1026 = this.actions[_0x38240a]; if (_0x4b1026.type === _0x37eff4) _0x393f39.copyToFile(_0x2c1832, _0x2c1832.offset, _0x4b1026.length), _0x2c1832.skip(_0x4b1026.length); else if (_0x4b1026.type === _0x34d681) _0x2c1832.writeBytes(_0x4b1026.bytes); @@ -882,14 +884,14 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, _0x5b02d3.prototype.export = function(_0x3e1e58) { let _0x17edbf = 'BPS1' .length; _0x17edbf += _0x5a4975(this.sourceSize), _0x17edbf += _0x5a4975(this.targetSize), _0x17edbf += _0x5a4975(this.metaData.length), _0x17edbf += this.metaData.length; - for (let _0x2c1832 = 0x0; _0x2c1832 < this.actions.length; _0x2c1832++) { - _0x17edbf += _0x5a4975(((_0x38dad6 = this.actions[_0x2c1832]).length - 0x1 << 0x2) + _0x38dad6.type), _0x38dad6.type === _0x34d681 ? _0x17edbf += _0x38dad6.length : _0x38dad6.type !== _0x4c50e7 && _0x38dad6.type !== _0xf9eeea || (_0x17edbf += _0x5a4975((Math.abs(_0x38dad6.relativeOffset) << 0x1) + (_0x38dad6.relativeOffset < 0x0 ? 0x1 : 0x0))); + for (let _0x2c1832 = 0; _0x2c1832 < this.actions.length; _0x2c1832++) { + _0x17edbf += _0x5a4975(((_0x38dad6 = this.actions[_0x2c1832]).length - 1 << 2) + _0x38dad6.type), _0x38dad6.type === _0x34d681 ? _0x17edbf += _0x38dad6.length : _0x38dad6.type !== _0x4c50e7 && _0x38dad6.type !== _0xf9eeea || (_0x17edbf += _0x5a4975((Math.abs(_0x38dad6.relativeOffset) << 1) + (_0x38dad6.relativeOffset < 0 ? 1 : 0))); } let _0x2d1555 = new _0x863031(_0x17edbf += 0xc); _0x2d1555.fileName = _0x3e1e58 + '.bps', _0x2d1555.littleEndian = true, _0x2d1555.writeVLV = _0x152a53, _0x2d1555.writeString('BPS1'), _0x2d1555.writeVLV(this.sourceSize), _0x2d1555.writeVLV(this.targetSize), _0x2d1555.writeVLV(this.metaData.length), _0x2d1555.writeString(this.metaData, this.metaData.length); - for (_0x2c1832 = 0x0; _0x2c1832 < this.actions.length; _0x2c1832++) { + for (_0x2c1832 = 0; _0x2c1832 < this.actions.length; _0x2c1832++) { let _0x38dad6 = this.actions[_0x2c1832]; - _0x2d1555.writeVLV((_0x38dad6.length - 0x1 << 0x2) + _0x38dad6.type), _0x38dad6.type === _0x34d681 ? _0x2d1555.writeBytes(_0x38dad6.bytes) : _0x38dad6.type !== _0x4c50e7 && _0x38dad6.type !== _0xf9eeea || _0x2d1555.writeVLV((Math.abs(_0x38dad6.relativeOffset) << 0x1) + (_0x38dad6.relativeOffset < 0x0 ? 0x1 : 0x0)); + _0x2d1555.writeVLV((_0x38dad6.length - 1 << 2) + _0x38dad6.type), _0x38dad6.type === _0x34d681 ? _0x2d1555.writeBytes(_0x38dad6.bytes) : _0x38dad6.type !== _0x4c50e7 && _0x38dad6.type !== _0xf9eeea || _0x2d1555.writeVLV((Math.abs(_0x38dad6.relativeOffset) << 1) + (_0x38dad6.relativeOffset < 0 ? 1 : 0)); } return _0x2d1555.writeU32(this.sourceChecksum), _0x2d1555.writeU32(this.targetChecksum), _0x2d1555.writeU32(this.patchChecksum), _0x2d1555; }, _0x562e68.prototype.delete = function() { @@ -898,7 +900,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x7a6485 = 'UPS1'; function _0x42cd9e() { - this.records = [], this.sizeInput = 0x0, this.sizeOutput = 0x0, this.checksumInput = 0x0, this.checksumOutput = 0x0; + this.records = [], this.sizeInput = 0, this.sizeOutput = 0, this.checksumInput = 0, this.checksumOutput = 0; } function _0x10dc1d(_0x5d0c48) { @@ -908,24 +910,24 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { this.writeU8(0x80 | _0x17edbf); break; } - this.writeU8(_0x17edbf), _0x5d0c48 -= 0x1; + this.writeU8(_0x17edbf), _0x5d0c48 -= 1; } } function _0x454043() { - for (let _0xa88a13 = 0x0, _0x17edbf = 0x1;;) { + for (let _0xa88a13 = 0, _0x17edbf = 1;;) { let _0x2c1832 = this.readU8(); - if (-0x1 == _0x2c1832) throw new Error('Can\'t read UPS VLV at 0x' + (this.offset - 0x1).toString(0x10)); - if (_0xa88a13 += (0x7f & _0x2c1832) * _0x17edbf, 0x0 != (0x80 & _0x2c1832)) break; + if (-0x1 == _0x2c1832) throw new Error('Can\'t read UPS VLV at 0x' + (this.offset - 1).toString(0x10)); + if (_0xa88a13 += (0x7f & _0x2c1832) * _0x17edbf, 0 != (0x80 & _0x2c1832)) break; _0xa88a13 += _0x17edbf <<= 0x7; } return _0xa88a13; } function _0xca245c(_0x459173) { - for (let _0x17edbf = 0x0;;) { - if (_0x17edbf++, 0x0 === (_0x459173 >>= 0x7)) break; - _0x459173 -= 0x1; + for (let _0x17edbf = 0;;) { + if (_0x17edbf++, 0 === (_0x459173 >>= 0x7)) break; + _0x459173 -= 1; } return _0x17edbf; } @@ -937,7 +939,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { for (let _0x2c1832 = _0x5abb5e.readVLV(), _0x3bca86 = []; _0x5abb5e.readU8();) _0x3bca86.push(_0x5abb5e._lastRead); _0x17edbf.addRecord(_0x2c1832, _0x3bca86); } - return _0x5abb5e.littleEndian = true, _0x17edbf.checksumInput = _0x5abb5e.readU32(), _0x17edbf.checksumOutput = _0x5abb5e.readU32(), _0x5abb5e.littleEndian = !0x1, _0x17edbf; + return _0x5abb5e.littleEndian = true, _0x17edbf.checksumInput = _0x5abb5e.readU32(), _0x17edbf.checksumOutput = _0x5abb5e.readU32(), _0x5abb5e.littleEndian = false, _0x17edbf; } _0x42cd9e.prototype.addRecord = function(_0x162ca5, _0x39594d) { this.records.push({ @@ -945,24 +947,24 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'XORdata': _0x39594d }); }, _0x42cd9e.prototype.toString = function() { - let _0xa88a13 = 'Records: ' + (void 0x0).records.length; - return _0xa88a13 += '\nInput file size: ' + (void 0x0).sizeInput, _0xa88a13 += '\nOutput file size: ' + (void 0x0).sizeOutput, _0xa88a13 += '\nInput file checksum: ' + padZeroes((void 0x0).checksumInput, 0x4), _0xa88a13 += '\nOutput file checksum: ' + padZeroes((void 0x0).checksumOutput, 0x4); + let _0xa88a13 = 'Records: ' + (undefined).records.length; + return _0xa88a13 += '\nInput file size: ' + (undefined).sizeInput, _0xa88a13 += '\nOutput file size: ' + (undefined).sizeOutput, _0xa88a13 += '\nInput file checksum: ' + padZeroes((undefined).checksumInput, 4), _0xa88a13 += '\nOutput file checksum: ' + padZeroes((undefined).checksumOutput, 4); }, _0x42cd9e.prototype.export = function(_0x1a3e8b) { let _0x17edbf = _0x7a6485.length; _0x17edbf += _0xca245c(this.sizeInput), _0x17edbf += _0xca245c(this.sizeOutput); - for (let _0x2c1832 = 0x0; _0x2c1832 < this.records.length; _0x2c1832++) _0x17edbf += _0xca245c(this.records[_0x2c1832].offset), _0x17edbf += this.records[_0x2c1832].XORdata.length + 0x1; + for (let _0x2c1832 = 0; _0x2c1832 < this.records.length; _0x2c1832++) _0x17edbf += _0xca245c(this.records[_0x2c1832].offset), _0x17edbf += this.records[_0x2c1832].XORdata.length + 1; _0x17edbf += 0xc, tempFile = new _0x863031(_0x17edbf), tempFile.writeVLV = _0x10dc1d, tempFile.fileName = _0x1a3e8b + '.ups', tempFile.writeString(_0x7a6485), tempFile.writeVLV(this.sizeInput), tempFile.writeVLV(this.sizeOutput); - for (_0x2c1832 = 0x0; _0x2c1832 < this.records.length; _0x2c1832++) tempFile.writeVLV(this.records[_0x2c1832].offset), tempFile.writeBytes(this.records[_0x2c1832].XORdata), tempFile.writeU8(0x0); - return tempFile.littleEndian = true, tempFile.writeU32(this.checksumInput), tempFile.writeU32(this.checksumOutput), tempFile.writeU32(_0x2d78e9(tempFile, 0x0, true)), tempFile; + for (_0x2c1832 = 0; _0x2c1832 < this.records.length; _0x2c1832++) tempFile.writeVLV(this.records[_0x2c1832].offset), tempFile.writeBytes(this.records[_0x2c1832].XORdata), tempFile.writeU8(0); + return tempFile.littleEndian = true, tempFile.writeU32(this.checksumInput), tempFile.writeU32(this.checksumOutput), tempFile.writeU32(_0x2d78e9(tempFile, 0, true)), tempFile; }, _0x42cd9e.prototype.validateSource = function(_0x25cb26, _0xd0163c) { return _0x2d78e9(_0x25cb26, _0xd0163c) === this.checksumInput; }, _0x42cd9e.prototype.apply = function(_0x21d682, _0x41bbac) { - _0x41bbac && this.validateSource(_0x21d682), tempFile = new _0x863031(this.sizeOutput), _0x21d682.copyToFile(tempFile, 0x0, this.sizeInput), _0x21d682.seek(0x0); - for (let _0x2c1832 = 0x0; _0x2c1832 < this.records.length; _0x2c1832++) { + _0x41bbac && this.validateSource(_0x21d682), tempFile = new _0x863031(this.sizeOutput), _0x21d682.copyToFile(tempFile, 0, this.sizeInput), _0x21d682.seek(0); + for (let _0x2c1832 = 0; _0x2c1832 < this.records.length; _0x2c1832++) { let _0x5ed6c9 = this.records[_0x2c1832]; tempFile.skip(_0x5ed6c9.offset), _0x21d682.skip(_0x5ed6c9.offset); - for (let _0x3faf05 = 0x0; _0x3faf05 < _0x5ed6c9.XORdata.length; _0x3faf05++) tempFile.writeU8((_0x21d682.isEOF() ? 0x0 : _0x21d682.readU8()) ^ _0x5ed6c9.XORdata[_0x3faf05]); - tempFile.skip(0x1), _0x21d682.skip(0x1); + for (let _0x3faf05 = 0; _0x3faf05 < _0x5ed6c9.XORdata.length; _0x3faf05++) tempFile.writeU8((_0x21d682.isEOF() ? 0 : _0x21d682.readU8()) ^ _0x5ed6c9.XORdata[_0x3faf05]); + tempFile.skip(1), _0x21d682.skip(1); } return _0x41bbac && (_0x2d78e9(tempFile), this.checksumOutput), tempFile; }; @@ -980,7 +982,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } }, 'romdb': null, - 'supportBatterySave': !0x1, + 'supportBatterySave': false, 'hash': '2b35cacf70ae', 'hash2': 'f5cbb3f38c0bb20e4', 'hash3': '88cc8ad0c350400499a0', @@ -989,7 +991,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'saveFilenames': [], 'FS': null, 'Module': null, - 'aspectRatio': 0x4 / 0x3, + 'aspectRatio': 4 / 3, 'memData': null, 'wasmData': null, 'coreFileData': {}, @@ -999,81 +1001,146 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'create': function() { let _this = this; window.URL = window.URL || window.webkitURL; - let _0x17edbf, _0x2c1832, _0x4ce206, _0x528f2b = !0x1, - _0x547484 = !0x1, - _0x5e24fa = !0x1, - _0x468801 = 0x0, - _0x31a5b3 = !0x1, + let _0x17edbf, + _0x2c1832, + _0x4ce206, + _0x528f2b = false, + _0x547484 = false, + _0x5e24fa = false, + _0x468801 = 0, + _0x31a5b3 = false, _0x1e0766 = { - 'psx': ['bin', 'iso', 'cue', 'img', 'mdf', 'pbp', 'toc', 'cbn', 'm3u'], - 'nds': ['nds', 'bin'], - 'nes': ['fds', 'nes', 'unif', 'unf'], - 'snes': ['smc', 'fig', 'sfc', 'gd3', 'gd7', 'dx2', 'bsx', 'swc'], - 'snes2002': ['smc', 'fig', 'sfc', 'gd3', 'gd7', 'dx2', 'bsx', 'swc'], - 'snes2005': ['smc', 'fig', 'sfc', 'gd3', 'gd7', 'dx2', 'bsx', 'swc'], - 'snes2010': ['smc', 'fig', 'sfc', 'gd3', 'gd7', 'dx2', 'bsx', 'swc'], - 'gb': ['gb', 'gbc', 'dmg'], - 'gba': ['gb', 'gbc', 'gba'], - 'vbanext': ['gba'], - 'vb': ['vb', 'vboy', 'bin'], - '3do': ['iso', 'bin', 'cue'], - 'lynx': ['lnx'], - 'jaguar': ['j64', 'jag', 'rom', 'abs', 'cof', 'bin', 'prg'], - 'a7800': ['a78', 'bin'], - 'a5200': ['a52', 'bin'], - 'a2600': ['a26', 'bin'], - 'ngp': ['ngp', 'ngc'], - 'n64': ['n64', 'v64', 'z64', 'bin', 'u1', 'ndd'], - 'pce': ['pce', 'bin', 'iso', 'cue', 'ccd', 'img', 'chd'], - 'sega': ['mdx', 'md', 'smd', 'gen', 'bin', 'iso', 'cue', 'sms', 'gg', 'sg', '68k', 'chd'], - 'segacd': ['mdx', 'md', 'smd', 'gen', 'bin', 'iso', 'cue', 'sms', 'gg', 'sg', '68k', 'chd'], - '32x': ['32x', 'bin', 'gen', 'smd', 'md', 'cue', 'iso', 'sms'], - 'saturn': ['bin', 'cue', 'iso'], - 'msx': ['rom', 'mx1', 'mx2', 'dsk', 'cas'], - 'bluemsx': ['rom', 'ri', 'mx1', 'mx2', 'col', 'dsk', 'cas', 'sg', 'sc', 'm3u'], - 'ws': ['ws', 'wsc'], - 'arcade': ['zip'], - 'fba0.2.97.29': ['zip'], - 'mame2003': ['zip'], - 'mame': ['zip'] + oldCores: { + 'psx': ['bin', 'iso', 'cue', 'img', 'mdf', 'pbp', 'toc', 'cbn', 'm3u'], + 'nds': ['nds', 'bin'], + 'nes': ['fds', 'nes', 'unif', 'unf'], + 'snes': ['smc', 'fig', 'sfc', 'gd3', 'gd7', 'dx2', 'bsx', 'swc'], + 'snes2002': ['smc', 'fig', 'sfc', 'gd3', 'gd7', 'dx2', 'bsx', 'swc'], + 'snes2005': ['smc', 'fig', 'sfc', 'gd3', 'gd7', 'dx2', 'bsx', 'swc'], + 'snes2010': ['smc', 'fig', 'sfc', 'gd3', 'gd7', 'dx2', 'bsx', 'swc'], + 'gb': ['gb', 'gbc', 'dmg'], + 'gba': ['gb', 'gbc', 'gba'], + 'vbanext': ['gba'], + 'vb': ['vb', 'vboy', 'bin'], + '3do': ['iso', 'bin', 'cue'], + 'lynx': ['lnx'], + 'jaguar': ['j64', 'jag', 'rom', 'abs', 'cof', 'bin', 'prg'], + 'a7800': ['a78', 'bin'], + 'a2600': ['a26', 'bin'], + 'ngp': ['ngp', 'ngc'], + 'n64': ['n64', 'v64', 'z64', 'bin', 'u1', 'ndd'], + 'pce': ['pce', 'bin', 'iso', 'cue', 'ccd', 'img', 'chd'], + 'sega': ['mdx', 'md', 'smd', 'gen', 'bin', 'iso', 'cue', 'sms', 'gg', 'sg', '68k', 'chd'], + 'segacd': ['mdx', 'md', 'smd', 'gen', 'bin', 'iso', 'cue', 'sms', 'gg', 'sg', '68k', 'chd'], + '32x': ['32x', 'bin', 'gen', 'smd', 'md', 'cue', 'iso', 'sms'], + 'saturn': ['bin', 'cue', 'iso'], + 'msx': ['rom', 'mx1', 'mx2', 'dsk', 'cas'], + 'bluemsx': ['rom', 'ri', 'mx1', 'mx2', 'col', 'dsk', 'cas', 'sg', 'sc', 'm3u'], + 'ws': ['ws', 'wsc'], + 'arcade': ['zip'], + 'fba0.2.97.29': ['zip'], + 'mame2003': ['zip'], + 'mame': ['zip'] + }, + newCores: { + 'fceumm': ['fds', 'nes', 'unif', 'unf'], + 'snes9x': ['smc', 'sfc', 'swc', 'fig', 'bs', 'st'], + 'a5200': ['a52', 'bin'], + 'gambatte': ['gb', 'gbc', 'dmg'], + 'mgba': ['gb', 'gbc', 'gba'], + 'beetle_vb': ['vb', 'vboy', 'bin'], + 'mupen64plus_next': ['n64', 'v64', 'z64', 'bin', 'u1', 'ndd', 'gb'], + 'fbalpha2012_cps1': ['zip'], + 'fbalpha2012_cps2': ['zip'], + 'mame2003': ['zip'], + 'desmume2015': ['nds', 'bin'], + 'melonds': ['nds'], + 'mednafen_psx': ['cue', 'toc', 'm3u', 'ccd', 'exe', 'pbp', 'chd'], + 'mednafen_psx_hw': ['cue', 'toc', 'm3u', 'ccd', 'exe', 'pbp', 'chd'], + 'nestopia': ['fds', 'nes', 'unif', 'unf'] + } }, _0x29078e = { - 'psx': 'psx', - 'nds': 'nds', - 'nes': 'nes', - 'snes': 'snes', - 'snes2002': 'snes2002', - 'snes2005': 'snes2005', - 'snes2010': 'snes2010', - 'gb': 'gb', - 'gbc': 'gb', - 'gba': 'gba', - 'vbanext': 'vbanext', - 'vb': 'vb', - 'n64': 'n64', - '3do': '3do', - 'segaMS': 'sega', - 'segaGG': 'sega', - 'segaMD': 'sega', - 'segaCD': 'segacd', - 'sega32x': '32x', - 'segaSaturn': 'saturn', - 'ngp': 'ngp', - 'pce': 'pce', - 'msx': 'bluemsx', - 'atari2600': 'a2600', - 'atari7800': 'a7800', - 'atari5200': 'a5200', - 'lynx': 'lynx', - 'ws': 'ws', - 'arcade': 'arcade', - 'fba0.2.97.29': 'fba0.2.97.29', - 'jaguar': 'jaguar', - 'mame2003': 'mame2003' + oldCores: { + 'psx': 'psx', + 'nds': 'nds', + 'nes': 'nes', + 'snes': 'snes', + 'snes2002': 'snes2002', + 'snes2005': 'snes2005', + 'snes2010': 'snes2010', + 'gb': 'gb', + 'gbc': 'gb', + 'gba': 'gba', + 'vbanext': 'vbanext', + 'vb': 'vb', + 'n64': 'n64', + '3do': '3do', + 'segaMS': 'sega', + 'segaGG': 'sega', + 'segaMD': 'sega', + 'segaCD': 'segacd', + 'sega32x': '32x', + 'segaSaturn': 'saturn', + 'ngp': 'ngp', + 'pce': 'pce', + 'msx': 'bluemsx', + 'atari2600': 'a2600', + 'atari7800': 'a7800', + 'atari5200': 'a5200', + 'lynx': 'lynx', + 'ws': 'ws', + 'arcade': 'arcade', + 'fba0.2.97.29': 'fba0.2.97.29', + 'jaguar': 'jaguar', + 'mame2003': 'mame2003' + }, + newCores: { + // The default core to use for each system + 'nes': 'fceumm', + 'snes': 'snes9x', + 'atari5200': 'a5200', + 'gb': 'gambatte', + 'gba': 'mgba', + 'vb': 'beetle_vb', + 'n64': 'mupen64plus_next', + 'nds': 'desmume2015', + 'mame2003': 'mame2003', + 'arcade': 'fbalpha2012_cps1', // I need to find a more compatible arcade core + 'psx': 'mednafen_psx_hw' + } + }, + newCoreTypes = { + 'fceumm': 'nes', + 'snes9x': 'snes', + 'a5200': 'atari5200', + 'gambatte': 'gb', + 'mgba': 'gba', + 'beetle_vb': 'vb', + 'mupen64plus_next': 'n64', + 'desmume2015': 'nds', + 'mame2003': 'mame2003', + 'fbalpha2012_cps1': 'arcade', + 'fbalpha2012_cps2': 'arcade', + 'mednafen_psx': 'psx', + 'mednafen_psx_hw': 'psx', + 'melonds': 'nds', + 'nestopia': 'nes' + }, + getSystem = function(core, notRetroarch) { + if (notRetroarch === true) { + return newCoreTypes[core] || core; + } else if (notRetroarch === 1) { + return _0x29078e.oldCores[core]; // For when core is set to version 1. + } + return _0x29078e.newCores[core] || core; }, _0xc6823 = this, _0x1143c5 = _0xc6823.system; - _0x17edbf = (_0xc6823.customPaths && typeof _0xc6823.customPaths['extract7z.js'] == 'string') ? _0xc6823.customPaths['extract7z.js'] : (_0xc6823.dataPath + 'extract7z.js');; + window.getSystem = getSystem; + window._0x29078e = _0x29078e; + window._0x1e0766 = _0x1e0766; + _0x17edbf = (_0xc6823.customPaths && typeof _0xc6823.customPaths['extract7z.js'] == 'string') ? _0xc6823.customPaths['extract7z.js'] : (_0xc6823.dataPath + 'extract7z.js'); _0x2c1832 = (_0xc6823.customPaths && typeof _0xc6823.customPaths['extractzip.js'] == 'string') ? _0xc6823.customPaths['extractzip.js'] : (_0xc6823.dataPath + 'extractzip.js?v=1'); _0x4ce206 = (_0xc6823.customPaths && typeof _0xc6823.customPaths['libunrar.js'] == 'string') ? _0xc6823.customPaths['libunrar.js'] : (_0xc6823.dataPath + 'libunrar.js'); let _0xb2be2a = _0x428003('canvas', {}); @@ -1081,31 +1148,31 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'class': this.config.classNames.loading }), this.elements.container.appendChild(_0x4d7024.loading); let _0x4fce24 = { - 'loading-info': _0x449eac({ + 'loading-info': getClass({ 'loading-info': true }), - 'ad': _0x449eac({ + 'ad': getClass({ 'ad': true }), - 'close-ad': _0x449eac({ + 'close-ad': getClass({ 'close-ad': true }), - 'start-game': _0x449eac({ + 'start-game': getClass({ 'start-game': true }), - 'on': _0x449eac({ + 'on': getClass({ 'on': true }), - 'p1': _0x449eac({ + 'p1': getClass({ 'p1': true }), - 'p2': _0x449eac({ + 'p2': getClass({ 'p2': true }), - 'p3': _0x449eac({ + 'p3': getClass({ 'p3': true }), - 'p4': _0x449eac({ + 'p4': getClass({ 'p4': true }) }, @@ -1207,17 +1274,17 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (_0xdcec2a && (_0xdcec2a.virtualGamepadContainer == 'undefined' || _0xdcec2a.virtualGamepadContainer === null)) { _0x5ab74d.toggleControls.call(_0xc6823, true); } - let _0x2c1832 = _0x449eac({ + let _0x2c1832 = getClass({ 'ejs__tooltip--visible': true }), - _0x10efa5 = _0xc6823.elements.buttons.gamepad.querySelector('.' .concat(_0x449eac({ + _0x10efa5 = _0xc6823.elements.buttons.gamepad.querySelector('.' .concat(getClass({ 'ejs__tooltip': true }))); _0x3a8e2f(_0x10efa5, _0x2c1832, true), setTimeout(function() { - _0x3a8e2f(_0x10efa5, _0x2c1832, !0x1); + _0x3a8e2f(_0x10efa5, _0x2c1832, false); }, 0x1388) if (typeof _0xc6823.adUrl === 'string') { - _0x132da7(_0x4d7024.loading.querySelector('.' .concat(_0x4fce24['close-ad'])), !0x1); + _0x132da7(_0x4d7024.loading.querySelector('.' .concat(_0x4fce24['close-ad'])), false); if (_0xc6823.config.noAutoAdClose !== true) { setTimeout(function() { _0xc6823.started && _0x4d7024.loading.querySelector('.' .concat(_0x4fce24.ad)) && _0x4d7024.loading.querySelector('.' .concat(_0x4fce24.ad)).parentNode.removeChild(_0x4d7024.loading.querySelector('.' .concat(_0x4fce24.ad))); @@ -1226,37 +1293,37 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } _0x132da7(_0x4d7024.loading.querySelector('.' .concat(_0x4fce24['start-game'])), true); let _0x30fd44 = _0x5dc0c0(_0x2593da.defaultCoreOptionsValues.call(_this), _0x2593da.storage.get('core-options') || {}); - 'n64' === _0xc6823.system && _0x30fd44 && Object.keys(_0x30fd44).forEach(function(_0x3015d2) { + 'n64' === getSystem(_0xc6823.system, true) && _0x30fd44 && Object.keys(_0x30fd44).forEach(function(_0x3015d2) { 'glupen64-aspect' === _0x3015d2 && '16:9' === _0x30fd44[_0x3015d2] && (_0xb2be2a.height = _0xb2be2a.width / 0x10 * 0x9, _0x4d7024.aspectRatio = 0x10 / 0x9); }); - 'arcade' !== _this.system && 'fba0.2.97.29' !== _this.system || _0x30fd44 && Object.keys(_0x30fd44).forEach(function(_0x490c06) { + 'arcade' !== getSystem(_this.system, true) && 'fba0.2.97.29' !== getSystem(_this.system, true) || _0x30fd44 && Object.keys(_0x30fd44).forEach(function(_0x490c06) { 'fba-aspect' === _0x490c06 && 'PAR' === _0x30fd44[_0x490c06] && (_0xb2be2a.height = _0xb2be2a.width / 0x10 * 0x9, _0x4d7024.aspectRatio = 0x10 / 0x9); }); - 'gba' === _0xc6823.system && (_0xb2be2a.height = _0xb2be2a.width / 1.5, _0x4d7024.aspectRatio = 1.5); + 'gba' === getSystem(_0xc6823.system, true) && (_0xb2be2a.height = _0xb2be2a.width / 1.5, _0x4d7024.aspectRatio = 1.5); (function() { let _0x3d9f57 = _this; if ('undefined' != typeof RI) { - document.removeEventListener('mousemove', RI.eventHandler, !0x1), _0xb2be2a.removeEventListener('mousedown', RI.canvasEventHandler, !0x1), _0xb2be2a.removeEventListener('mouseup', RI.canvasEventHandler, !0x1); + document.removeEventListener('mousemove', RI.eventHandler, false), _0xb2be2a.removeEventListener('mousedown', RI.canvasEventHandler, false), _0xb2be2a.removeEventListener('mouseup', RI.canvasEventHandler, false); _0x3d9f57.elements.container.addEventListener('mousemove', function(_0x44f409) { - let _0x3d9f57 = 0x0, - _0x2c1832 = 0x0, + let _0x3d9f57 = 0, + _0x2c1832 = 0, _0x2cc8a1 = _0x44f409.offsetX - _0x4d7024.Module.canvas.offsetLeft, _0x5744ed = _0x44f409.offsetY - _0x4d7024.Module.canvas.offsetTop; switch (_0x44f409.type) { case 'mousemove': - _0x2cc8a1 < 0x0 ? (_0x2cc8a1 = 0x0, _0x3d9f57 = -_0x4d7024.Module.canvas.offsetWidth) : _0x2cc8a1 > _0x4d7024.Module.canvas.offsetWidth ? (_0x2cc8a1 = _0x4d7024.Module.canvas.offsetWidth, _0x3d9f57 = _0x4d7024.Module.canvas.offsetWidth) : _0x3d9f57 = _0x2cc8a1 - RI.currentX, _0x5744ed < 0x0 ? (_0x5744ed = 0x0, _0x2c1832 = -_0x4d7024.Module.canvas.offsetHeight) : _0x5744ed > _0x4d7024.Module.canvas.offsetHeight ? (_0x5744ed = _0x4d7024.Module.canvas.offsetHeight, _0x2c1832 = _0x4d7024.Module.canvas.offsetHeight) : _0x2c1832 = _0x5744ed - RI.currentY, RI.currentX = _0x2cc8a1, RI.currentY = _0x5744ed; - for (let _0x3e03cb = 0x0; _0x3e03cb < RI.contexts.length; _0x3e03cb += 0x1) HEAP32[RI.contexts[_0x3e03cb].state + 0x20 >> 0x2] = _0x3d9f57, HEAP32[RI.contexts[_0x3e03cb].state + 0x24 >> 0x2] = _0x2c1832; + _0x2cc8a1 < 0 ? (_0x2cc8a1 = 0, _0x3d9f57 = -_0x4d7024.Module.canvas.offsetWidth) : _0x2cc8a1 > _0x4d7024.Module.canvas.offsetWidth ? (_0x2cc8a1 = _0x4d7024.Module.canvas.offsetWidth, _0x3d9f57 = _0x4d7024.Module.canvas.offsetWidth) : _0x3d9f57 = _0x2cc8a1 - RI.currentX, _0x5744ed < 0 ? (_0x5744ed = 0, _0x2c1832 = -_0x4d7024.Module.canvas.offsetHeight) : _0x5744ed > _0x4d7024.Module.canvas.offsetHeight ? (_0x5744ed = _0x4d7024.Module.canvas.offsetHeight, _0x2c1832 = _0x4d7024.Module.canvas.offsetHeight) : _0x2c1832 = _0x5744ed - RI.currentY, RI.currentX = _0x2cc8a1, RI.currentY = _0x5744ed; + for (let _0x3e03cb = 0; _0x3e03cb < RI.contexts.length; _0x3e03cb += 1) HEAP32[RI.contexts[_0x3e03cb].state + 0x20 >> 2] = _0x3d9f57, HEAP32[RI.contexts[_0x3e03cb].state + 0x24 >> 2] = _0x2c1832; } - }, !0x1), _0x3d9f57.elements.container.addEventListener('mousedown', RI.canvasEventHandler, !0x1), _0x3d9f57.elements.container.addEventListener('mouseup', RI.canvasEventHandler, !0x1); + }, false), _0x3d9f57.elements.container.addEventListener('mousedown', RI.canvasEventHandler, false), _0x3d9f57.elements.container.addEventListener('mouseup', RI.canvasEventHandler, false); let _0x2c1832 = function(_0x5d0cbb) { - if (_0x5d0cbb.targetTouches[0x0]) { - let _0x3d9f57, _0x2c1832, _0x19a4e0 = 0x0, - _0x2b7b61 = 0x0, + if (_0x5d0cbb.targetTouches[0]) { + let _0x3d9f57, _0x2c1832, _0x19a4e0 = 0, + _0x2b7b61 = 0, _0x1e0f64 = _0x5d0cbb.target.getBoundingClientRect(), - _0x2c55b8 = _0x5d0cbb.targetTouches[0x0].clientX - _0x1e0f64.left, - _0x3a7025 = _0x5d0cbb.targetTouches[0x0].clientY - _0x1e0f64.top; - _0x2c55b8 < 0x0 ? (_0x2c55b8 = 0x0, _0x19a4e0 = -_0x4d7024.Module.canvas.offsetWidth) : _0x2c55b8 > _0x4d7024.Module.canvas.offsetWidth ? (_0x2c55b8 = _0x4d7024.Module.canvas.offsetWidth, _0x19a4e0 = _0x4d7024.Module.canvas.offsetWidth) : _0x19a4e0 = _0x2c55b8 - RI.currentX, _0x3a7025 < 0x0 ? (_0x3a7025 = 0x0, _0x2b7b61 = -_0x4d7024.Module.canvas.offsetHeight) : _0x3a7025 > _0x4d7024.Module.canvas.offsetHeight ? (_0x3a7025 = _0x4d7024.Module.canvas.offsetHeight, _0x2b7b61 = _0x4d7024.Module.canvas.offsetHeight) : _0x2b7b61 = _0x3a7025 - RI.currentY, RI.currentX = _0x2c55b8, RI.currentY = _0x3a7025; - for (let _0x43b670 = 0x0; _0x43b670 < RI.contexts.length; _0x43b670 += 0x1) HEAP32[RI.contexts[_0x43b670].state + 0x20 >> 0x2] = _0x19a4e0, HEAP32[RI.contexts[_0x43b670].state + 0x24 >> 0x2] = _0x2b7b61; + _0x2c55b8 = _0x5d0cbb.targetTouches[0].clientX - _0x1e0f64.left, + _0x3a7025 = _0x5d0cbb.targetTouches[0].clientY - _0x1e0f64.top; + _0x2c55b8 < 0 ? (_0x2c55b8 = 0, _0x19a4e0 = -_0x4d7024.Module.canvas.offsetWidth) : _0x2c55b8 > _0x4d7024.Module.canvas.offsetWidth ? (_0x2c55b8 = _0x4d7024.Module.canvas.offsetWidth, _0x19a4e0 = _0x4d7024.Module.canvas.offsetWidth) : _0x19a4e0 = _0x2c55b8 - RI.currentX, _0x3a7025 < 0 ? (_0x3a7025 = 0, _0x2b7b61 = -_0x4d7024.Module.canvas.offsetHeight) : _0x3a7025 > _0x4d7024.Module.canvas.offsetHeight ? (_0x3a7025 = _0x4d7024.Module.canvas.offsetHeight, _0x2b7b61 = _0x4d7024.Module.canvas.offsetHeight) : _0x2b7b61 = _0x3a7025 - RI.currentY, RI.currentX = _0x2c55b8, RI.currentY = _0x3a7025; + for (let _0x43b670 = 0; _0x43b670 < RI.contexts.length; _0x43b670 += 1) HEAP32[RI.contexts[_0x43b670].state + 0x20 >> 2] = _0x19a4e0, HEAP32[RI.contexts[_0x43b670].state + 0x24 >> 2] = _0x2b7b61; switch (_0x5d0cbb.type) { case 'touchend': case 'touchstart': @@ -1265,44 +1332,44 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (0x2 !== _0x5d0cbb.button) break; _0x2c1832 = 0x29; } - _0x3d9f57 = 'touchend' === _0x5d0cbb.type ? 0x0 : 0x1; - for (let _0x443e8b = 0x0; _0x443e8b < RI.contexts.length; _0x443e8b += 0x1) HEAP8[RI.contexts[_0x443e8b].state + _0x2c1832 >> 0x0] = _0x3d9f57; + _0x3d9f57 = 'touchend' === _0x5d0cbb.type ? 0 : 1; + for (let _0x443e8b = 0; _0x443e8b < RI.contexts.length; _0x443e8b += 1) HEAP8[RI.contexts[_0x443e8b].state + _0x2c1832 >> 0x0] = _0x3d9f57; } } }; - _0x3d9f57.elements.container.addEventListener('touchstart', _0x2c1832, !0x1), _0x3d9f57.elements.container.addEventListener('touchend', _0x2c1832, !0x1); + _0x3d9f57.elements.container.addEventListener('touchstart', _0x2c1832, false), _0x3d9f57.elements.container.addEventListener('touchend', _0x2c1832, false); } else { let _0x518e5a = function(_0x45d640) { let _0x3d9f57 = new MouseEvent(_0x45d640.type, _0x45d640); _0x4d7024.Module.canvas.dispatchEvent(_0x3d9f57); }; - _0x530042.call(_this, '.' .concat(_0x449eac({ + _0x530042.call(_this, '.' .concat(getClass({ 'ejs__dialogs': true - }))).addEventListener('mousemove', _0x518e5a, !0x1), _0x530042.call(_this, '.' .concat(_0x449eac({ + }))).addEventListener('mousemove', _0x518e5a, false), _0x530042.call(_this, '.' .concat(getClass({ 'ejs__dialogs': true - }))).addEventListener('mousedown', _0x518e5a, !0x1), _0x530042.call(_this, '.' .concat(_0x449eac({ + }))).addEventListener('mousedown', _0x518e5a, false), _0x530042.call(_this, '.' .concat(getClass({ 'ejs__dialogs': true - }))).addEventListener('mouseup', _0x518e5a, !0x1); + }))).addEventListener('mouseup', _0x518e5a, false); } })(); - 'msx' === _0xc6823.system && function(_0x3c016a) { + 'msx' === getSystem(_0xc6823.system, true) && function(_0x3c016a) { if ('undefined' != typeof RI) { - document.removeEventListener('keydown', RI.eventHandler, !0x1), document.removeEventListener('keyup', RI.eventHandler, !0x1); + document.removeEventListener('keydown', RI.eventHandler, false), document.removeEventListener('keyup', RI.eventHandler, false); let _0x3d9f57 = function(_0x97e67b) { let _0x3d9f57 = _0x97e67b.keyCode, - _0x2c1832 = _0x3d9f57 >> 0x3, - _0x3340c0 = 0x1 << (0x7 & _0x3d9f57); + _0x2c1832 = _0x3d9f57 >> 3, + _0x3340c0 = 1 << (0x7 & _0x3d9f57); switch (_0x97e67b.type) { case 'keyup': case 'keydown': if (_0x2c1832 >= 0x20) throw 'key code error! bad code: ' + _0x3d9f57; - for (let _0x126f58 = 0x0; _0x126f58 < RI.contexts.length; _0x126f58++) { + for (let _0x126f58 = 0; _0x126f58 < RI.contexts.length; _0x126f58++) { let _0x4ca77a = HEAP8[RI.contexts[_0x126f58].state + _0x2c1832 >> 0x0]; 'keyup' === _0x97e67b.type ? _0x4ca77a &= ~_0x3340c0 : _0x4ca77a |= _0x3340c0, HEAP8[RI.contexts[_0x126f58].state + _0x2c1832 >> 0x0] = _0x4ca77a; } } }; - document.addEventListener('keydown', _0x3d9f57, !0x1), document.addEventListener('keyup', _0x3d9f57, !0x1); + document.addEventListener('keydown', _0x3d9f57, false), document.addEventListener('keyup', _0x3d9f57, false); } }(); setTimeout(function() { @@ -1310,26 +1377,26 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0xa88a13 = _0x59aa33.info(), null === _0xdcec2a.setVolume && 'undefined' != typeof RA ? (RA.queueAudio = function() { let _0x3d9f57, _0x2c1832 = _0xc6823.volume, _0x2cbc4 = RA.bufIndex; - _0x3d9f57 = RA.bufIndex ? RA.buffers[RA.bufIndex - 0x1].endTime : RA.context.currentTime, RA.buffers[_0x2cbc4].endTime = _0x3d9f57 + RA.buffers[_0x2cbc4].duration; + _0x3d9f57 = RA.bufIndex ? RA.buffers[RA.bufIndex - 1].endTime : RA.context.currentTime, RA.buffers[_0x2cbc4].endTime = _0x3d9f57 + RA.buffers[_0x2cbc4].duration; let _0x4e7320 = RA.context.createBufferSource(); - if (_0x4e7320.buffer = RA.buffers[_0x2cbc4], _0xc6823.muted && (_0x2c1832 = 0x0), 0x1 === _0x2c1832) _0x4e7320.connect(RA.context.destination); + if (_0x4e7320.buffer = RA.buffers[_0x2cbc4], _0xc6823.muted && (_0x2c1832 = 0), 1 === _0x2c1832) _0x4e7320.connect(RA.context.destination); else { let _0x3da8fc = RA.context.createGain(); - _0x4e7320.connect(_0x3da8fc), _0x3da8fc.connect(RA.context.destination), _0x59aa33.isEdge || 'chrome' === _0xa88a13.name && parseInt(_0xa88a13.version, 0xa) <= 0x3c || 'firefox' === _0xa88a13.name && parseInt(_0xa88a13.version, 0xa) <= 0x38 || 'opera' === _0xa88a13.name && parseInt(_0xa88a13.version, 0xa) <= 0x2c ? _0x3da8fc.gain.value = _0x2c1832 : 'firefox' === _0xa88a13.name ? _0x3da8fc.gain.setValueAtTime(_0x2c1832, RA.context.currentTime) : _0x3da8fc.gain.setValueAtTime(_0x2c1832, RA.context.currentTime, 0x0); + _0x4e7320.connect(_0x3da8fc), _0x3da8fc.connect(RA.context.destination), _0x59aa33.isEdge || 'chrome' === _0xa88a13.name && parseInt(_0xa88a13.version, 0xa) <= 0x3c || 'firefox' === _0xa88a13.name && parseInt(_0xa88a13.version, 0xa) <= 0x38 || 'opera' === _0xa88a13.name && parseInt(_0xa88a13.version, 0xa) <= 0x2c ? _0x3da8fc.gain.value = _0x2c1832 : 'firefox' === _0xa88a13.name ? _0x3da8fc.gain.setValueAtTime(_0x2c1832, RA.context.currentTime) : _0x3da8fc.gain.setValueAtTime(_0x2c1832, RA.context.currentTime, 0); } - _0x4e7320.start(_0x3d9f57), RA.bufIndex += 0x1, RA.bufOffset = 0x0; + _0x4e7320.start(_0x3d9f57), RA.bufIndex += 1, RA.bufOffset = 0; }, _0x59aa33.isIos && window.addEventListener('touchstart', function() { if (RA.context) { RA.context.resume(); let _0xa88a13 = RA.context.createBufferSource(); _0xa88a13.connect(RA.context.destination), _0xa88a13.start(); } - }, !0x1)) : _0xdcec2a.setVolume(); + }, false)) : _0xdcec2a.setVolume(); }, 0x1f4); setTimeout(function() { _0xc6823.elements.container.focus(); }, 0x1e); - void 0x0 === window.addRunDependency && (window.Module = void 0x0); + void 0 === window.addRunDependency && (window.Module = undefined); }) if (typeof _0xc6823.adUrl === 'string') { _0x1093f4.call(_0xc6823, _0x4d7024.loading.querySelector('.' .concat(_0x4fce24['close-ad'])), 'click', function(_0x96b13f) { @@ -1337,54 +1404,54 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }); } let _0x5f3757 = function(_0x2bd107) { - if (_0x4d7024.gamePatch) { - let startName = _0x4d7024.getStartName(true); - let _0x17edbf = startName.split('/'), - _0x2c1832 = _0x17edbf.pop().split('.').pop(), - _0x11dc72 = (_0x4d7024.gamePatch.split('.').pop(), _0x4d7024.gamePatch.split('/').pop().split('.').shift()), - _0x453ec0 = '' .concat(_0x17edbf.join('/'), '/').concat(_0x11dc72, '.').concat(_0x2c1832); - _0x453ec0 = _0x453ec0.replace(/\#/g, ''); - if (_0x4d7024.gamePatch.startsWith('blob:')) { - _0x453ec0 = startName; - } - let _0x5438db = _0x4d7024.gamePatch; - _0x4d7024.FS.rename(startName, _0x453ec0); - _0x2bd107.startName = _0x453ec0; - startName = _0x4d7024.getStartName(true); - if ('snes' === _0x2bd107.system || ['snes2002', 'snes2005', 'snes2010'].includes(_0x2bd107.system)) { - let _0x4758bc, _0x4b4000, _0x4aa31e, _0x2d9175 = new _0x863031(_0x4d7024.FS.readFile(startName)), - _0x567355 = _0x2d78e9(_0x2d9175), - _0x3d2ad0 = new _0x863031(_0x4d7024.FS.readFile(_0x5438db)), - _0x4a229b = _0x3d2ad0.readString(0x6), - _0x20786d = _0x2d9175._u8array.length % 0x400; - _0x4a229b.startsWith('PATCH') ? (_0x4758bc = _0x288092(_0x3d2ad0), 0x0 === _0x20786d && 'B19ED489' === _0x567355.toString(0x10).toUpperCase() && ((_0x4b4000 = new Uint8Array(_0x2d9175._u8array.length + 0x200)).set(new Uint8Array(0x200), 0x0), _0x4b4000.set(_0x2d9175._u8array, 0x200), _0x2d9175 = new _0x863031(_0x4b4000))) : _0x4a229b.startsWith(_0x7a6485) ? _0x4758bc = _0xd2202f(_0x3d2ad0) : _0x4a229b.startsWith('BPS1') && (_0x4758bc = _0x356089(_0x3d2ad0), _0x20786d > 0x0 && 'A31BEAD4' === _0x567355.toString(0x10).toUpperCase() && (_0x4b4000 = _0x2d9175._u8array.slice ? _0x2d9175._u8array.slice(_0x20786d) : _0x2d9175._u8array.subarray(_0x20786d), _0x2d9175 = new _0x863031(_0x4b4000))); - try { - if (_0x4aa31e = _0x4758bc.apply(_0x2d9175, !0x1)) { - let _0x1ffde3 = _0x4aa31e._u8array.length % 0x400; - _0x1ffde3 > 0x0 && (_0x4b4000 = _0x4aa31e._u8array.slice ? _0x4aa31e._u8array.slice(_0x1ffde3) : _0x4aa31e._u8array.subarray(_0x1ffde3), _0x4aa31e = new _0x863031(_0x4b4000)), _0x4d7024.FS.unlink(_0x5438db), _0x4d7024.FS.unlink(startName), _0x4d7024.FS.writeFile(startName, _0x4aa31e._u8array); - } - } catch (_0x2ef20f) {} - } else { - let _0x4108d8, _0x5e086b, _0x454a20 = new _0x863031(_0x4d7024.FS.readFile(startName)), - _0x4991ea = new _0x863031(_0x4d7024.FS.readFile(_0x5438db)), - _0x130f1f = _0x4991ea.readString(0x6); - _0x130f1f.startsWith('PATCH') ? _0x4108d8 = _0x288092(_0x4991ea) : _0x130f1f.startsWith(_0x7a6485) ? _0x4108d8 = _0xd2202f(_0x4991ea) : _0x130f1f.startsWith('BPS1') && (_0x4108d8 = _0x356089(_0x4991ea)); - try { - (_0x5e086b = _0x4108d8.apply(_0x454a20, !0x1)) && (_0x4d7024.FS.unlink(_0x5438db), _0x4d7024.FS.unlink(startName), _0x4d7024.FS.writeFile(startName, _0x5e086b._u8array)); - } catch (_0x3ed519) {} - } + if (_0x4d7024.gamePatch) { + let startName = _0x4d7024.getStartName(true); + let _0x17edbf = startName.split('/'), + _0x2c1832 = _0x17edbf.pop().split('.').pop(), + _0x11dc72 = (_0x4d7024.gamePatch.split('.').pop(), _0x4d7024.gamePatch.split('/').pop().split('.').shift()), + _0x453ec0 = '' .concat(_0x17edbf.join('/'), '/').concat(_0x11dc72, '.').concat(_0x2c1832); + _0x453ec0 = _0x453ec0.replace(/\#/g, ''); + if (_0x4d7024.gamePatch.startsWith('blob:')) { + _0x453ec0 = startName; } - }, + let _0x5438db = _0x4d7024.gamePatch; + _0x4d7024.FS.rename(startName, _0x453ec0); + _0x2bd107.startName = _0x453ec0; + startName = _0x4d7024.getStartName(true); + if ('snes' === getSystem(_0x2bd107.system, true) || ['snes2002', 'snes2005', 'snes2010'].includes(getSystem(_0x2bd107.system, true))) { + let _0x4758bc, _0x4b4000, _0x4aa31e, _0x2d9175 = new _0x863031(_0x4d7024.FS.readFile(startName)), + _0x567355 = _0x2d78e9(_0x2d9175), + _0x3d2ad0 = new _0x863031(_0x4d7024.FS.readFile(_0x5438db)), + _0x4a229b = _0x3d2ad0.readString(0x6), + _0x20786d = _0x2d9175._u8array.length % 0x400; + _0x4a229b.startsWith('PATCH') ? (_0x4758bc = _0x288092(_0x3d2ad0), 0 === _0x20786d && 'B19ED489' === _0x567355.toString(0x10).toUpperCase() && ((_0x4b4000 = new Uint8Array(_0x2d9175._u8array.length + 0x200)).set(new Uint8Array(0x200), 0), _0x4b4000.set(_0x2d9175._u8array, 0x200), _0x2d9175 = new _0x863031(_0x4b4000))) : _0x4a229b.startsWith(_0x7a6485) ? _0x4758bc = _0xd2202f(_0x3d2ad0) : _0x4a229b.startsWith('BPS1') && (_0x4758bc = _0x356089(_0x3d2ad0), _0x20786d > 0 && 'A31BEAD4' === _0x567355.toString(0x10).toUpperCase() && (_0x4b4000 = _0x2d9175._u8array.slice ? _0x2d9175._u8array.slice(_0x20786d) : _0x2d9175._u8array.subarray(_0x20786d), _0x2d9175 = new _0x863031(_0x4b4000))); + try { + if (_0x4aa31e = _0x4758bc.apply(_0x2d9175, false)) { + let _0x1ffde3 = _0x4aa31e._u8array.length % 0x400; + _0x1ffde3 > 0 && (_0x4b4000 = _0x4aa31e._u8array.slice ? _0x4aa31e._u8array.slice(_0x1ffde3) : _0x4aa31e._u8array.subarray(_0x1ffde3), _0x4aa31e = new _0x863031(_0x4b4000)), _0x4d7024.FS.unlink(_0x5438db), _0x4d7024.FS.unlink(startName), _0x4d7024.FS.writeFile(startName, _0x4aa31e._u8array); + } + } catch (_0x2ef20f) {} + } else { + let _0x4108d8, _0x5e086b, _0x454a20 = new _0x863031(_0x4d7024.FS.readFile(startName)), + _0x4991ea = new _0x863031(_0x4d7024.FS.readFile(_0x5438db)), + _0x130f1f = _0x4991ea.readString(0x6); + _0x130f1f.startsWith('PATCH') ? _0x4108d8 = _0x288092(_0x4991ea) : _0x130f1f.startsWith(_0x7a6485) ? _0x4108d8 = _0xd2202f(_0x4991ea) : _0x130f1f.startsWith('BPS1') && (_0x4108d8 = _0x356089(_0x4991ea)); + try { + (_0x5e086b = _0x4108d8.apply(_0x454a20, false)) && (_0x4d7024.FS.unlink(_0x5438db), _0x4d7024.FS.unlink(startName), _0x4d7024.FS.writeFile(startName, _0x5e086b._u8array)); + } catch (_0x3ed519) {} + } + } + }, _0x4bd781 = function() { let key = (_this.coreVer===2)?"INITIAL_MEMORY":"TOTAL_MEMORY" - _0x31a5b3 ? (window.Module[key] = 0x10000000, ['jaguar'].includes(_this.system) && (window.Module[key] = 0x10000000), ['nds', 'nes', 'snes', 'arcade', 'mame'].includes(_this.system) && (window.Module[key] = 0x0), ['snes2002', 'snes2005', 'snes2010'].includes(_this.system) && (window.Module[key] = 0x0), 'gba' == _this.system && (window.Module[key] = 0x0), '3do' == _this.system && (window.Module[key] = 0x0), 'n64' == _this.system && (window.Module[key] = 0x0)) : ('nes' === _this.system && (window.Module[key] = 0x8000000), window.Module[key] = _0x468801 + 0x4000000, ['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(_this.system) && (window.Module[key] = _0x468801 + 0x10000000, _0x4d7024.isMobileDevice && (window.Module[key] = 0x12c00000)), ['n64', 'nds', 'jaguar'].includes(_this.system) && (window.Module[key] = _0x468801 + 0x10000000, _0x4d7024.isMobileDevice && (window.Module[key] = 0x12c00000)), 'gba' == _this.system && (window.Module[key] = 0x10000000)), 'undefined' != typeof EJS_MEMORY && (window.Module[key] = EJS_MEMORY); + const system = getSystem(_this.system, true); + _0x31a5b3 ? (window.Module[key] = 0x10000000, ['jaguar'].includes(system) && (window.Module[key] = 0x10000000), ['nds', 'nes', 'snes', 'arcade', 'mame'].includes(system) && (window.Module[key] = 0), ['snes2002', 'snes2005', 'snes2010'].includes(system) && (window.Module[key] = 0), 'gba' == system && (window.Module[key] = 0), '3do' == system && (window.Module[key] = 0), 'n64' == system && (window.Module[key] = 0)) : ('nes' === system && (window.Module[key] = 0x8000000), window.Module[key] = _0x468801 + 0x4000000, ['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(system) && (window.Module[key] = _0x468801 + 0x10000000, _0x4d7024.isMobileDevice && (window.Module[key] = 0x12c00000)), ['n64', 'nds', 'jaguar'].includes(system) && (window.Module[key] = _0x468801 + 0x10000000, _0x4d7024.isMobileDevice && (window.Module[key] = 0x12c00000)), 'gba' == system && (window.Module[key] = 0x10000000)), 'undefined' != typeof EJS_MEMORY && (window.Module[key] = EJS_MEMORY); }, _0x3512e9 = function(_0x1bc287, _0x1844e3) { let _0x55627a = _this, _0x1cfda7 = _0x4d7024.loading.querySelector('.' .concat(_0x4fce24.p3)), - _0x429d6b = (_0x1bc287.split('.').pop(), _0x29078e[_0x1143c5]), _0xb0c5d8 = -1, - _0x567713 = '', + _0x429d6b = getSystem(_0x1143c5, _this.coreVer), _0x567717 = function() { if (_0x55627a.coreVer === 2) { _0x55627a.elements.settings.panels.home.querySelector('[role="menu"]').innerHTML = ""; @@ -1398,6 +1465,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { mainLoop(0); } } + if (typeof _0x55627a.loadStateOnStart == 'string') { fetch(_0x55627a.loadStateOnStart).then(function(response) { response.arrayBuffer().then(function(ab) { @@ -1461,37 +1529,39 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } _0xbae705.call(_0x55627a, _0x55627a.elements.container, 'start-game'); try{_0x567717();}catch(e){} - } catch (_0x4a1471) { - console.log(_0x4a1471); - _0x1cfda7.innerHTML = 'Doesn\'t look like your browser is supported'; + } catch (e) { + console.log(e); + _0x1cfda7.innerHTML = 'Failed to start game'; } } + let _0x567713 = ''; let _0x99321 = function(_0x52e6f3) { - if (_0x52e6f3.data) { - if (1 === _0x52e6f3.data.t) { - !_0x55627a.startName && _0x567713 && (_0x55627a.startName = _0x567713); - _0x52e6f3.target.terminate(); - start(_0x55627a.startName); - } - if (2 === _0x52e6f3.data.t) { - let _0x25aae3 = _0x52e6f3.data.file.split('/'), - _0x1bc287 = _0x25aae3.pop(), - _0x1844e3 = _0x1bc287.split('.').pop(); - _0x1bc287 = _0x1bc287.replace(/\#/g, ''), _0x4d7024.FS.createPath('/', _0x25aae3.join('/'), true, true); - for (let _0x36bace = _0x1e0766[_0x429d6b].length - 0x1; _0x36bace >= 0x0; _0x36bace -= 0x1) _0x1e0766[_0x429d6b][_0x36bace] === _0x1844e3.toLowerCase() && _0x36bace > _0xb0c5d8 && (_0xb0c5d8 = _0x36bace, _0x55627a.startName = ['', _0x25aae3.join('/'), _0x1bc287].join('/'), _0x55627a.startName = _0x55627a.startName.replace(/\/+/, '/')); - _0x1bc287 && (_0x4d7024.FS.createDataFile('/' .concat(_0x25aae3.join('/')), _0x1bc287, _0x52e6f3.data.data, true, !0x1), _0x468801 += _0x52e6f3.data.data.length), _0x567713 = '/' .concat(_0x25aae3.join('/'), '/').concat(_0x1bc287); - } - if (4 === _0x52e6f3.data.t && _0x52e6f3.data.total > 0) { - let _0x163fc4 = Math.floor(_0x52e6f3.data.current / _0x52e6f3.data.total * 100), - _0x5448a3 = _0x52e6f3.data.name || ''; - if (_0x163fc4 <= 100 && _0x163fc4 > 0) { - _0x1cfda7.innerHTML = _this.localization('Decompress Game Data')+_0x5448a3+' '+_0x163fc4+'%'; - } + if (_0x52e6f3.data) { + if (1 === _0x52e6f3.data.t) { + !_0x55627a.startName && _0x567713 && (_0x55627a.startName = _0x567713); + _0x52e6f3.target.terminate(); + start(_0x55627a.startName); + } + if (2 === _0x52e6f3.data.t) { + const extensions = (_0x55627a.coreVer === 2) ? _0x1e0766.newCores[_0x429d6b.toLowerCase()] : _0x1e0766.oldCores[_0x429d6b.toLowerCase()]; + let _0x25aae3 = _0x52e6f3.data.file.split('/'), + _0x1bc287 = _0x25aae3.pop(), + _0x1844e3 = _0x1bc287.split('.').pop(); + _0x1bc287 = _0x1bc287.replace(/\#/g, ''), _0x4d7024.FS.createPath('/', _0x25aae3.join('/'), true, true); + for (let _0x36bace = extensions.length - 1; _0x36bace >= 0; _0x36bace -= 1) extensions[_0x36bace] === _0x1844e3.toLowerCase() && _0x36bace > _0xb0c5d8 && (_0xb0c5d8 = _0x36bace, _0x55627a.startName = ['', _0x25aae3.join('/'), _0x1bc287].join('/'), _0x55627a.startName = _0x55627a.startName.replace(/\/+/, '/')); + _0x1bc287 && (_0x4d7024.FS.createDataFile('/' .concat(_0x25aae3.join('/')), _0x1bc287, _0x52e6f3.data.data, true, false), _0x468801 += _0x52e6f3.data.data.length), _0x567713 = '/' .concat(_0x25aae3.join('/'), '/').concat(_0x1bc287); + } + if (4 === _0x52e6f3.data.t && _0x52e6f3.data.total > 0) { + let _0x163fc4 = Math.floor(_0x52e6f3.data.current / _0x52e6f3.data.total * 100), + _0x5448a3 = _0x52e6f3.data.name || ''; + if (_0x163fc4 <= 100 && _0x163fc4 > 0) { + _0x1cfda7.innerHTML = _this.localization('Decompress Game Data')+_0x5448a3+' '+_0x163fc4+'%'; } } - }, + } + }, _0x1e67c4 = false; - if (!['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(_0x55627a.system)) { + if (!['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(getSystem(_0x55627a.system, true))) { let _0x20a78c = _0x1844e3.slice ? _0x1844e3.slice(0, 10) : _0x1844e3.subarray(0, 10), _0x1761cf = isCompressed(_0x20a78c); if (_0x1761cf === "7z") { @@ -1536,11 +1606,11 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x594488 = _0x50eb85.system; 'vbanext' == _0x594488 && (_0x594488 = 'gba'); let _0x154dc5 = (typeof _0x3cf3cf == 'string') ? _0x3cf3cf.split('/') : "ga.me", - _0x139f1c = _0x154dc5[_0x154dc5.length - 0x1]; - _0x139f1c.indexOf('?') > -0x1 && (_0x139f1c = _0x139f1c.substr(0x0, _0x139f1c.indexOf('?'))); + _0x139f1c = _0x154dc5[_0x154dc5.length - 1]; + _0x139f1c.indexOf('?') > -0x1 && (_0x139f1c = _0x139f1c.substr(0, _0x139f1c.indexOf('?'))); _0x139f1c.split('.').pop(); _0x2c1832.innerHTML = _this.localization('Download Game Data'); - if (['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(_0x17edbf.system) && _0x17edbf.config.gameParentUrl) { + if (['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(getSystem(_0x17edbf.system, true)) && _0x17edbf.config.gameParentUrl) { _0x2c1832.innerHTML += ' (2/2)'; } if (_0x17edbf.config.gamePatchUrl) { @@ -1565,8 +1635,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x43a689 = function() { _0x550f17.a.get(_0x3cf3cf, { 'onDownloadProgress': function(e) { - const progress = e.total ? ' '+Math.floor(e.loaded / e.total * 100).toString()+'%' : ''; - if (['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(_0x17edbf.system) && _0x17edbf.config.gameParentUrl) { + const progress = e.total ? ' '+Math.floor(e.loaded / e.total * 100).toString()+'%' : ' '+(e.loaded/1048576).toFixed(2)+'MB'; + if (['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(getSystem(_0x17edbf.system, true)) && _0x17edbf.config.gameParentUrl) { _0x2c1832.innerHTML = _this.localization('Download Game Data')+' (2/2)'+progress; } else if (_0x17edbf.config.gamePatchUrl) { _0x2c1832.innerHTML = _this.localization('Download Game Data')+' (2/2)'+progress; @@ -1581,6 +1651,11 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x3512e9(_0x139f1c, _0x17edbf); return; }; + if ((_this.cacheLimit && _this.cacheLimit < _0x17edbf.byteLength) || + (!_this.cacheLimit && 1073741824 < _0x17edbf.byteLength)) { + _0x3512e9(_0x139f1c, _0x17edbf); + return; + } if (_0x107e8a && _0x4e171c.db) _0x4d7024.saveFilenames.push(_0x107e8a), _0x4e171c.put(_0x107e8a, { 'filename': _0x139f1c, @@ -1589,20 +1664,20 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'key': _0x107e8a, 'lastaccess': new Date().valueOf() }); - _0x4e171c.db && _0x4e171c.put(_0x107e8a, { - 'filename': _0x139f1c, - 'filesize': _0x17edbf.length, - 'filetype': _0x7e8d4c, - 'key': _0x107e8a, - 'data': _0x17edbf - }); + _0x4e171c.db && _0x4e171c.put(_0x107e8a, { + 'filename': _0x139f1c, + 'filesize': _0x17edbf.length, + 'filetype': _0x7e8d4c, + 'key': _0x107e8a, + 'data': _0x17edbf + }); _0x3512e9(_0x139f1c, _0x17edbf); }).catch(function(_0x2e4d62) { renderErrorPage(_0x2e4d62, _0x2c1832, _this); }); }; _0x4e171c.db ? _0x4e171c.get(_0x107e8a, function(_0x5afc4a) { - if (_0x5afc4a && _0x5afc4a.filename === _0x139f1c && _0x5afc4a.filesize - _0x21b526 == 0x0 && _0x5afc4a.filetype === _0x7e8d4c && _0x5afc4a.key) + if (_0x5afc4a && _0x5afc4a.filename === _0x139f1c && _0x5afc4a.filesize - _0x21b526 == 0 && _0x5afc4a.filetype === _0x7e8d4c && _0x5afc4a.key) _0x3512e9(_0x5afc4a.filename, _0x5afc4a.data); else _0x43a689(); }) : _0x43a689(); @@ -1615,13 +1690,13 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x5c896f = _this.config.gamePatchUrl; if (_0x5c896f) { let _0x227b23 = _0x5c896f.split('/'), - _0x179b43 = _0x227b23[_0x227b23.length - 0x1]; - _0x179b43.indexOf('?') > -0x1 && (_0x179b43 = _0x179b43.substr(0x0, _0x179b43.indexOf('?'))); + _0x179b43 = _0x227b23[_0x227b23.length - 1]; + _0x179b43.indexOf('?') > -0x1 && (_0x179b43 = _0x179b43.substr(0, _0x179b43.indexOf('?'))); _0x179b43.split('.').pop(); _0x2591d9.innerHTML = _this.localization('Download Game Data')+' (1/2)'; _0x550f17.a.get(_0x5c896f, { 'onDownloadProgress': function(e) { - let progress = e.total ? ' '+Math.floor(e.loaded / e.total * 100).toString()+'%' : ''; + let progress = e.total ? ' '+Math.floor(e.loaded / e.total * 100).toString()+'%' : ' '+(e.loaded/1048576).toFixed(2)+'MB'; _0x2591d9.innerHTML = _this.localization('Download Game Data')+' (1/2)'+progress; }, 'responseType': 'arraybuffer' @@ -1631,16 +1706,16 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0xf6806b = _0x4d7024.loading.querySelector('.' .concat(_0x4fce24.p3)), _0x59c7c1 = function(_0x36004e) { if (_0x36004e.data) { - if (0x1 === _0x36004e.data.t && (_0x36004e.target.terminate(), _0x5048db()), 0x2 === _0x36004e.data.t) { + if (0x1 === _0x36004e.data.t && (_0x36004e.target.terminate(), _0x5048db()), 2 === _0x36004e.data.t) { let _0x17edbf = _0x36004e.data.file.split('/'), _0x2c1832 = _0x17edbf.pop(), _0x2b320e = _0x2c1832.split('.').pop(); - _0x4d7024.FS.createPath('/', _0x17edbf.join('/'), true, true), _0x4d7024.FS.createDataFile('/' + _0x17edbf.join('/'), _0x2c1832, _0x36004e.data.data, true, !0x1), _0x468801 += _0x36004e.data.data.length, ['ips', 'bps', 'ups'].includes(_0x2b320e) && !_0x4d7024.gamePatch && (_0x4d7024.gamePatch = '/' + _0x17edbf.join('/') + '/' + _0x2c1832); + _0x4d7024.FS.createPath('/', _0x17edbf.join('/'), true, true), _0x4d7024.FS.createDataFile('/' + _0x17edbf.join('/'), _0x2c1832, _0x36004e.data.data, true, false), _0x468801 += _0x36004e.data.data.length, ['ips', 'bps', 'ups'].includes(_0x2b320e) && !_0x4d7024.gamePatch && (_0x4d7024.gamePatch = '/' + _0x17edbf.join('/') + '/' + _0x2c1832); } - if (0x4 === _0x36004e.data.t && _0x36004e.data.total > 0x0) { + if (0x4 === _0x36004e.data.t && _0x36004e.data.total > 0) { let _0x1097ca = Math.floor(_0x36004e.data.current / _0x36004e.data.total * 0x64), _0x95ac83 = _0x36004e.data.name || ''; - _0x1097ca <= 0x64 && _0x1097ca > 0x0 && (_0xf6806b.innerHTML = _this.localization('Decompress Game Patch')+' ' .concat(_0x95ac83, ' ').concat(_0x1097ca, '%')); + _0x1097ca <= 0x64 && _0x1097ca > 0 && (_0xf6806b.innerHTML = _this.localization('Decompress Game Patch')+' ' .concat(_0x95ac83, ' ').concat(_0x1097ca, '%')); } } }, @@ -1676,10 +1751,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x17edbf = _this, _0x2c1832 = _0x4d7024.loading.querySelector('.' .concat(_0x4fce24.p3)), _0x5a21f7 = _this.config.gameParentUrl; - if (_0x5a21f7 && ['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(_0x17edbf.system)) { + if (_0x5a21f7 && ['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(getSystem(_0x17edbf.system, true))) { let _0x71bb4d = _0x5a21f7.split('/'), - _0xa1889f = _0x71bb4d[_0x71bb4d.length - 0x1]; - _0xa1889f.indexOf('?') > -0x1 && (_0xa1889f = _0xa1889f.substr(0x0, _0xa1889f.indexOf('?'))); + _0xa1889f = _0x71bb4d[_0x71bb4d.length - 1]; + _0xa1889f.indexOf('?') > -0x1 && (_0xa1889f = _0xa1889f.substr(0, _0xa1889f.indexOf('?'))); _0xa1889f.split('.').pop(); _0x2c1832.innerHTML = _this.localization('Download Game Data')+' (1/2)', _0x17edbf.config.gamePatchUrl && (_0x2c1832.innerHTML = _this.localization('Download Game Data')+' (1/3)'), _0x550f17.a.head(_0x5a21f7, {}).then(function(_0x35c23a) { let _0x17edbf = _0x35c23a.headers['content-length'], @@ -1688,7 +1763,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x31f098 = function() { _0x550f17.a.get(_0x5a21f7, { 'onDownloadProgress': function(e) { - let progress = e.total ? ' '+Math.floor(e.loaded / e.total * 100).toString()+'%' : ''; + let progress = e.total ? ' '+Math.floor(e.loaded / e.total * 100).toString()+'%' : ' '+(e.loaded/1048576).toFixed(2)+'MB'; _0x2c1832.innerHTML = _this.localization('Download Game Data')+' (1/2)'+progress; }, 'responseType': 'arraybuffer' @@ -1712,7 +1787,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } let _0x54d79 = _0xa1889f.replace(/\#/g, ''); try { - _0x468801 += _0x17edbf.length, _0x4d7024.FS.createDataFile('/', _0x54d79, _0x17edbf, true, !0x1); + _0x468801 += _0x17edbf.length, _0x4d7024.FS.createDataFile('/', _0x54d79, _0x17edbf, true, false); _0x139f68(); } catch (_0x125736) { console.log(_0x125736); @@ -1722,8 +1797,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }); }; _0x4e171c.db ? _0x4e171c.get(_0x316472, function(_0x3e612b) { - if (_0x3e612b && _0x3e612b.filename === _0xa1889f && _0x3e612b.filesize - _0x17edbf == 0x0 && _0x3e612b.filetype === _0x500ba1 && _0x3e612b.key) { - _0x4d7024.FS.createDataFile('/', _0x3e612b.filename, _0x3e612b.data, true, !0x1); + if (_0x3e612b && _0x3e612b.filename === _0xa1889f && _0x3e612b.filesize - _0x17edbf == 0 && _0x3e612b.filetype === _0x500ba1 && _0x3e612b.key) { + _0x4d7024.FS.createDataFile('/', _0x3e612b.filename, _0x3e612b.data, true, false); _0x139f68(); } else _0x31f098(); }) : _0x31f098(); @@ -1753,11 +1828,11 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (4 === _0x1e8643.data.t && _0x1e8643.data.total > 0) { let _0x149f09 = Math.floor(_0x1e8643.data.current / _0x1e8643.data.total * 0x64), _0x5e7c8b = _0x1e8643.data.name || ''; - _0x149f09 <= 0x64 && _0x149f09 > 0x0 && (_0x50119.innerHTML = 'Decompress BIOS ' .concat(_0x5e7c8b, ' ').concat(_0x149f09, '%')); + _0x149f09 <= 0x64 && _0x149f09 > 0 && (_0x50119.innerHTML = 'Decompress BIOS ' .concat(_0x5e7c8b, ' ').concat(_0x149f09, '%')); } } }), - _0x12e229 = _0x3cff36.slice ? _0x3cff36.slice(0x0, 0xa) : _0x3cff36.subarray(0x0, 0xa), + _0x12e229 = _0x3cff36.slice ? _0x3cff36.slice(0, 0xa) : _0x3cff36.subarray(0, 0xa), _0x80852b = isCompressed(_0x12e229); if (_0x80852b === '7z') { extractFile(_0x17edbf).then(function(_0x1b6a80) { @@ -1769,7 +1844,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x259be0.onmessage = _0x19a43e; _0x259be0.postMessage(_0x3cff36); }); - } else if (_0x80852b === 'zip' && !['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(_0x3ea97.system)) { + } else if (_0x80852b === 'zip' && !['arcade', 'mame', 'mame2003', 'fba0.2.97.29'].includes(getSystem(_0x3ea97.system, true))) { extractFile(_0x2c1832).then(function(_0x31c70d) { _0x31c70d.onmessage = _0x19a43e; _0x31c70d.postMessage(_0x3cff36); @@ -1783,6 +1858,17 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, _0x10b71a = function() { _0x4d7024.loading.querySelector('.' .concat(_0x4fce24.p1)).innerHTML = 'Game Core ready'; + _0x4d7024.Module._supports_states && (_0x378b5c.statesSupported = _0x4d7024.Module.cwrap('supports_states', 'number', [])); + if (_0xdcec2a.statesSupported) { + try { + _this.statesSupported = !!_0xdcec2a.statesSupported(); + _0x1e2c68.element(_this.elements.buttons.netplay) && _0x132da7(_this.elements.buttons.netplay, !_0x7f9f36.supportNetPlay.call(_this)); + _0x1e2c68.element(_this.elements.buttons.saveState) && _0x132da7(_this.elements.buttons.saveState, !_this.statesSupported); + _0x1e2c68.element(_this.elements.buttons.loadState) && _0x132da7(_this.elements.buttons.loadState, !_this.statesSupported); + _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(2), !_this.statesSupported); + _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(3), !_this.statesSupported); + }catch(e){} + } let _0x17edbf = _this.config.biosUrl; _0xdcec2a.bindFunction.call(_this); _0xdcec2a.setGamepadDialog.call(_this); @@ -1810,11 +1896,12 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x14d39f += 'video_scale = 1.0\n'; _0x14d39f += 'video_gpu_screenshot = false\n'; _0x14d39f += 'audio_latency = 96\n'; + const system = getSystem(_this.system, true); let _0x36edb7 = _0x2593da.defaultCoreOptionsValues.call(_this); - _this.lightgun && ('nes' === _this.system && (_0x14d39f += 'input_libretro_device_p2 = "258"\n'), 'segaMS' !== _this.system && 'segaMD' !== _this.system && 'segaCD' !== _this.system || (_0x36edb7.genesis_plus_gx_gun_cursor = 'yes', _0x36edb7.genesis_plus_gx_invert_mouse = 'yes', _0x36edb7.genesis_plus_gx_bram = 'per game', _0x14d39f += 'input_libretro_device_p2 = "260"\n'), 'snes' === _this.system && (_0x14d39f += 'input_libretro_device_p2 = "260"\n'), ['snes2002', 'snes2005', 'snes2010', 'snesnext'].includes(_this.system) && (_0x14d39f += 'input_libretro_device_p2 = "260"\n')); - _this.mouse && ('snes' === _this.system && (_0x14d39f += 'input_libretro_device_p1 = 2\n'), ['snes2002', 'snes2005', 'snes2010', 'snesnext'].includes(_this.system) && (_0x14d39f += 'input_libretro_device_p1 = 2\n')); - _this.multitap && (['snes2002', 'snes2005', 'snes2010', 'snesnext', 'snes'].includes(_this.system) && (_0x14d39f += 'input_libretro_device_p2 = 257\n')); - 'n64' === _this.system && (_0x14d39f += 'input_libretro_device_p1 = 5\n'); + _this.lightgun && ('nes' === system && (_0x14d39f += 'input_libretro_device_p2 = "258"\n'), 'segaMS' !== system && 'segaMD' !== system && 'segaCD' !== system || (_0x36edb7.genesis_plus_gx_gun_cursor = 'yes', _0x36edb7.genesis_plus_gx_invert_mouse = 'yes', _0x36edb7.genesis_plus_gx_bram = 'per game', _0x14d39f += 'input_libretro_device_p2 = "260"\n'), 'snes' === system && (_0x14d39f += 'input_libretro_device_p2 = "260"\n'), ['snes2002', 'snes2005', 'snes2010', 'snesnext'].includes(system) && (_0x14d39f += 'input_libretro_device_p2 = "260"\n')); + _this.mouse && ('snes' === system && (_0x14d39f += 'input_libretro_device_p1 = 2\n'), ['snes2002', 'snes2005', 'snes2010', 'snesnext'].includes(system) && (_0x14d39f += 'input_libretro_device_p1 = 2\n')); + _this.multitap && (['snes2002', 'snes2005', 'snes2010', 'snesnext', 'snes'].includes(system) && (_0x14d39f += 'input_libretro_device_p2 = 257\n')); + 'n64' === system && (_0x14d39f += 'input_libretro_device_p1 = 5\n'); _0x14d39f += 'fastforward_ratio = 1.0\n'; _0x14d39f += 'video_smooth = false\n'; let _0x55117c = _0x5dc0c0(_0x36edb7, _0x2593da.storage.get('core-options') || {}), @@ -1831,14 +1918,14 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x4d7024.FS.createDataFile('/home/web_user/.config/retroarch', 'retroarch-core-options.cfg', _0x32dd27, true, true); } if (_0x55117c && Object.keys(_0x55117c).forEach(function(_0x2950d3) { - if (_this.lightgun && 'nes' === _this.system && 'system_type' === _0x2950d3) return !0x1; + if (_this.lightgun && 'nes' === getSystem(_this.system, true) && 'system_type' === _0x2950d3) return false; _0x32dd27 += '' .concat(_0x2950d3, ' = "').concat(_0x55117c[_0x2950d3], '"\n'), _0x1093f4.call(_this, _this.elements.container, 'start-game', function(_0x362c5c) { _0xdcec2a.setVariable(_0x2950d3, _0x55117c[_0x2950d3]); }); }), _0x17edbf) { let _0x12e137 = _0x17edbf.split('/'), - _0x103241 = _0x12e137[_0x12e137.length - 0x1]; - _0x103241.indexOf('?') > -0x1 && (_0x103241 = _0x103241.substr(0x0, _0x103241.indexOf('?'))); + _0x103241 = _0x12e137[_0x12e137.length - 1]; + _0x103241.indexOf('?') > -0x1 && (_0x103241 = _0x103241.substr(0, _0x103241.indexOf('?'))); _0x103241.split('.').pop(); let _0x1f8424 = _0x4d7024.loading.querySelector('.' .concat(_0x4fce24.p2)); _0x550f17.a.head(_0x17edbf, {}).then(function(_0x4bd3bd) { @@ -1848,7 +1935,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x574747 = function() { _0x550f17.a.get(_0x17edbf, { 'onDownloadProgress': function(e) { - let progress = e.total ? ' '+Math.floor(e.loaded / e.total * 100).toString()+'%' : ''; + let progress = e.total ? ' '+Math.floor(e.loaded / e.total * 100).toString()+'%' : ' '+(e.loaded/1048576).toFixed(2)+'MB'; _0x1f8424.innerHTML = _this.localization('Download BIOS')+progress; }, 'responseType': 'arraybuffer' @@ -1865,7 +1952,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }); }; _0xa884ea.db ? _0xa884ea.get(_0x51bfef, function(_0x5cac21) { - _0x5cac21 && _0x5cac21.filename === _0x103241 && _0x5cac21.filesize - _0x8e30bf == 0x0 && _0x5cac21.filetype === _0x14309b ? _0x57d85d(_0x5cac21.filename, _0x5cac21.data) : _0x574747(); + _0x5cac21 && _0x5cac21.filename === _0x103241 && _0x5cac21.filesize - _0x8e30bf == 0 && _0x5cac21.filetype === _0x14309b ? _0x57d85d(_0x5cac21.filename, _0x5cac21.data) : _0x574747(); }) : _0x574747(); }).catch(function(_0x4f39c1) { renderErrorPage(_0x4f39c1, _0x1f8424, _this); @@ -1881,7 +1968,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x247459 = '', _0x54d695 = function() { null !== _0x4d7024.wasmData ? (window.Module.wasmBinary = _0x4d7024.wasmData, _0x4bd781(), window.Module.monitorRunDependencies = function(_0x59580a) { - 0x0 === _0x59580a && _0x10b71a(); + 0 === _0x59580a && _0x10b71a(); }, window.Module.onRuntimeInitialized = function() {}) : (_0x4bd781(), window.Module.monitorRunDependencies = function(_0x55a24a) { console.log('monitorRunDependencies, ', _0x55a24a); }, window.Module.onRuntimeInitialized = function() { @@ -1896,7 +1983,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'src': _0x18a437.createObjectURL(_0x17edbf) }); document.body.appendChild(_0x2c1832), _0x2c1832.onload = function() { - void 0x0 === window.addRunDependency && 'undefined' != typeof EmulatorJS && (_0x4d7024.Module = EmulatorJS(_0x18cb26), EmulatorJS = void 0x0); + void 0 === window.addRunDependency && 'undefined' != typeof EmulatorJS && (_0x4d7024.Module = EmulatorJS(_0x18cb26), EmulatorJS = undefined); null !== _0x4d7024.memData && (_0xc6823.coreVer !== 2) && _0x29b999(_0x4d7024.memData); _0x4d7024.Module || (_0x4d7024.Module = window.Module); _0x4d7024.Module && _0x4d7024.Module.FS ? _0x4d7024.FS = _0x4d7024.Module.FS : _0x4d7024.FS = window.FS; @@ -1904,14 +1991,14 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } else { _0x247459 = function(_0x3df03e) { let _0x17edbf = []; - for (let _0x2c1832 = 0x0; _0x2c1832 < _0x3df03e.length; _0x2c1832 += 0x1) { + for (let _0x2c1832 = 0; _0x2c1832 < _0x3df03e.length; _0x2c1832 += 1) { let _0xcf0289 = _0x3df03e[_0x2c1832]; _0xcf0289 > 0xff && (_0xcf0289 &= 0xff), _0x17edbf.push(String.fromCharCode(_0xcf0289)); } return _0x17edbf.join(''); }(_0x247459); window.eval(_0x247459); - void 0x0 === window.addRunDependency && 'undefined' != typeof EmulatorJS && (_0x4d7024.Module = EmulatorJS(_0x18cb26), EmulatorJS = void 0x0); + void 0 === window.addRunDependency && 'undefined' != typeof EmulatorJS && (_0x4d7024.Module = EmulatorJS(_0x18cb26), EmulatorJS = undefined); null !== _0x4d7024.memData && (_0xc6823.coreVer !== 2) && _0x29b999(_0x4d7024.memData); _0x4d7024.Module || (_0x4d7024.Module = window.Module); _0x4d7024.Module && _0x4d7024.Module.FS ? _0x4d7024.FS = _0x4d7024.Module.FS : _0x4d7024.FS = window.FS; @@ -1926,12 +2013,12 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }); let _0x21d6a1 = function(_0x3f49ec) { if (_0x3f49ec.data) { - if (0x1 === _0x3f49ec.data.t && (_0xbae705.call(_0xc6823, _0xc6823.elements.container, 'script-loaded'), _0x3f49ec.target.terminate()), 0x2 === _0x3f49ec.data.t) { + if (0x1 === _0x3f49ec.data.t && (_0xbae705.call(_0xc6823, _0xc6823.elements.container, 'script-loaded'), _0x3f49ec.target.terminate()), 2 === _0x3f49ec.data.t) { let _0x17edbf = _0x3f49ec.data.file.split('/').pop(), _0x58b5a7 = _0x17edbf.split('.').pop(); _0x4d7024.coreFileData[_0x17edbf] = _0x3f49ec.data.data, 'js' !== _0x58b5a7 || _0x17edbf.includes('.worker.js') || (_0x247459 = _0x3f49ec.data.data), 'mem' === _0x58b5a7 && (_0x4d7024.memData = _0x3f49ec.data.data), 'wasm' === _0x58b5a7 && (_0x4d7024.wasmData = _0x3f49ec.data.data); } - 0x4 === _0x3f49ec.data.t && _0x3f49ec.data.total > 0x0 && (_0x2c1832.innerHTML = _this.localization('Decompress Game Core')+' ' .concat(Math.floor(_0x3f49ec.data.current / _0x3f49ec.data.total * 0x64), '%')); + 4 === _0x3f49ec.data.t && _0x3f49ec.data.total > 0 && (_0x2c1832.innerHTML = _this.localization('Decompress Game Core')+' ' .concat(Math.floor(_0x3f49ec.data.current / _0x3f49ec.data.total * 0x64), '%')); } }; extractFile(_0x17edbf).then(function(_0x48c633) { @@ -2006,7 +2093,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let path = (_this.customPaths && typeof _this.customPaths[_0x16049b] == 'string') ? _this.customPaths[_0x16049b] : ((_this.coreVer === 2) ? (_this.dataPath+'cores/'+_0x16049b+'?v='+_0x55a075) : (_this.dataPath+'old/'+_0x16049b+'?v='+_0x55a075)); _0x550f17.a.get(path, { 'onDownloadProgress': function(e) { - let progress = e.total ? ' '+Math.floor(e.loaded / e.total * 100).toString()+'%' : ''; + let progress = e.total ? ' '+Math.floor(e.loaded / e.total * 100).toString()+'%' : ' '+(e.loaded/1048576).toFixed(2)+'MB'; status.innerHTML = _this.localization('Download Game Core')+progress; }, 'responseType': 'arraybuffer' @@ -2031,19 +2118,12 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }; let vJson = (_this.customPaths && typeof _this.customPaths['v.json'] == 'string') ? _this.customPaths['v.json'] : (_this.dataPath + 'v.json'); _0x550f17.a.get(vJson, {}).then(function(e) { - let _0x2458d5, _0x5d075f = _0x29078e[_this.system], - _0x28ee7f = e.data[_this.system]; + let _0x2458d5, + _0x5d075f = _0x29078e, + _0x28ee7f = e.data; + let status = _0x4d7024.loading.querySelector('.' .concat(_0x4fce24.p1)); - if (!_0x28ee7f) { - status.innerHTML = ''+_this.localization('Invalid System')+''; - return; - } - let _0x124167 = _0x28ee7f.version ? _0x28ee7f.version : 1, - //_0x254bc2 = Boolean(_0x28ee7f.netplay), - _0x5b1dcd = Boolean(_0x28ee7f.state), - _0x9a1f1 = Boolean(_0x28ee7f.asmjs), - _0x3e4345 = Boolean(_0x28ee7f.wasm); - if (!(_this.config.oldCores === true && _0x28ee7f.oldCores === 1) && _0x28ee7f.newCores === 1 && (_0x2d904a.wasm || _0x9a1f1) && !(_0x4d7024.isMobileDevice && _0x28ee7f.oldCores === 1)) { + if (!(_this.config.oldCores === true && _0x28ee7f.oldCores[_this.system]) && _0x28ee7f.newCores[getSystem(_this.system)] && (_0x2d904a.wasm || Boolean(_0x28ee7f.newCores[getSystem(_this.system)].asmjs)) && !_0x59aa33.isIos) { _this.coreVer = 2; delete Module.readAsync; Module.INITIAL_MEMORY = Module.TOTAL_MEMORY; @@ -2051,12 +2131,24 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _this.elements.settings.panels.home.querySelector('[role="menu"]').innerHTML = ""; _0x7f9f36.setNormalOptionsMenu.call(_this); _0x7f9f36.setCoreOptionsMenu.call(_this); + _0x28ee7f = _0x28ee7f.newCores[getSystem(_this.system)]; + _0x5d075f = getSystem(_this.system); + } else { + _0x28ee7f = _0x28ee7f.oldCores[_this.system]; + _0x5d075f = _0x5d075f.oldCores[_this.system]; } - if (_this.coreVer !== 2 && _0x28ee7f.old) { - _0x9a1f1 = Boolean(_0x28ee7f.old.asmjs); - _0x3e4345 = Boolean(_0x28ee7f.old.wasm); + if (!_0x28ee7f) { + status.innerHTML = ''+_this.localization('Invalid System')+''; + return; } - if ('nds' == _this.system && !_0x2d904a.wasm && _this.coreVer !== 2) { + + let _0x124167 = _0x28ee7f.version ? _0x28ee7f.version : 1, + _0x254bc2 = Boolean(_0x28ee7f.netplay), + _0x5b1dcd = Boolean(_0x28ee7f.state), + _0x9a1f1 = Boolean(_0x28ee7f.asmjs), + _0x3e4345 = Boolean(_0x28ee7f.wasm); + + if ('nds' === _this.system && !_0x2d904a.wasm && _this.coreVer !== 2) { _0x5b1dcd = false; }; if (_this.statesSupported === false) { @@ -2066,7 +2158,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x4d7024.coreFileName = _0x5d075f; let _0x2eb141 = false; ['webgl2', 'experimental-webgl2'].includes(_0x2d904a.webgl.WEBGL_CONTEXT) && (_0x2eb141 = true); - 'undefined' != typeof EJS_N64_LEGACY && 0x1 == EJS_N64_LEGACY && (_0x2eb141 = !0x1); + 'undefined' != typeof EJS_N64_LEGACY && 1 == EJS_N64_LEGACY && (_0x2eb141 = false); if ('mame' == _this.system) { let data = _this.mameCore; if (! data || data === null || data.split('|').length !== 2) { @@ -2074,7 +2166,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { return; } let _0x3787ba = data.split('|'); - _0x4d7024.coreFileName = ''.concat(_this.system, '-').concat(_0x3787ba[0x0]); + _0x4d7024.coreFileName = ''.concat(_this.system, '-').concat(_0x3787ba[0]); _0x5b1dcd = '1' === _0x3787ba[1]; _0x1e2c68.element(_this.elements.buttons.saveState) && _0x132da7(_this.elements.buttons.saveState, !_0x5b1dcd); _0x1e2c68.element(_this.elements.buttons.loadState) && _0x132da7(_this.elements.buttons.loadState, !_0x5b1dcd); @@ -2113,7 +2205,6 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { type = 'legacy-asmjs'; } } - 'undefined' != typeof EJS_CUSTOM_COREFILE && (_0x2458d5 = EJS_CUSTOM_COREFILE); if (_0x2458d5 !== true) { status.innerHTML = ''+_this.localization('Please upgrade your browser to the latest version')+''; return; @@ -2136,12 +2227,17 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } else _0x3641d6(_0x2458d5, _0x124167); }) : _0x3641d6(_0x2458d5, _0x124167); } - //_0x254bc2 || _0x1e2c68.element(_this.elements.buttons.netplay) && _0x132da7(_this.elements.buttons.netplay, true); + _0x254bc2 || _0x1e2c68.element(_this.elements.buttons.netplay) && _0x132da7(_this.elements.buttons.netplay, true); _0x1e2c68.element(_this.elements.buttons.saveState) && _0x132da7(_this.elements.buttons.saveState, !_0x5b1dcd); _0x1e2c68.element(_this.elements.buttons.loadState) && _0x132da7(_this.elements.buttons.loadState, !_0x5b1dcd); _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(2), !_0x5b1dcd); _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(3), !_0x5b1dcd); _this.statesSupported = _0x5b1dcd; + if (window.innerWidth < 400) { + _0x1e2c68.element(_this.elements.inputs.volume) && _0x132da7(_this.elements.inputs.volume, true); + _0x1e2c68.element(_this.elements.buttons.mute) && _0x132da7(_this.elements.buttons.mute, true); + _0x1e2c68.element(_this.elements.buttons.cheat) && _0x132da7(_this.elements.buttons.cheat, true); + } if (_this.config.buttons) { if (_this.config.buttons.playPause === false) { @@ -2168,6 +2264,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (_this.config.buttons.screenRecord === false) { _0x1e2c68.element(_this.elements.buttons.screenRecord) && _0x132da7(_this.elements.buttons.screenRecord, true); } + if (_this.config.buttons.cacheManager === false) { + _0x1e2c68.element(_this.elements.buttons.cacheManager) && _0x132da7(_this.elements.buttons.cacheManager, true); + } if (_this.config.buttons.gamepad === false) { _0x1e2c68.element(_this.elements.buttons.gamepad) && _0x132da7(_this.elements.buttons.gamepad, true); } @@ -2180,9 +2279,6 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (_this.config.buttons.screenshot === false) { _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(0), true); } - if (_this.config.buttons.cacheManage === true) { - _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(1), false); - } if (_this.config.buttons.quickSave === false) { _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(2), true); } @@ -2202,12 +2298,13 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } } } - let _0x27f4c4 = _0x4d7024; + let _0x27f4c4 = _0x4d7024; + const _0x4a2390 = _0x2c1832(0xa1); function _0x3c0613(_0x3eef01) { return function(_0x3d9b1e) { if (Array.isArray(_0x3d9b1e)) { - for (let _0x17edbf = 0x0, _0x2c1832 = new Array(_0x3d9b1e.length); _0x17edbf < _0x3d9b1e.length; _0x17edbf++) _0x2c1832[_0x17edbf] = _0x3d9b1e[_0x17edbf]; + for (let _0x17edbf = 0, _0x2c1832 = new Array(_0x3d9b1e.length); _0x17edbf < _0x3d9b1e.length; _0x17edbf++) _0x2c1832[_0x17edbf] = _0x3d9b1e[_0x17edbf]; return _0x2c1832; } }(_0x3eef01) || function(_0x425c1a) { @@ -2218,34 +2315,34 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } function _0xa08ac0(_0x514af5, _0x4089be) { - for (let _0x2c1832 = 0x0; _0x2c1832 < _0x4089be.length; _0x2c1832++) { + for (let _0x2c1832 = 0; _0x2c1832 < _0x4089be.length; _0x2c1832++) { let _0x3347c8 = _0x4089be[_0x2c1832]; - _0x3347c8.enumerable = _0x3347c8.enumerable || !0x1, _0x3347c8.configurable = true, 'value' in _0x3347c8 && (_0x3347c8.writable = true), Object.defineProperty(_0x514af5, _0x3347c8.key, _0x3347c8); + _0x3347c8.enumerable = _0x3347c8.enumerable || false, _0x3347c8.configurable = true, 'value' in _0x3347c8 && (_0x3347c8.writable = true), Object.defineProperty(_0x514af5, _0x3347c8.key, _0x3347c8); } } let _0x1eda08, _0x4fc27f, _0xf43a92, _0x214f42, _0x3a9bfc, _0x4d8495 = (_0x1eda08 = ['a[href]', 'area[href]', 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', 'select:not([disabled]):not([aria-hidden])', 'textarea:not([disabled]):not([aria-hidden])', 'button:not([disabled]):not([aria-hidden])', 'iframe', 'object', 'embed', '[contenteditable]', '[tabindex]:not([tabindex^="-"])'], _0x4fc27f = function() { function _0x5566a2(_0x1fcb21) { let _0x2c1832 = _0x1fcb21.targetModal, _0x29e6ab = _0x1fcb21.triggers, - _0x114128 = void 0x0 === _0x29e6ab ? [] : _0x29e6ab, + _0x114128 = void 0 === _0x29e6ab ? [] : _0x29e6ab, _0x5211ae = _0x1fcb21.onShow, - _0x402faa = void 0x0 === _0x5211ae ? function() {} : _0x5211ae, + _0x402faa = void 0 === _0x5211ae ? function() {} : _0x5211ae, _0x120cc3 = _0x1fcb21.onClose, - _0x48ad1c = void 0x0 === _0x120cc3 ? function() {} : _0x120cc3, + _0x48ad1c = void 0 === _0x120cc3 ? function() {} : _0x120cc3, _0x6a1522 = _0x1fcb21.openTrigger, - _0x306932 = void 0x0 === _0x6a1522 ? 'data-micromodal-trigger' : _0x6a1522, + _0x306932 = void 0 === _0x6a1522 ? 'data-micromodal-trigger' : _0x6a1522, _0x446302 = _0x1fcb21.closeTrigger, - _0x2f0676 = void 0x0 === _0x446302 ? 'data-micromodal-close' : _0x446302, + _0x2f0676 = void 0 === _0x446302 ? 'data-micromodal-close' : _0x446302, _0x2a4c0e = _0x1fcb21.disableScroll, - _0x2297fa = void 0x0 !== _0x2a4c0e && _0x2a4c0e, + _0x2297fa = void 0 !== _0x2a4c0e && _0x2a4c0e, _0x5a3f47 = _0x1fcb21.disableFocus, - _0x4a8131 = void 0x0 !== _0x5a3f47 && _0x5a3f47, + _0x4a8131 = void 0 !== _0x5a3f47 && _0x5a3f47, _0x42179f = _0x1fcb21.awaitCloseAnimation, - _0x27da4d = void 0x0 !== _0x42179f && _0x42179f, + _0x27da4d = void 0 !== _0x42179f && _0x42179f, _0x1b535e = _0x1fcb21.debugMode, - _0x33d8ca = void 0x0 !== _0x1b535e && _0x1b535e, + _0x33d8ca = void 0 !== _0x1b535e && _0x1b535e, _0xee6cb0 = _0x1fcb21.closeByEsckey, - _0x54de6a = void 0x0 === _0xee6cb0 || _0xee6cb0; + _0x54de6a = void 0 === _0xee6cb0 || _0xee6cb0; ! function(_0x27e736, _0x56010c) { if (!(_0x27e736 instanceof _0x56010c)) throw new TypeError('Cannot call a class as a function'); }(this, _0x5566a2), this.modal = document.getElementById(_0x2c1832), this.config = { @@ -2258,13 +2355,13 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'awaitCloseAnimation': _0x27da4d, 'disableFocus': _0x4a8131, 'closeByEsckey': _0x54de6a - }, _0x114128.length > 0x0 && this.registerTriggers.apply(this, _0x3c0613(_0x114128)), this.onClick = this.onClick.bind(this), this.onKeydown = this.onKeydown.bind(this); + }, _0x114128.length > 0 && this.registerTriggers.apply(this, _0x3c0613(_0x114128)), this.onClick = this.onClick.bind(this), this.onKeydown = this.onKeydown.bind(this); } let _0x17edbf, _0x2c1832, _0x5021cc; return _0x17edbf = _0x5566a2, (_0x2c1832 = [{ 'key': 'registerTriggers', 'value': function() { - for (let _0x5566a2 = this, _0x17edbf = arguments.length, _0x2c1832 = new Array(_0x17edbf), _0x4e24fa = 0x0; _0x4e24fa < _0x17edbf; _0x4e24fa++) _0x2c1832[_0x4e24fa] = arguments[_0x4e24fa]; + for (let _0x5566a2 = this, _0x17edbf = arguments.length, _0x2c1832 = new Array(_0x17edbf), _0x4e24fa = 0; _0x4e24fa < _0x17edbf; _0x4e24fa++) _0x2c1832[_0x4e24fa] = arguments[_0x4e24fa]; _0x2c1832.forEach(function(_0x511ded) { _0x511ded.addEventListener('click', function() { return _0x5566a2.showModal(); @@ -2274,7 +2371,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, { 'key': 'showModal', 'value': function() { - this.activeElement = document.activeElement, this.modal.setAttribute('aria-hidden', 'false'), this.modal.classList.add(_0x449eac({ + this.activeElement = document.activeElement, this.modal.setAttribute('aria-hidden', 'false'), this.modal.classList.add(getClass({ 'is-open': true })), this.setFocusToFirstNode(), this.addEventListeners(), this.config.onShow(this.modal); } @@ -2283,10 +2380,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'value': function() { let _0x5566a2 = this.modal; this.modal.setAttribute('aria-hidden', 'true'), this.removeEventListeners(), this.config.onClose(this.modal), this.config.awaitCloseAnimation ? this.modal.addEventListener('animationend', function _0x17edbf() { - _0x5566a2.classList.remove(_0x449eac({ + _0x5566a2.classList.remove(getClass({ 'is-open': true - })), _0x5566a2.removeEventListener('animationend', _0x17edbf, !0x1); - }, !0x1) : _0x5566a2.classList.remove(_0x449eac({ + })), _0x5566a2.removeEventListener('animationend', _0x17edbf, false); + }, false) : _0x5566a2.classList.remove(getClass({ 'is-open': true })); } @@ -2323,7 +2420,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'value': function() { if (!this.config.disableFocus) { let _0x5566a2 = this.getFocusableNodes(); - _0x5566a2.length && _0x5566a2[0x0].focus(); + _0x5566a2.length && _0x5566a2[0].focus(); } } }, { @@ -2332,15 +2429,15 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x17edbf = this.getFocusableNodes(); if (this.modal.contains(document.activeElement)) { let _0x2c1832 = _0x17edbf.indexOf(document.activeElement); - _0x15092b.shiftKey && 0x0 === _0x2c1832 && (_0x17edbf[_0x17edbf.length - 0x1].focus(), _0x15092b.preventDefault()), _0x15092b.shiftKey || _0x2c1832 !== _0x17edbf.length - 0x1 || (_0x17edbf[0x0].focus(), _0x15092b.preventDefault()); - } else _0x17edbf[0x0].focus(); + _0x15092b.shiftKey && 0 === _0x2c1832 && (_0x17edbf[_0x17edbf.length - 1].focus(), _0x15092b.preventDefault()), _0x15092b.shiftKey || _0x2c1832 !== _0x17edbf.length - 1 || (_0x17edbf[0].focus(), _0x15092b.preventDefault()); + } else _0x17edbf[0].focus(); } }]) && _0xa08ac0(_0x17edbf.prototype, _0x2c1832), _0x5021cc && _0xa08ac0(_0x17edbf, _0x5021cc), _0x5566a2; }(), _0xf43a92 = null, _0x214f42 = function(_0x31caa5) { - if (!document.getElementById(_0x31caa5)) return !0x1; + if (!document.getElementById(_0x31caa5)) return false; }, _0x3a9bfc = function(_0x48c135, _0x61240d) { if (function(_0x28b4fb) { - _0x28b4fb.length <= 0x0 && (console.warn('MicroModal v' .concat(version, ': ❗Please specify at least one %c\'micromodal-trigger\''), 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', 'data attribute.'), console.warn('%cExample:', 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', '')); + _0x28b4fb.length <= 0 && (console.warn('MicroModal v' .concat(version, ': ❗Please specify at least one %c\'micromodal-trigger\''), 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', 'data attribute.'), console.warn('%cExample:', 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', '')); }(_0x48c135), !_0x61240d) return true; for (let _0x2c1832 in _0x61240d) _0x214f42(_0x2c1832); return true; @@ -2354,10 +2451,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x2c1832 = []; return _0x5e363a.forEach(function(_0x305145) { let _0x13d441 = _0x305145.attributes[_0x9390ce].value; - void 0x0 === _0x2c1832[_0x13d441] && (_0x2c1832[_0x13d441] = []), _0x2c1832[_0x13d441].push(_0x305145); + void 0 === _0x2c1832[_0x13d441] && (_0x2c1832[_0x13d441] = []), _0x2c1832[_0x13d441].push(_0x305145); }), _0x2c1832; }(_0x2c1832, _0x17edbf.openTrigger); - if (true !== _0x17edbf.debugMode || !0x1 !== _0x3a9bfc(_0x2c1832, _0x537e55)) + if (true !== _0x17edbf.debugMode || false !== _0x3a9bfc(_0x2c1832, _0x537e55)) for (let _0x383dff in _0x537e55) { let _0x34a8e0 = _0x537e55[_0x383dff]; _0x17edbf.targetModal = _0x383dff, _0x17edbf.triggers = _0x3c0613(_0x34a8e0), new _0x4fc27f(_0x17edbf); @@ -2365,7 +2462,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, 'show': function(_0x2a3fcf, _0x472cd6) { let _0x2c1832 = _0x472cd6 || {}; - return _0x2c1832.targetModal = _0x2a3fcf, true === _0x2c1832.debugMode && !0x1 === _0x214f42(_0x2a3fcf) ? _0xf43a92 = null : (_0xf43a92 = new _0x4fc27f(_0x2c1832)).showModal(), _0xf43a92; + return _0x2c1832.targetModal = _0x2a3fcf, true === _0x2c1832.debugMode && false === _0x214f42(_0x2a3fcf) ? _0xf43a92 = null : (_0xf43a92 = new _0x4fc27f(_0x2c1832)).showModal(), _0xf43a92; }, 'close': function() { _0xf43a92.closeModal(); @@ -2563,15 +2660,15 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'saveLoadDB': function(type) { try { if (!_0x378b5c.saveLoaddbDB.db) return false; - if (_0x2593da && typeof _0x2593da.getCoreOptionsValues == 'function') { - let location = _0x2593da.getCoreOptionsValues()['save-state-location']; + if (_0x2593da && typeof _0x2593da.getCoreOptionsValue === 'function') { + let location = _0x2593da.getCoreOptionsValue('save-state-location'); if (!location || location === 'download') { return false; } if (!this.getStartName()) return false; - let slot = _0x2593da.getCoreOptionsValues()['save-state-slot']; - let game = this.getStartName(); + let slot = _0x2593da.getCoreOptionsValue('save-state-slot'); if (!slot) return false; + let game = this.getStartName(); let key = game + '-' + slot; (async function() { if (type === 'save') { @@ -2593,18 +2690,31 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { return false; } }, + 'disableInput': false, + 'disableControl': function(control) { + if (control) { + for (var _0x17edbf = 0x0; _0x17edbf < 0x18; _0x17edbf += 0x1) _0x378b5c.simulateInputFn(0x0, _0x17edbf, 0x0), _0x378b5c.simulateInputFn(0x1, _0x17edbf, 0x0), _0x378b5c.simulateInputFn(0x2, _0x17edbf, 0x0), _0x378b5c.simulateInputFn(0x3, _0x17edbf, 0x0); + _0x378b5c.disableInput = true; + } else _0x378b5c.disableInput = false; + }, + 'loadRoomsListTimer': null, + 'loadRoomsList': function() {}, + 'stopLoadRooms': function() { + _0x378b5c.loadRoomsListTimer && clearTimeout(_0x378b5c.loadRoomsListTimer); + }, + 'openRoom': function() {}, 'gamepad': null, 'allowCheat': true, 'connection': null, - 'connected': !0x1, + 'connected': false, 'playerName': '', 'players': [], 'waitingList': {}, 'roomMaster': null, 'inputsData': {}, 'coreOptionData': {}, - 'currentFrame': 0x0, - 'wait': !0x1, + 'currentFrame': 0, + 'wait': false, 'progressHelper': {}, 'icons': { 'lock': '' @@ -2617,6 +2727,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'toggleShader': null, 'saveState': null, 'screenRecord': null, + 'cacheManager': null, 'loadState': null, 'quickSaveState': null, 'quickLoadState': null, @@ -2627,144 +2738,142 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'resetCheat': null, 'getGameCoreOptions': null, 'classNames': { - 'dialog-container': _0x449eac({ + 'dialog-container': getClass({ 'dialog-container': true }), - 'tabs': _0x449eac({ + 'tabs': getClass({ 'tabs': true }), - 'dialog-title': _0x449eac({ + 'dialog-title': getClass({ 'dialog-title': true }), - 'dialog-content': _0x449eac({ + 'dialog-content': getClass({ 'dialog-content': true }), - 'dialog-buttons': _0x449eac({ + 'dialog-buttons': getClass({ 'dialog-buttons': true }), - 'overlay': _0x449eac({ + 'overlay': getClass({ 'overlay': true }), - 'key-setting-popup': _0x449eac({ + 'key-setting-popup': getClass({ 'key-setting-popup': true }), - 'tabs-panel': _0x449eac({ + 'tabs-panel': getClass({ 'tabs-panel': true }), - 'tabs-content': _0x449eac({ + 'tabs-content': getClass({ 'tabs-content': true }), - 'button-container': _0x449eac({ + 'button-container': getClass({ 'button-container': true }), - 'set': _0x449eac({ + 'set': getClass({ 'set': true }), - 'active': _0x449eac({ + 'active': getClass({ 'active': true }), - 'btn-cancel': _0x449eac({ + 'btn-cancel': getClass({ 'btn-cancel': true }), - 'btn-reset': _0x449eac({ + 'btn-reset': getClass({ 'btn-reset': true }), - 'btn-clear': _0x449eac({ + 'btn-clear': getClass({ 'btn-clear': true }), - 'btn-create': _0x449eac({ + 'btn-create': getClass({ 'btn-create': true }), - 'btn-submit': _0x449eac({ + 'btn-submit': getClass({ 'btn-submit': true }), - 'btn-join-room': _0x449eac({ + 'btn-join-room': getClass({ 'btn-join-room': true }), - 'btn-quit': _0x449eac({ + 'btn-quit': getClass({ 'btn-quit': true }), - 'btn-create-room': _0x449eac({ + 'btn-create-room': getClass({ 'btn-create-room': true }), - /* - 'netplay-player-name': _0x449eac({ + 'netplay-player-name': getClass({ 'netplay-player-name': true }), - 'netplay-roomlist': _0x449eac({ + 'netplay-roomlist': getClass({ 'netplay-roomlist': true }), - 'netplay-room-name-input': _0x449eac({ + 'netplay-room-name-input': getClass({ 'netplay-room-name-input': true }), - 'netplay-room-password-input': _0x449eac({ + 'netplay-room-password-input': getClass({ 'netplay-room-password-input': true }), - 'netplay-create-room-set': _0x449eac({ + 'netplay-create-room-set': getClass({ 'netplay-create-room-set': true }), - 'netplay-room': _0x449eac({ + 'netplay-room': getClass({ 'netplay-room': true }), - */ - 'modal': _0x449eac({ + 'modal': getClass({ 'modal': true }), - 'modal__overlay': _0x449eac({ + 'modal__overlay': getClass({ 'modal__overlay': true }), - 'modal__container': _0x449eac({ + 'modal__container': getClass({ 'modal__container': true }), - 'modal__header': _0x449eac({ + 'modal__header': getClass({ 'modal__header': true }), - 'modal__title': _0x449eac({ + 'modal__title': getClass({ 'modal__title': true }), - 'modal__close': _0x449eac({ + 'modal__close': getClass({ 'modal__close': true }), - 'modal__content': _0x449eac({ + 'modal__content': getClass({ 'modal__content': true }), - 'modal__btn': _0x449eac({ + 'modal__btn': getClass({ 'modal__btn': true }), - 'modal__btn-primary': _0x449eac({ + 'modal__btn-primary': getClass({ 'modal__btn-primary': true }), - 'micromodal-slide': _0x449eac({ + 'micromodal-slide': getClass({ 'micromodal-slide': true }), - 'modal__errmsg': _0x449eac({ + 'modal__errmsg': getClass({ 'modal__errmsg': true }), - 'modal__footer': _0x449eac({ + 'modal__footer': getClass({ 'modal__footer': true }), - 'cheats-add': _0x449eac({ + 'cheats-add': getClass({ 'cheats-add': true }), - 'cheats-list': _0x449eac({ + 'cheats-list': getClass({ 'cheats-list': true }), - 'cheat-code-input': _0x449eac({ + 'cheat-code-input': getClass({ 'cheat-code-input': true }), - 'cheat-name-input': _0x449eac({ + 'cheat-name-input': getClass({ 'cheat-name-input': true }), - 'ejs-switch': _0x449eac({ + 'ejs-switch': getClass({ 'ejs-switch': true }), - 'ejs-delete-cheat': _0x449eac({ + 'ejs-delete-cheat': getClass({ 'ejs-delete-cheat': true }) }, 'initShaders': function() { const _0xa88a13 = shaders; - for (let _0x17edbf = Object.keys(_0xa88a13), _0x2c1832 = '', _0x26fb6a = 0x0; _0x26fb6a < _0x17edbf.length; _0x26fb6a += 0x1) _0x2c1832 = _0xa88a13[_0x17edbf[_0x26fb6a]], _0x27f4c4.FS.writeFile('/shader/' .concat(_0x17edbf[_0x26fb6a]), _0x2c1832), _0x2593da.storage.get('shader') === _0x17edbf[_0x26fb6a] && _0x27f4c4.FS.writeFile('/shader/shader.glslp', _0x2c1832); + for (let _0x17edbf = Object.keys(_0xa88a13), _0x2c1832 = '', _0x26fb6a = 0; _0x26fb6a < _0x17edbf.length; _0x26fb6a += 1) _0x2c1832 = _0xa88a13[_0x17edbf[_0x26fb6a]], _0x27f4c4.FS.writeFile('/shader/' .concat(_0x17edbf[_0x26fb6a]), _0x2c1832), _0x2593da.storage.get('shader') === _0x17edbf[_0x26fb6a] && _0x27f4c4.FS.writeFile('/shader/shader.glslp', _0x2c1832); }, 'setGamepadDialog': function() { let _this = this; @@ -2773,7 +2882,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x17edbf = '\n '), _0x2c1832 = '\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n '+_this.localization('Set')+'\n
\n
\n
') let _0x48ee51; - if ('nes' === _this.system) { + if ('nes' === getSystem(_this.system, true)) { _0x48ee51 = { 0: 'B', 2: 'SELECT', @@ -2787,7 +2896,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 25: _this.localization('QUICK LOAD STATE'), 26: _this.localization('CHANGE STATE SLOT') } - } else if ('snes' === _this.system) { + } else if ('snes' === getSystem(_this.system, true)) { _0x48ee51 = { 0: 'B', 1: 'Y', @@ -2805,7 +2914,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 25: _this.localization('QUICK LOAD STATE'), 26: _this.localization('CHANGE STATE SLOT') }; - } else if ('n64' === _this.system) { + } else if ('n64' === getSystem(_this.system, true)) { _0x48ee51 = { 0: 'B', 3: 'START', @@ -2835,7 +2944,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x48ee51[1] = 'B'; delete _0x48ee51[8]; } - } else if ('nds' === _this.system) { + } else if ('nds' === getSystem(_this.system, true)) { _0x48ee51 = { 0: 'B', 1: 'Y', @@ -2885,7 +2994,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 26: _this.localization('CHANGE STATE SLOT') }; } - if (['arcade', 'mame'].includes(_this.system)) { + if (['arcade', 'mame'].includes(getSystem(_this.system, true))) { _0x48ee51[2] = _this.localization('INSERT COIN'); } if (_this.statesSupported === false) { @@ -2898,14 +3007,14 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _this.elements.dialogs.gamepad.querySelector('.' .concat(_0x378b5c.classNames['tabs-content'])).innerHTML += _0x17edbf.replace(/{index}/g, _0x88827f), _0x501790.forEach(function(_0x1bf162) { _0x48ee51[_0x1bf162] && (_this.elements.dialogs.gamepad.querySelector('#controls-' .concat(_0x88827f)).innerHTML += _0x2c1832.replace(/{index}/g, _0x88827f).replace(/{id}/g, _0x1bf162).replace(/{label}/g, _0x48ee51[_0x1bf162])); }), _this.elements.dialogs.gamepad.querySelector('[data-id="16"][data-index="' .concat(_0x88827f, '"][data-type="2"]')) && (_this.elements.dialogs.gamepad.querySelector('[data-id="16"][data-index="' .concat(_0x88827f, '"][data-type="2"]')).style.backgroundColor = '#ccc'), _this.elements.dialogs.gamepad.querySelector('[data-id="17"][data-index="' .concat(_0x88827f, '"][data-type="2"]')) && (_this.elements.dialogs.gamepad.querySelector('[data-id="17"][data-index="' .concat(_0x88827f, '"][data-type="2"]')).style.backgroundColor = '#ccc'), _this.elements.dialogs.gamepad.querySelector('[data-id="18"][data-index="' .concat(_0x88827f, '"][data-type="2"]')) && (_this.elements.dialogs.gamepad.querySelector('[data-id="18"][data-index="' .concat(_0x88827f, '"][data-type="2"]')).style.backgroundColor = '#ccc'), _this.elements.dialogs.gamepad.querySelector('[data-id="19"][data-index="' .concat(_0x88827f, '"][data-type="2"]')) && (_this.elements.dialogs.gamepad.querySelector('[data-id="19"][data-index="' .concat(_0x88827f, '"][data-type="2"]')).style.backgroundColor = '#ccc'), _this.elements.dialogs.gamepad.querySelector('[data-id="20"][data-index="' .concat(_0x88827f, '"][data-type="2"]')) && (_this.elements.dialogs.gamepad.querySelector('[data-id="20"][data-index="' .concat(_0x88827f, '"][data-type="2"]')).style.backgroundColor = '#ccc'), _this.elements.dialogs.gamepad.querySelector('[data-id="21"][data-index="' .concat(_0x88827f, '"][data-type="2"]')) && (_this.elements.dialogs.gamepad.querySelector('[data-id="21"][data-index="' .concat(_0x88827f, '"][data-type="2"]')).style.backgroundColor = '#ccc'), _this.elements.dialogs.gamepad.querySelector('[data-id="22"][data-index="' .concat(_0x88827f, '"][data-type="2"]')) && (_this.elements.dialogs.gamepad.querySelector('[data-id="22"][data-index="' .concat(_0x88827f, '"][data-type="2"]')).style.backgroundColor = '#ccc'), _this.elements.dialogs.gamepad.querySelector('[data-id="23"][data-index="' .concat(_0x88827f, '"][data-type="2"]')) && (_this.elements.dialogs.gamepad.querySelector('[data-id="23"][data-index="' .concat(_0x88827f, '"][data-type="2"]')).style.backgroundColor = '#ccc'); - }, _0x3f0824 = 0x0; _0x3f0824 <= 0x3; _0x3f0824 += 0x1) _0x50fd12(_0x3f0824); + }, _0x3f0824 = 0; _0x3f0824 <= 3; _0x3f0824 += 1) _0x50fd12(_0x3f0824); Object.keys(_0x378b5c.controllers).forEach(function(_0x23d419) { _0x378b5c.controllers[_0x23d419] && Object.keys(_0x378b5c.controllers[_0x23d419]).forEach(function(_0x21e62d) { let _0x294e35 = _this.elements.dialogs.gamepad.querySelector('[data-id="' .concat(_0x21e62d, '"][data-index="').concat(_0x23d419, '"][data-type="1"]')), _0x1849bc = _this.elements.dialogs.gamepad.querySelector('[data-id="' .concat(_0x21e62d, '"][data-index="').concat(_0x23d419, '"][data-type="2"]')); - if (!_0x294e35 || !_0x1849bc) return !0x1; + if (!_0x294e35 || !_0x1849bc) return false; let _0x19d43b = _0x378b5c.controllers[_0x23d419][_0x21e62d]; - _0x19d43b && (_0x19d43b.type && 0x1 !== parseInt(_0x19d43b.type, 0xa) ? _0x1849bc.value = '' : _0x19d43b.value && (_0x294e35.value = _0x378b5c.keyMap[_0x19d43b.value] || '', _0x294e35.setAttribute('data-value', _0x19d43b.value)), _0x19d43b.value2 && (_0x1849bc.value = isNaN(_0x19d43b.value2) ? (_0x19d43b.value2) : ('button ' .concat(parseInt(_0x19d43b.value2, 0xa) + 0x1)), _0x1849bc.setAttribute('data-value', _0x19d43b.value2))); + _0x19d43b && (_0x19d43b.type && 1 !== parseInt(_0x19d43b.type, 0xa) ? _0x1849bc.value = '' : _0x19d43b.value && (_0x294e35.value = _0x378b5c.keyMap[_0x19d43b.value] || '', _0x294e35.setAttribute('data-value', _0x19d43b.value)), _0x19d43b.value2 && (_0x1849bc.value = isNaN(_0x19d43b.value2) ? (_0x19d43b.value2) : ('button ' .concat(parseInt(_0x19d43b.value2, 0xa) + 1)), _0x1849bc.setAttribute('data-value', _0x19d43b.value2))); }); }), _0x1093f4.call(this, _this.elements.dialogs.gamepad.querySelector('.' .concat(_0x378b5c.classNames['btn-submit'])), 'click', function(_0x5f19bd) { let _0x2c1832 = _this.elements.dialogs.gamepad.querySelectorAll('input'), @@ -2913,12 +3022,12 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { return Array.from(_0x2c1832).forEach(function(_0x33c024) { let _0x5f19bd, _0x2c1832 = _0x33c024.getAttribute('data-index'), _0x124d0a = _0x33c024.getAttribute('data-value'); - 0x2 === parseInt(_0x33c024.getAttribute('data-type'), 0xa) && (_0x5f19bd = _0x33c024.getAttribute('data-value')); + 2 === parseInt(_0x33c024.getAttribute('data-type'), 0xa) && (_0x5f19bd = _0x33c024.getAttribute('data-value')); let _0x54b9af = _0x33c024.getAttribute('data-id'); _0x2844f7[_0x2c1832] || (_0x2844f7[_0x2c1832] = {}), _0x2844f7[_0x2c1832][_0x54b9af] || (_0x2844f7[_0x2c1832][_0x54b9af] = {}), _0x124d0a && (_0x2844f7[_0x2c1832][_0x54b9af].value = _0x124d0a), _0x5f19bd && (_0x2844f7[_0x2c1832][_0x54b9af].value2 = _0x5f19bd); }), _0x2593da.storage.set({ 'controllers': _0x2844f7 - }), _0x378b5c.controllers = _0x2844f7, _0x132da7(_this.elements.dialogs.gamepad, true), _this.elements.container.focus(), _0x5f19bd.stopPropagation(), !0x1; + }), _0x378b5c.controllers = _0x2844f7, _0x132da7(_this.elements.dialogs.gamepad, true), _this.elements.container.focus(), _0x5f19bd.stopPropagation(), false; }), _0x1093f4.call(this, _this.elements.dialogs.gamepad.querySelector('.' .concat(_0x378b5c.classNames['btn-reset'])), 'click', function(_0x5f19bd) { _0x378b5c.controllers = JSON.parse(JSON.stringify(_0x378b5c.defaultControllers)) localStorage.removeItem(_0x2593da.storage.key) @@ -2956,7 +3065,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x2c1832[i].setAttribute('data-value', ''); } }), _0x1093f4.call(this, _this.elements.dialogs.gamepad.querySelector('.' .concat(_0x378b5c.classNames['btn-cancel'])), 'click', function(_0x16d598) { - return _0x132da7(_this.elements.dialogs.gamepad, true), _this.elements.container.focus(), _0x16d598.stopPropagation(), !0x1; + return _0x132da7(_this.elements.dialogs.gamepad, true), _this.elements.container.focus(), _0x16d598.stopPropagation(), false; }), Array.from(_this.elements.dialogs.gamepad.querySelectorAll('.' .concat(_0x378b5c.classNames.tabs, ' li'))).forEach(function(_0x523f7b) { _0x1093f4.call(_this, _0x523f7b, 'mousedown', function(_0xa99a78) { _0x3a8e2f(_this.elements.dialogs.gamepad.querySelectorAll('.' .concat(_0x378b5c.classNames.tabs, ' li')), _0x378b5c.classNames.active, false); @@ -2983,7 +3092,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x4e649c = _0x2c1832.getAttribute('data-id'), _0x431719 = _0x2c1832.getAttribute('data-index'), _0x4a6f6f = _0x2c1832.getAttribute('data-label'); - _0x132da7(_0x11b11a, !0x1), _0x11b11a.setAttribute('data-id', _0x4e649c); + _0x132da7(_0x11b11a, false), _0x11b11a.setAttribute('data-id', _0x4e649c); _0x11b11a.setAttribute('data-index', _0x431719); let _0x179623 = '[ ' .concat(_0x4a6f6f, ' ]'); _0x378b5c.gamepad.gamepads[_0x431719] && _0x4e649c < 16 ? _0x179623 += '
Gamepad:' .concat(_0x378b5c.gamepad.gamepads[_0x431719].id, '
'+_this.localization('Press keyboard or gamepad')+'
'+_this.localization('Press escape (esc) to clear')) : _0x179623 += '
Press keyboard
'+_this.localization('Press escape (esc) to clear'), _0x11b11a.querySelector('.' .concat(_0x378b5c.classNames['key-setting-popup'])).innerHTML = _0x179623, _0x1e1d79.stopPropagation(); @@ -2992,16 +3101,22 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, 'setCacheDialog': function() { let _this = this; - _this.elements.dialogs.cache.innerHTML = '\n
\n
\n

'+_this.localization('Cache Manager')+'

\n
\n
\n\n
\n \n
\n '), _0x1093f4.call(this, _this.elements.dialogs.cache.querySelector('.' .concat(_0x378b5c.classNames['btn-cancel'])), 'click', function(_0x5d6721) { - return _0x132da7(_this.elements.dialogs.cache, true), _this.elements.container.focus(), _0x5d6721.stopPropagation(), !0x1; - }), _0x1093f4.call(this, _this.elements.dialogs.cache.querySelector('.' .concat(_0x378b5c.classNames['dialog-title'], ' a')), 'click', function(_0x46992d) { - return _0x27f4c4.romdb && (_0x27f4c4.romdb.clear(), _this.elements.dialogs.cache.querySelector('.' .concat(_0x378b5c.classNames['dialog-content'])).innerHTML = '
'+_this.localization('Empty')+'
'), _0x46992d.stopPropagation(), !0x1; - }); + _this.elements.dialogs.cache.innerHTML = '\n
\n
\n

'+_this.localization('Cache Manager')+'

\n
\n
\n\n
\n \n
\n '; + + _0x1093f4.call(this, _this.elements.dialogs.cache.querySelector('.' .concat(_0x378b5c.classNames['btn-cancel'])), 'click', function(_0x5d6721) { + return _0x132da7(_this.elements.dialogs.cache, true), _this.elements.container.focus(), _0x5d6721.stopPropagation(), false; + }) + _0x1093f4.call(this, _this.elements.dialogs.cache.querySelector('.' .concat(_0x378b5c.classNames['btn-clear-all'])), 'click', function(_0x5d6721) { + return _0x27f4c4.romdb && (_0x27f4c4.romdb.clear(), _this.elements.dialogs.cache.querySelector('.' .concat(_0x378b5c.classNames['dialog-content'])).innerHTML = '
'+_this.localization('Empty')+'
'), _0x46992d.stopPropagation(), false; + }) + _0x1093f4.call(this, _this.elements.dialogs.cache.querySelector('.' .concat(_0x378b5c.classNames['dialog-title'], ' a')), 'click', function(_0x46992d) { + return _0x27f4c4.romdb && (_0x27f4c4.romdb.clear(), _this.elements.dialogs.cache.querySelector('.' .concat(_0x378b5c.classNames['dialog-content'])).innerHTML = '
'+_this.localization('Empty')+'
'), _0x46992d.stopPropagation(), false; + }) }, 'showLoading': function(_0x108b55) { _0x4d8495.show('modal-6ed698f3d04061f5', { - 'closeByEsckey': !0x1 - }), _0x108b55 && console.log(''), _0x132da7(this.elements.dialogs.loading, !0x1); + 'closeByEsckey': false + }), _0x108b55 && console.log(''), _0x132da7(this.elements.dialogs.loading, false); }, 'hideLoading': function() { _0x4d8495.close(), _0x132da7(this.elements.dialogs.loading, true); @@ -3017,7 +3132,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x1093f4.call(this, _this.elements.dialogs.cheat.querySelector('.' .concat(_0x378b5c.classNames['cheats-add'])), 'click', function(_0x2a74b5) { return _0x4d8495.show('modal-85cd7a1c543a484b', { 'closeTrigger': 'data-modal-close' - }), !0x1; + }), false; }); let _0x2c1832 = _this.elements.dialogs.cheat.querySelector('.' .concat(_0x378b5c.classNames['cheats-list'])); _0x1093f4.call(this, _0x17edbf.querySelector('.' .concat(_0x378b5c.classNames['modal__btn-primary'])), 'click', function(_0x1c01ce) { @@ -3048,8 +3163,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x2c1832.innerHTML = ''; if (_this.cheats && Array.isArray(_this.cheats)) { _this.cheats.forEach(function(_0x245035, _0x116996) { - let _0x4ac35a = _0x245035[0x0]; - _0x245035[0x1]; + let _0x4ac35a = _0x245035[0]; + _0x245035[1]; _0x2c1832.innerHTML += '
\n \n \n ×\n
'); }); } @@ -3057,22 +3172,22 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x1093f4.call(_this, _0x2c1832, 'click', function(_0x576733) { if (_0x576733.target && _0x576733.target.classList.contains(_0x378b5c.classNames['ejs-delete-cheat']) && _0x576733.target.getAttribute('data-idx')) { let _0x5b10b7 = _0x576733.target.getAttribute('data-idx'); - _this.cheats.splice(_0x5b10b7, 0x1); + _this.cheats.splice(_0x5b10b7, 1); if ('localStorage' in window && _this.getStartName()) { localStorage.setItem('' .concat(_this.system, '-').concat(_this.getStartName(), '-cheats'), JSON.stringify(_this.cheats)); } let _0x557895 = []; _0x2c1832.querySelectorAll('input').forEach(function(_0xab0ba8, _0x1f3597) { _0x557895[_0x1f3597] = !!_0x2c1832.querySelector('#ejs-cheat-switch-' .concat(_0x1f3597, ':checked')); - }), _0x557895.splice(_0x5b10b7, 0x1), _0x257001(), _0x557895.forEach(function(_0x2e22be, _0x2247c4) { + }), _0x557895.splice(_0x5b10b7, 1), _0x257001(), _0x557895.forEach(function(_0x2e22be, _0x2247c4) { _0x2e22be && _0x2c1832.querySelector('#ejs-cheat-switch-' .concat(_0x2247c4)).setAttribute('checked', 'checked'); }); } - return _0x576733.stopPropagation(), !0x1; + return _0x576733.stopPropagation(), false; }), _0x1093f4.call(_this, _this.elements.container, 'start-game', function(_0x4c266e) { _0x257001(); }), _0x1093f4.call(this, _this.elements.dialogs.cheat.querySelector('.' .concat(_0x378b5c.classNames['btn-cancel'])), 'click', function(_0x4adb2c) { - return _0x132da7(_this.elements.dialogs.cheat, true), _0x4adb2c.stopPropagation(), _this.elements.container.focus(), !0x1; + return _0x132da7(_this.elements.dialogs.cheat, true), _0x4adb2c.stopPropagation(), _this.elements.container.focus(), false; }), _0x1093f4.call(this, _this.elements.dialogs.cheat.querySelector('.' .concat(_0x378b5c.classNames['btn-submit'])), 'click', function(_0x5785f6) { _0x378b5c.resetCheat(); _0x2c1832.querySelectorAll('input:checked').forEach(function(_0xeb7426, _0x45b02d) { @@ -3082,21 +3197,385 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x132da7(_this.elements.dialogs.cheat, true); _this.elements.container.focus(); return false; - }), 'arcade' !== _this.system && 'mame' !== _this.system && 'mame2003' !== _this.system && 'mame2010' !== _this.system || (_0x1e2c68.element(_this.elements.buttons.cheat) && _0x132da7(_this.elements.buttons.cheat, true), _0x378b5c.allowCheat = !0x1), _0x378b5c.setCheat || (_0x132da7(_this.elements.buttons.cheat, true), _0x378b5c.allowCheat = !0x1); + }), 'arcade' !== getSystem(_this.system, true) && 'mame' !== getSystem(_this.system, true) && 'mame2003' !== getSystem(_this.system, true) && 'mame2010' !== getSystem(_this.system, true) || (_0x1e2c68.element(_this.elements.buttons.cheat) && _0x132da7(_this.elements.buttons.cheat, true), _0x378b5c.allowCheat = false), _0x378b5c.setCheat || (_0x132da7(_this.elements.buttons.cheat, true), _0x378b5c.allowCheat = false); } }, - /* 'setNetplayDialog': function() { - let _this = this, - _0x17edbf = this; + var _0xa88a13 = this, + _0x17edbf = this, + _this = this; if (_0x17edbf.elements.dialogs.netplay) { - _0x17edbf.elements.dialogs.netplay.innerHTML = '\n
\n
\n

'+_0x17edbf.localization('Netplay')+'

\n
\n
\n \n\n \n
\n \n
\n\n \n \n \n \n \n \n \n \n \n \n '); - - _0x1093f4.call(this, _0x17edbf.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['btn-cancel'])), 'click', function(_0x3d4554) { - return _0x132da7(_0x17edbf.elements.dialogs.netplay, true), _0x3d4554.stopPropagation(), _0x17edbf.elements.container.focus(), !0x1; - }); + _0x17edbf.elements.dialogs.netplay.innerHTML = '\n
\n
\n

'+_0x17edbf.localization('Netplay')+'

\n
\n
\n \n\n \n
\n \n
\n\n \n \n \n \n \n \n \n \n \n \n '), _0x1093f4.call(this, _0x17edbf.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['btn-cancel'])), 'click', function(_0x3d4554) { + return _0x132da7(_0x17edbf.elements.dialogs.netplay, true), _0x378b5c.disableControl(!0x1), _0x378b5c.stopLoadRooms(), _0x3d4554.stopPropagation(), _0x17edbf.elements.container.focus(), !0x1; + }), window.setInterval(function() { + var _0xa88a13 = '', _0x17edbf.elements.widgets.netplay.innerHTML = _0xa88a13; + }, 0x1f4); + var _0x2c1832 = _0x17edbf.elements.dialogs.netplay.querySelector('#modal-9de6c4e9ce2b9361'), + _0x36bde0 = _0x17edbf.elements.dialogs.netplay.querySelector('#modal-85cd7a1c543a484a'), + _0x5289c1 = _0x17edbf.elements.dialogs.netplay.querySelector('#modal-7d8fd50ed642340b'), + _0x325651 = _0x17edbf.elements.dialogs.netplay.querySelector('#modal-5aa765d61d8327de'), + _0x3d0d28 = {}; + _0x378b5c.connection = new _0x4a2390.a(); + var _0x10d51e = _0xa88a13.socketUrl; + if (! _0x10d51e.endsWith('/')) { + _0x10d51e += '/'; + }; + _0x378b5c.connection.socketURL = '/', _0x378b5c.connection.socketURL = _0x10d51e, _0x378b5c.connection.socketMessageEvent = 'emulatorjs-message', _0x378b5c.connection.socketCustomEvent = 'emulatorjs-custom-message'; + var _0xda20e9 = _0x59aa33.info(); + _0x378b5c.connection.extra = { + 'name': _0x378b5c.playerName, + 'game_id': _0x17edbf.config.gameId, + 'browser_name': _0xda20e9.name, + 'room_name': ' ', + 'domain': document.domain } - },*/ + _0x378b5c.connection.socketMessageEvent = 'netplay'; + _0x378b5c.connection.enableFileSharing = true; + _0x378b5c.connection.enableLogs = true; + _0x378b5c.connection.session = { + 'data': true + }; + _0x378b5c.connection.sdpConstraints.mandatory = { + 'OfferToReceiveAudio': false, + 'OfferToReceiveVideo': false + } + _0x378b5c.connection.onclose = function() {}; + + //TODO - I do not want to use webrtc + /* + _0x378b5c.connection.iceServers = [{ + 'urls': ['stun:webrtcweb.com:7788'], + 'username': 'muazkh', + 'credential': 'muazkh' + }, { + 'urls': ['turn:webrtcweb.com:7788', 'turn:webrtcweb.com:8877', 'turn:webrtcweb.com:4455'], + 'username': 'muazkh', + 'credential': 'muazkh' + }, { + 'urls': ['stun:stun.l.google.com:19302', 'stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302', 'stun:stun.l.google.com:19302?transport=udp'] + }]*/ + _0x378b5c.connection.maxParticipantsAllowed = 4; + _0x378b5c.netPlayInitFrame = 0; + var _0x1eb137 = 0, + _0x52eb7d = false; + Module.postMainLoop = function() { + var _0xa88a13; + if (_0x378b5c.currentFrame = parseInt(_0x378b5c.currentFrameNum(), 0xa), _0x378b5c.connected) { + if (_0x1eb137 += 0x1, _0x378b5c.connection.isInitiator) _0x1eb137 >= 0x1 && function() { + for (var _0xa88a13 = [], _0x17edbf = _0x378b5c.currentFrame - 0x1; _0x17edbf < _0x378b5c.currentFrame; _0x17edbf += 0x1) _0x378b5c.inputsData[_0x17edbf] ? _0x378b5c.inputsData[_0x17edbf].forEach(function(_0x2a02da, _0x1b2066) { + _0xa88a13.push('' .concat(_0x2a02da.index, '|').concat(_0x2a02da.key, '|').concat(_0x2a02da.status, '|').concat(_0x2a02da.frame)); + }) : _0xa88a13.push('-1|||' .concat(_0x17edbf)); + _0x378b5c.connection.send(JSON.stringify({ + 'act': 'sync-control', + 'value': _0xa88a13 + })), _0x1eb137 = 0x0, _0x378b5c.currentFrame % 0x64 == 0x0 && Object.keys(_0x378b5c.inputsData).forEach(function(_0x3125e4, _0x31ea67) { + _0x3125e4 < _0x378b5c.currentFrame - 0x32 && (_0x378b5c.inputsData[_0x3125e4] = null, delete _0x378b5c.inputsData[_0x3125e4]); + }); + }(); + else { + if (_0x378b5c.coreOptionData[_0x378b5c.currentFrame]) { + var _0x2c1832 = _0x378b5c.coreOptionData[_0x378b5c.currentFrame].key, + _0x4fd0cc = _0x378b5c.coreOptionData[_0x378b5c.currentFrame].value; + _0x2593da.updateCoreOptions.call(_0x17edbf, _0x2c1832, _0x4fd0cc), delete _0x378b5c.coreOptionData[_0x378b5c.currentFrame]; + } + if (_0x378b5c.currentFrame <= 0x0 || _0x378b5c.inputsData[_0x378b5c.currentFrame]) _0x378b5c.wait = !0x1, _0x378b5c.systemPause(0x0), _0x27f4c4.Module.resumeMainLoop(), _0xa88a13 = _0x378b5c.inputsData[_0x378b5c.currentFrame], _0x378b5c.inputsData[_0x378b5c.currentFrame] = null, delete _0x378b5c.inputsData[_0x378b5c.currentFrame], _0xa88a13 || (_0xa88a13 = []), _0xa88a13.forEach(function(_0x4bb42f, _0x28928a) { + _0x4bb42f.index >= 0x0 && _0x378b5c.simulateInputFn(_0x4bb42f.index, _0x4bb42f.key, _0x4bb42f.status); + }); + else { + _0x378b5c.wait = true, _0x378b5c.systemPause(0x1), _0x27f4c4.Module.pauseMainLoop(); + var _0x3a10d1 = !0x1, + _0x42763c = Object.keys(_0x378b5c.inputsData); + 0x0 == _0x42763c.length && (_0x3a10d1 = true); + for (var _0x58af15 = 0x0; _0x58af15 < _0x42763c.length; _0x58af15 += 0x1) { + if (_0x42763c[_0x58af15] > _0x378b5c.currentFrame) { + console.log('lost', _0x378b5c.currentFrame), _0x3a10d1 = true; + break; + } + } + _0x3a10d1 ? _0x378b5c.wait || (!_0x52eb7d || _0x52eb7d < new Date().valueOf() - 0xbb8) && (_0x378b5c.inputsData = {}, _0x52eb7d = new Date().valueOf(), _0x378b5c.connection.send(JSON.stringify({ + 'act': 'sync-mem', + 'value': _0x378b5c.connection.userid + }), _0x378b5c.roomMaster)) : (_0x378b5c.wait = true, _0x378b5c.systemPause(0x1), _0x27f4c4.Module.pauseMainLoop()); + } + _0x378b5c.currentFrame % 0x64 == 0x0 && Object.keys(_0x378b5c.inputsData).forEach(function(_0x3aa393, _0x3a7829) { + _0x3aa393 < _0x378b5c.currentFrame - 0x32 && (_0x378b5c.inputsData[_0x3aa393] = null, delete _0x378b5c.inputsData[_0x3aa393]); + }); + } + } + } + _0x378b5c.connection.onopen = function(userid) { + console.log('open', userid); + _0x378b5c.connected = true, _0x378b5c.connection.isInitiator && (-0x1 === _0x378b5c.players.indexOf(userid) && (_0x378b5c.players.filter(function(_0x3eafb3, _0xabd7b7) { + return null == _0x3eafb3; + }).length > 0x0 ? _0x378b5c.players.forEach(function(_0xbf0f19, _0xa9d540) { + null != _0xbf0f19 || _0x378b5c.players.includes(userid) || (_0x378b5c.players[_0xa9d540] = userid); + }) : _0x378b5c.players.push(userid)), _0x378b5c.connection.send(JSON.stringify({ + 'act': 'get-players-result', + 'value': _0x378b5c.players, + 'coreOptions': _0x2593da.coreOptionsValues, + 'newuser': userid, + 'master': _0x378b5c.connection.userid + }))), _0x2593da.updateCoreOptionMenuItems.call(_0x17edbf); + } + + _0x378b5c.connection.onFileStart = function(_0x50eb3a) { + var _0x2c1832 = _0x50eb3a.name.split('-'); + 'reset' !== _0x2c1832[0x0] && 0x0 != _0x2c1832[0x0] || (_0x378b5c.inputsData = {}, _0x378b5c.disableControl(true)); + _0x378b5c.showLoading.call(_0x17edbf); + _0x378b5c.connection.isInitiator ? (_0x378b5c.wait = true, _0x378b5c.systemPause(0x1), _0x27f4c4.Module.pauseMainLoop()) : _0x378b5c.inputsData = {}; + } + _0x378b5c.connection.onFileEnd = function(_0x45d454) { + _0x378b5c.hideLoading.call(_0x17edbf); + var _0x2c1832 = _0x45d454.name.split('-'), + _0x3795d9 = _0x2c1832[0x0] >> 0x0; + 'reset' === _0x2c1832[0x0] ? (_0x3795d9 = 0x0, _0x378b5c.connection.isInitiator ? (_0x378b5c.systemPause(0x0), _0x378b5c.disableControl(!0x1), _0x17edbf.playing = true, _0x27f4c4.Module.resumeMainLoop()) : _0x550f17.a.get(_0x45d454.url, { + 'responseType': 'arraybuffer' + }).then(function(_0x37db4c) { + _0x378b5c.inputsData = {}; + var _0x2c1832 = new Uint8Array(_0x37db4c.data); + _0x378b5c.loadState(_0x2c1832, _0x3795d9), _0x378b5c.wait = !0x1, _0x378b5c.systemPause(0x0), _0x378b5c.disableInput = !0x1, _0x17edbf.playing = true, _0x27f4c4.Module.resumeMainLoop(); + })) : 'game.state' === _0x2c1832[0x1] && (_0x378b5c.connection.isInitiator ? (_0x378b5c.openRoom(_0x17edbf), _0x378b5c.wait = !0x1, _0x378b5c.systemPause(0x0), _0x27f4c4.Module.resumeMainLoop()) : (_0x378b5c.netPlayInitFrame = _0x3795d9, _0x550f17.a.get(_0x45d454.url, { + 'responseType': 'arraybuffer' + }).then(function(_0x4d241b) { + var _0x2c1832 = new Uint8Array(_0x4d241b.data); + _0x378b5c.loadState(_0x2c1832, _0x3795d9), _0x378b5c.wait = !0x1, _0x378b5c.disableInput = !0x1, _0x378b5c.connection.send(JSON.stringify({ + 'act': 'wait-end', + 'value': _0x378b5c.connection.userid + })), _0x378b5c.hideLoading.call(_0x17edbf), _0x17edbf.playing = true, _0x27f4c4.Module.resumeMainLoop(); + }))), _0x378b5c.connection.isInitiator || console.log('recv mem end', _0x378b5c.currentFrame, _0x45d454.name); + }; + + var _0x3bdb35 = !0x1; + _0x378b5c.connection.onmessage = function(_0x32e81a) { + var _0x2c1832, _0x2dca58 = _0x32e81a.data || _0x32e81a; + try { + _0x2c1832 = JSON.parse(_0x2dca58); + } catch (_0x3fb9cc) { + _0x2c1832 = null; + } + if (_0x2c1832) { + if ('room-master' === _0x2c1832.act && (_0x378b5c.roomMaster = _0x2c1832.value), _0x2c1832.act, 'short-pause' === _0x2c1832.act && (_0x3bdb35 || (_0x378b5c.systemPause(0x1), _0x27f4c4.Module.pauseMainLoop(), _0x3bdb35 = true, _0x378b5c.wait = true, setTimeout(function() { + _0x378b5c.systemPause(0x0), _0x27f4c4.Module.resumeMainLoop(), _0x378b5c.wait = !0x1, _0x3bdb35 = !0x1; + }, 0x30))), 'sync-control' === _0x2c1832.act) { + var _0xb051c1 = _0x2c1832.value; + _0x17edbf.playing || _0x378b5c.wait; + var _0x2ef644 = _0x378b5c.connection.userid; + _0x378b5c.players.indexOf(_0x2ef644); + _0x378b5c.connection.isInitiator, _0xb051c1.forEach(function(_0x308105, _0x383237) { + var _0x2c1832 = _0x308105.split('|'), + _0x25a5c4 = _0x2c1832[0x0] >> 0x0, + _0x2b3afd = _0x2c1832[0x1] >> 0x0, + _0x4f5761 = _0x2c1832[0x2] >> 0x0, + _0x249303 = _0x2c1832[0x3] >> 0x0, + _0x54e0fd = _0x378b5c.currentFrame; + _0x378b5c.inputsData[_0x249303] || (_0x378b5c.inputsData[_0x249303] = []), -0x1 !== _0x25a5c4 && _0x249303 === _0x54e0fd && _0x378b5c.simulateInputFn(_0x25a5c4, _0x2b3afd, _0x4f5761), _0x378b5c.connection.isInitiator ? _0x25a5c4 >= 0x0 && (_0x378b5c.inputsData[_0x54e0fd] || (_0x378b5c.inputsData[_0x54e0fd] = []), -0x2 != _0x2b3afd && (_0x378b5c.inputsData[_0x54e0fd].push({ + 'index': _0x25a5c4, + 'key': _0x2b3afd, + 'status': _0x4f5761, + 'frame': _0x54e0fd + }), _0x378b5c.simulateInputFn(_0x25a5c4, _0x2b3afd, _0x4f5761)), _0x3bdb35 || _0x54e0fd - 0xa >= _0x249303 && (_0x378b5c.systemPause(0x1), _0x27f4c4.Module.pauseMainLoop(), _0x3bdb35 = true, _0x378b5c.wait = true, setTimeout(function() { + _0x378b5c.systemPause(0x0), _0x27f4c4.Module.resumeMainLoop(), _0x378b5c.wait = !0x1, _0x3bdb35 = !0x1; + }, 0x30))) : ('' !== _0x25a5c4 && _0x378b5c.inputsData[_0x249303].push({ + 'index': _0x25a5c4, + 'key': _0x2b3afd, + 'status': _0x4f5761, + 'frame': _0x249303 + }), _0x378b5c.inputsData[_0x378b5c.currentFrame] && _0x27f4c4.Module.resumeMainLoop(), _0x54e0fd + 0xa <= _0x249303 && _0x249303 > _0x378b5c.netPlayInitFrame + 0x64 && _0x378b5c.connection.send(JSON.stringify({ + 'act': 'short-pause', + 'value': _0x2ef644 + }), _0x378b5c.roomMaster)); + }); + } + if (_0x2c1832.act, _0x2c1832.act, 'update-core-option' === _0x2c1832.act && (_0x378b5c.connection.isInitiator || (_0x378b5c.coreOptionData[_0x2c1832.frame] = { + 'key': _0x2c1832.key, + 'value': _0x2c1832.value + })), 'restart-game' === _0x2c1832.act && (_0x378b5c.inputsData = {}, _0x378b5c.connection.send(JSON.stringify({ + 'act': 'sync-mem', + 'value': _0x378b5c.connection.userid + }), _0x378b5c.roomMaster)), 'pause' === _0x2c1832.act && _0x27f4c4.Module.pauseMainLoop(), 'resume' === _0x2c1832.act && _0x27f4c4.Module.resumeMainLoop(), 'wait' === _0x2c1832.act && (_0x378b5c.wait = true, _0x378b5c.systemPause(0x1), _0x2c1832.value !== _0x378b5c.connection.userid && (_0x378b5c.waitingList[_0x2c1832.value] = 0x1), _0x378b5c.disableControl(true)), 'wait-end' === _0x2c1832.act && (_0x378b5c.waitingList[_0x2c1832.value] && delete _0x378b5c.waitingList[_0x2c1832.value], 0x0 === Object.keys(_0x378b5c.waitingList).length && (_0x378b5c.wait = !0x1, _0x378b5c.systemPause(0x0), _0x378b5c.disableInput = !0x1)), 'sync-mem' === _0x2c1832.act) { + _0x378b5c.wait = true, _0x378b5c.systemPause(0x1); + var _0x2a5bce = _0x2c1832.value; + _0x378b5c.disableControl(true), _0x378b5c.connection.send(JSON.stringify({ + 'act': 'wait', + 'value': _0x2a5bce + })); + (async () => { + const state = await _0x378b5c.saveState(); + _0x27f4c4.FS.createDataFile('/', 'game.state', state, true, true); + _0x27f4c4.Module.cwrap('load_state', 'number', ['string', 'number'])('game.state', 0); + //_0x27f4c4.FS.unlink('game.state'); + _0x378b5c.inputsData = {}; + const file = new File([state], '0-game.state', { + 'type': '', + 'lastModified': new Date() + }); + _0x378b5c.connection.shareFile(file, _0x2a5bce); + })() + } + if (_0x2c1832.act, 'get-players-result' === _0x2c1832.act && (_0x378b5c.players = _0x2c1832.value, _0x378b5c.roomMaster = _0x2c1832.master, _0x2c1832.newuser === _0x378b5c.connection.userid)) { + var _0x418ccb = _0x2593da.coreOptionsValues; + _0x2c1832.coreOptions && Object.keys(_0x2c1832.coreOptions).forEach(function(_0x3f4c8f) { + _0x418ccb[_0x3f4c8f] !== _0x2c1832.coreOptions[_0x3f4c8f] && _0x2593da.updateCoreOptions.call(_0x17edbf, _0x3f4c8f, _0x2c1832.coreOptions[_0x3f4c8f]); + }), _0x378b5c.showLoading.call(_0x17edbf), _0x378b5c.disableControl(true), setTimeout(function() { + _0x378b5c.connection.send(JSON.stringify({ + 'act': 'sync-mem', + 'value': _0x378b5c.connection.userid + }), _0x378b5c.roomMaster); + }, 0x1), _0x378b5c.roomMaster && _0x378b5c.connection.peers[_0x378b5c.roomMaster] && (_0x378b5c.connection.extra.room_name = _0x378b5c.connection.peers[_0x378b5c.roomMaster].extra.room_name, _0x378b5c.connection.updateExtraData()), _0x378b5c.connection.peers[_0x378b5c.roomMaster] && (_0x3d0d28 = _0x378b5c.connection.peers[_0x378b5c.roomMaster].extra), _0x378b5c.openRoom(_0x17edbf); + } + } + }, _0x378b5c.connection.onUserStatusChanged = function(_0x4188ba) { + console.log('userstatuschanged', _0x4188ba); + if ('offline' === _0x4188ba.status) { + var _0x17edbf = _0x378b5c.players.indexOf(_0x4188ba.userid); + _0x17edbf >= 0x0 && (_0x378b5c.players[_0x17edbf] = null); + } + _0x4188ba.status; + }, _0x378b5c.connection.onExtraDataUpdated = function(_0x20ce61) { + console.log('onExtraDataUpdated', _0x20ce61, _0x378b5c.connection.peers); + _0x20ce61.userid === _0x378b5c.connection.userid && (_0x378b5c.connection.extra = _0x20ce61.extra); + }, _0x378b5c.connection.onleave = function(_0x30ebc6) { + console.log('onleave', _0x30ebc6); + if (_0x30ebc6.userid) { + var _0x2c1832 = _0x378b5c.players.indexOf(_0x30ebc6.userid); + _0x2c1832 >= 0x0 && (_0x378b5c.players[_0x2c1832] = null); + } + _0x378b5c.waitingList[_0x30ebc6.userid] && delete _0x378b5c.waitingList[_0x30ebc6.userid], _0x378b5c.connection.isInitiator && 0x0 === Object.keys(_0x378b5c.waitingList).length && _0x378b5c.wait && (_0x378b5c.wait = !0x1, _0x378b5c.systemPause(0x0), _0x378b5c.disableInput = !0x1, _0x378b5c.connection.send(JSON.stringify({ + 'act': 'wait-end', + 'value': _0x378b5c.connection.userid + }))), _0x378b5c.openRoom(_0x17edbf), _0x378b5c.inputsData = {}, _0x378b5c.hideLoading.call(_0x17edbf); + }; + var _0x2fba43 = function() { + _0x378b5c.connected = !0x1, _0x378b5c.connection.password = null, _0x378b5c.players = [], _0x378b5c.connection.peersBackup = [], _0x378b5c.waitingList = {}, _0x378b5c.inputsData = {}, _0x378b5c.hideLoading.call(_0x17edbf), _0x132da7(_0x17edbf.elements.buttons.restart, !0x1), _0x132da7(_0x17edbf.elements.buttons.loadState, !0x1), _0x132da7(_0x17edbf.elements.buttons.saveState, !0x1), _0x378b5c.allowCheat && _0x132da7(_0x17edbf.elements.buttons.cheat, !0x1), _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(0x2), !0x1), _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(0x3), !0x1), Array.from(_0x17edbf.elements.buttons.play).forEach(function(_0x3d296d) { + _0x132da7(_0x3d296d, !0x1); + }), _0x2593da.updateCoreOptionMenuItems.call(_0x17edbf); + }; + _0x378b5c.connection.close = _0x2fba43, _0x378b5c.connection.disconnect = _0x2fba43, _0x378b5c.connection.leave = _0x2fba43; + var _0x3f9c57, _0x10c0ad = function(_0x42ff74, _0x306f0b, _0x345d4d) { + _0x378b5c.hideLoading.call(_0x17edbf), _0x42ff74 ? (_0x378b5c.stopLoadRooms(), _0x132da7(_0x17edbf.elements.buttons.restart, true), _0x132da7(_0x17edbf.elements.buttons.loadState, true), _0x132da7(_0x17edbf.elements.buttons.saveState, true), _0x378b5c.resetCheat(), _0x132da7(_0x17edbf.elements.buttons.cheat, true), _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(0x2), true), _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(0x3), true), Array.from(_0x17edbf.elements.buttons.play).forEach(function(_0x2911fb) { + _0x132da7(_0x2911fb, true); + }), _0x378b5c.connection.socket && _0x378b5c.connection.socket.on('set-isInitiator-true', function(_0x31da46) { + _0x31da46 === _0x378b5c.connection.sessionid && (_0x378b5c.connection.socket.emit('extra-data-updated', _0x378b5c.connection.extra), _0x378b5c.connection.send(JSON.stringify({ + 'act': 'room-master', + 'value': _0x378b5c.connection.userid + })), _0x378b5c.roomMaster = _0x378b5c.connection.userid, _0x378b5c.systemPause(0x0), _0x27f4c4.Module.resumeMainLoop(), _0x2593da.updateCoreOptionMenuItems.call(_0x17edbf), _0x132da7(_0x17edbf.elements.buttons.restart, !0x1), _0x132da7(_0x17edbf.elements.buttons.loadState, !0x1), _0x132da7(_0x17edbf.elements.buttons.saveState, !0x1), Array.from(_0x17edbf.elements.buttons.play).forEach(function(_0x132034) { + _0x132da7(_0x132034, !0x1); + })); + })) : (_0x4d8495.close(), _0x5289c1.querySelector('#modal-7d8fd50ed642340b-content').innerHTML = _0x345d4d, _0x4d8495.show('modal-7d8fd50ed642340b', { + 'closeTrigger': 'data-modal-close' + })); + }, + _0x1e0cdb = function(_0x5b3f13) { + var _0x2c1832 = _0x5b3f13.target.getAttribute('data-id'); + if ('Y' === _0x5b3f13.target.getAttribute('data-password')) _0x4d8495.show('modal-5aa765d61d8327de', { + 'closeTrigger': 'data-modal-close' + }), _0x325651.setAttribute('data-id', _0x2c1832); + else { + _0x378b5c.showLoading.call(_0x17edbf), _0x378b5c.connection.userid = _0x378b5c.connection.token(); + try { + _0x378b5c.connection.join(_0x2c1832, _0x10c0ad); + } catch (_0x2767b9) { + _0x378b5c.hideLoading.call(_0x17edbf), _0x5289c1.querySelector('#modal-7d8fd50ed642340b-content').innerHTML = 'Error', _0x4d8495.show('modal-7d8fd50ed642340b', { + 'closeTrigger': 'data-modal-close' + }); + } + } + return _0x5b3f13.stopPropagation(), !0x1; + }; + _0x378b5c.loadRoomsList = function() { + _0x132da7(_0x17edbf.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['netplay-roomlist'])), !0x1), _0x132da7(_0x17edbf.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['netplay-room'])), true), _0x132da7(_0x17edbf.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['btn-create-room'])), !0x1), _0x132da7(_0x17edbf.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['btn-quit'])), true); + var listUrl = _0x17edbf.listUrl + if (! listUrl.endsWith('/')) { + listUrl += '/'; + }; + var _0x2c1832 = _0x17edbf.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['netplay-roomlist'])).querySelector('tbody'), + _0x5cf2be = [listUrl, 'list?game_id=', _0x17edbf.config.gameId, '&domain=', document.domain].join(''); + _0x550f17.a.get(_0x5cf2be, {}).then(function(_0x37c60b) { + if (_0x37c60b.data) { + var _0x4782da = [], + _0x28e87d = []; + _0x2c1832.querySelectorAll('tr').forEach(function(_0x1e5a22) { + _0x28e87d.push(_0x1e5a22.getAttribute('id')); + }), Object.keys(_0x37c60b.data).forEach(function(_0x47ae0e) { + var _0x4a8f4c = _0x37c60b.data[_0x47ae0e]; + if (_0x4782da.push(_0x47ae0e), _0x28e87d.includes(_0x47ae0e)) { + var _0x2d672f = _0x2c1832.querySelector('tr[id="' .concat(_0x47ae0e, '"]')); + _0x2c1832.removeChild(_0x2d672f); + } + var _0x295f41 = document.createElement('tr'); + _0x295f41.setAttribute('id', _0x47ae0e); + var _0xa2ea61 = _0x4a8f4c.password ? _0x378b5c.icons.lock : '', + _0x5452b6 = _0x4a8f4c.password ? 'Y' : 'N', + _0xb3121d = _0x4a8f4c.current < _0x4a8f4c.max ? 'Join') : '', + _0x5c8146 = _0x4a8f4c.country ? _0x4a8f4c.country : '?'; + _0x295f41.innerHTML = '[' .concat(_0x5c8146, '] ').concat(_0xa2ea61, ' ').concat(_0x4a8f4c.room_name, '').concat(_0x4a8f4c.current, '/').concat(_0x4a8f4c.max, '').concat(_0xb3121d, ''), _0x1093f4.call(_0xa88a13, _0x295f41.querySelector('.' .concat(_0x378b5c.classNames['btn-join-room'])), 'click', _0x1e0cdb), _0x2c1832.appendChild(_0x295f41); + }), _0x2c1832.querySelectorAll('tr').forEach(function(_0x24dcf7) { + _0x4782da.includes(_0x24dcf7.id) || _0x2c1832.removeChild(_0x24dcf7); + }); + } + _0x378b5c.loadRoomsListTimer = setTimeout(_0x378b5c.loadRoomsList, 0x7d0); + }).catch(function(_0x227055) { + console.log('Network Error', _0x227055), _0x378b5c.loadRoomsListTimer = setTimeout(_0x378b5c.loadRoomsList, 0x7d0); + }); + }, _0x378b5c.openRoom = function() { + _0x378b5c.stopLoadRooms(); + _0x132da7(_this.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['netplay-roomlist'])), true); + _0x132da7(_this.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['netplay-room'])), !0x1); + _0x132da7(_this.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['btn-create-room'])), true); + _0x132da7(_this.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['btn-quit'])), !0x1); + _0x378b5c.resetCheat(); + _0x132da7(_this.elements.buttons.cheat, true); + var _0x17edbf = _this.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['netplay-room'])), + _0x2c1832 = _0x17edbf.querySelector('[data-room-password]'); + null === _0x378b5c.connection.password ? _0x132da7(_0x2c1832, true) : (_0x132da7(_0x2c1832, !0x1), _0x2c1832.querySelector('span').innerText = _0x378b5c.connection.password); + var _0x18c1cb = _0x17edbf.querySelector('tbody'); + _0x18c1cb.innerHTML = '', _0x17edbf.querySelector('strong').innerText = _0x3d0d28.room_name, _0x378b5c.players.forEach(function(_0x938d55, _0xf3d39a) { + var _0x2c1832 = null; + if (_0x938d55 && (_0x378b5c.connection.peers[_0x938d55] ? _0x2c1832 = _0x378b5c.connection.peers[_0x938d55].extra : _0x378b5c.connection.userid === _0x938d55 && (_0x2c1832 = _0x378b5c.connection.extra), _0x2c1832 && _0x2c1832.name)) { + var _0x564064 = document.createElement('tr'); + _0x564064.innerHTML = '' .concat(_0xf3d39a + 0x1, '').concat(_0x2c1832.name, ''), _0x18c1cb.appendChild(_0x564064); + } + }); + }, _0x1093f4.call(this, _0x325651.querySelector('.' .concat(_0x378b5c.classNames['modal__btn-primary'])), 'click', function(_0x9ac969) { + var _0x2c1832 = _0x325651.querySelector('.' .concat(_0x378b5c.classNames['netplay-room-password-input'])).value; + _0x378b5c.showLoading.call(_0x17edbf), _0x378b5c.connection.password = _0x2c1832; + var _0xcf7207 = _0x325651.getAttribute('data-id'); + _0x378b5c.connection.join(_0xcf7207, function(_0x1a0deb, _0x1ef6c8, _0x1ad18e) { + _0x10c0ad(_0x1a0deb, 0x0, _0x1ad18e), _0x1a0deb && _0x325651.classList.remove(_0x449eac({ + 'is-open': true + })); + }), _0x9ac969.stopPropagation(); + }), _0x1093f4.call(this, _0x2c1832.querySelector('.' .concat(_0x378b5c.classNames['modal__btn-primary'])), 'click', function(_0x43f795) { + var _0x17edbf = _0x2c1832.querySelector('.' .concat(_0x378b5c.classNames['netplay-player-name'])).value; + _0x17edbf = _0x17edbf.replace(/<|>/g, ''), _0x2c1832.querySelector('.' .concat(_0x378b5c.classNames.modal__errmsg)).innerHTML = '', _0x17edbf.trim() && (_0x378b5c.playerName = _0x17edbf.trim(), _0x378b5c.connection.extra.name = _0x17edbf.trim(), _0x4d8495.close()), _0x43f795.stopPropagation(); + }), _0x1093f4.call(this, _0x36bde0.querySelector('.' .concat(_0x378b5c.classNames['modal__btn-primary'])), 'click', function(_0x202cf6) { + var _0x2c1832 = _0x36bde0.querySelector('.' .concat(_0x378b5c.classNames['netplay-room-name-input'])).value; + _0x2c1832 = _0x2c1832.replace(/<|>/g, ''); + var _0x3510ed = _0x36bde0.querySelector('select[data-max-players] option:checked').value; + _0x3510ed < 0x2 && (_0x3510ed = 0x2), _0x3510ed > 0x4 && (_0x3510ed = 0x4); + for (var _0x1264b2 = 0x0; _0x1264b2 < _0x3510ed; _0x1264b2++) _0x378b5c.players[_0x1264b2] = null; + _0x378b5c.connection.maxParticipantsAllowed = _0x3510ed; + var _0x140bcf = _0x36bde0.querySelector('.' .concat(_0x378b5c.classNames['netplay-room-password-input'])).value; + _0x36bde0.querySelector('.' .concat(_0x378b5c.classNames.modal__errmsg)).innerHTML = '', _0x2c1832.trim() ? (_0x378b5c.connection.extra.room_name = _0x2c1832.trim(), '' !== _0x140bcf.trim() && (_0x378b5c.connection.password = _0x140bcf.trim()), _0x378b5c.showLoading.call(_0x17edbf), _0x378b5c.connection.open(_0x378b5c.connection.token(), function(_0x3c6c26, _0x203288, _0x210547) { + _0x378b5c.hideLoading.call(_0x17edbf), _0x3c6c26 ? (_0x378b5c.players[0x0] = _0x378b5c.connection.userid, _0x378b5c.roomMaster = _0x378b5c.connection.userid, _0x3f9c57.closeModal(), _0x378b5c.stopLoadRooms(), _0x3d0d28 = _0x378b5c.connection.extra, _0x378b5c.openRoom(_0x17edbf), _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(0x2), true), _0x132da7(_0x2593da.contextMenu.querySelectorAll('ul li').item(0x3), true)) : _0x36bde0.querySelector('.' .concat(_0x378b5c.classNames.modal__errmsg)).innerHTML = _0x210547; + })) : _0x3f9c57.closeModal(), _0x202cf6.stopPropagation(); + }), _0x1093f4.call(this, _0x17edbf.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['btn-create-room'])), 'click', function(_0x48cb26) { + return _0x3f9c57 = _0x4d8495.show('modal-85cd7a1c543a484a', { + 'closeTrigger': 'data-modal-close', + 'onClose': function() { + _0x17edbf.elements.container.focus(); + } + }), _0x48cb26.stopPropagation(), !0x1; + }), _0x1093f4.call(this, _0x17edbf.elements.dialogs.netplay.querySelector('.' .concat(_0x378b5c.classNames['btn-quit'])), 'click', function(_0x68459d) { + return _0x378b5c.connection.close(), _0x378b5c.stopLoadRooms(), _0x378b5c.loadRoomsList(), _0x378b5c.inputsData = {}, _0x68459d.stopPropagation(), !0x1; + }); + } + window._0x378b5c = _0x378b5c; + }, 'initKeyboard': function() { let _this = this, _0x17edbf = this, @@ -3134,7 +3613,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } // quick save/load button } - parseInt(_0x378b5c.controllers[_0x3863d2][_0x509939].value, 0xa) === _0x459b32.keyCode && (_0x2eb03e ? _0x509939 >= 0x10 && _0x509939 <= 0x17 ? _0x378b5c.simulateInput(_0x3863d2, _0x509939, 0x7fff) : _0x378b5c.simulateInput(_0x3863d2, _0x509939, 0x1) : _0x378b5c.simulateInput(_0x3863d2, _0x509939, 0x0)); + parseInt(_0x378b5c.controllers[_0x3863d2][_0x509939].value, 0xa) === _0x459b32.keyCode && (_0x2eb03e ? _0x509939 >= 0x10 && _0x509939 <= 0x17 ? _0x378b5c.simulateInput(_0x3863d2, _0x509939, 0x7fff) : _0x378b5c.simulateInput(_0x3863d2, _0x509939, 1) : _0x378b5c.simulateInput(_0x3863d2, _0x509939, 0)); }); }); } @@ -3161,7 +3640,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x1f4ee2 = _0x2c1832.getAttribute('data-id'); if (event.gamepadIndex === parseInt(_0xdd4205, 0xa)) { let _0x126d2d = null; - (_0x126d2d = _0x17edbf.elements.dialogs.gamepad.querySelector('[data-id="' .concat(_0x1f4ee2, '"][data-index="').concat(_0xdd4205, '"][data-type="2"]'))).setAttribute('data-value', event.index), _0x126d2d.value = 'button ' .concat(event.index + 0x1), _0x132da7(_0x2c1832, true); + (_0x126d2d = _0x17edbf.elements.dialogs.gamepad.querySelector('[data-id="' .concat(_0x1f4ee2, '"][data-index="').concat(_0xdd4205, '"][data-type="2"]'))).setAttribute('data-value', event.index), _0x126d2d.value = 'button ' .concat(event.index + 1), _0x132da7(_0x2c1832, true); } } else Object.keys(_0x378b5c.controllers[event.gamepadIndex.toString()]).forEach(function(_0x3cf4d3) { let _0x5cf388 = event.gamepadIndex.toString(); @@ -3174,13 +3653,13 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x378b5c.changeStateSlot() } } - parseInt(_0x378b5c.controllers[_0x5cf388][_0x3cf4d3].value2, 0xa) === parseInt(event.index, 0xa) && parseInt(_0x5cf388, 0xa) === parseInt(event.gamepadIndex, 0xa) && _0x378b5c.simulateInput(_0x5cf388, _0x3cf4d3, 0x1); + parseInt(_0x378b5c.controllers[_0x5cf388][_0x3cf4d3].value2, 0xa) === parseInt(event.index, 0xa) && parseInt(_0x5cf388, 0xa) === parseInt(event.gamepadIndex, 0xa) && _0x378b5c.simulateInput(_0x5cf388, _0x3cf4d3, 1); }); }); gamepad.on('buttonup', function(event) { Object.keys(_0x378b5c.controllers).forEach(function(_0x302c3e) { Object.keys(_0x378b5c.controllers[_0x302c3e]).forEach(function(_0x14eb8a) { - parseInt(_0x378b5c.controllers[_0x302c3e][_0x14eb8a].value2, 0xa) === parseInt(event.index, 0xa) && parseInt(_0x302c3e, 0xa) === parseInt(event.gamepadIndex, 0xa) && _0x378b5c.simulateInput(_0x302c3e, _0x14eb8a, 0x0); + parseInt(_0x378b5c.controllers[_0x302c3e][_0x14eb8a].value2, 0xa) === parseInt(event.index, 0xa) && parseInt(_0x302c3e, 0xa) === parseInt(event.gamepadIndex, 0xa) && _0x378b5c.simulateInput(_0x302c3e, _0x14eb8a, 0); }); }); }); @@ -3237,19 +3716,19 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (_0x378b5c.controllers[_0x5cf388][_0x3cf4d3].value2.split(':')[0] === event.axis) { _0x378b5c.prevButtons[_0x5cf388][event.axis] = value _0x378b5c.prevButtons[_0x5cf388].buttonID = _0x3cf4d3 - _0x378b5c.simulateInput(_0x5cf388, _0x3cf4d3, 0x0) + _0x378b5c.simulateInput(_0x5cf388, _0x3cf4d3, 0) } } else { //button down if ((1 === _0x378b5c.prevButtons[_0x5cf388][event.axis] && value === -1) || (-1 === _0x378b5c.prevButtons[_0x5cf388][event.axis] && value === 1)) { - _0x378b5c.simulateInput(_0x5cf388, _0x378b5c.prevButtons[_0x5cf388].buttonID, 0x0) + _0x378b5c.simulateInput(_0x5cf388, _0x378b5c.prevButtons[_0x5cf388].buttonID, 0) } if (_0x378b5c.controllers[_0x5cf388][_0x3cf4d3].value2.split(':')[0] === event.axis && parseInt(_0x378b5c.controllers[_0x5cf388][_0x3cf4d3].value2.split(':')[1]) === value) { _0x378b5c.prevButtons[_0x5cf388][event.axis] = value _0x378b5c.prevButtons[_0x5cf388].buttonID = _0x3cf4d3 quit = true - _0x378b5c.simulateInput(_0x5cf388, _0x3cf4d3, 0x1) + _0x378b5c.simulateInput(_0x5cf388, _0x3cf4d3, 1) } } }; @@ -3311,7 +3790,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }); }, 'setShader': function(_0x4cbec3) { - if ('disabled' === _0x4cbec3) _0x27f4c4.FS.unlink('/shader/shader.glslp', ''), _0x378b5c.toggleShader && _0x378b5c.toggleShader(0x0); + if ('disabled' === _0x4cbec3) _0x27f4c4.FS.unlink('/shader/shader.glslp', ''), _0x378b5c.toggleShader && _0x378b5c.toggleShader(0); else { _0x378b5c.toggleShader && _0x378b5c.toggleShader(0); let _0x17edbf = '/shader/' .concat(_0x4cbec3); @@ -3319,19 +3798,21 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x378b5c.toggleShader && _0x378b5c.toggleShader(1); } }, - 'toggleVirtualGamepad': function(_0x1ed80b) { + 'toggleVirtualGamepad': function(_0x1ed80b, forceUpdateHTML) { let _this = this; - if (null !== _0x378b5c.virtualGamepadContainer) { + if (_0x378b5c.virtualGamepadContainer && !forceUpdateHTML) { _0x132da7(_0x378b5c.virtualGamepadContainer, !_0x1ed80b); return } - _0x378b5c.virtualGamepadContainer = _0x428003('div', { - 'class': _0x449eac({ - 'ejs-virtual-gamepad': true - }), - 'hidden': '' - }); - this.elements.container.appendChild(_0x378b5c.virtualGamepadContainer); + if (!_0x378b5c.virtualGamepadContainer) { + _0x378b5c.virtualGamepadContainer = _0x428003('div', { + 'class': getClass({ + 'ejs-virtual-gamepad': true + }), + 'hidden': '' + }); + this.elements.container.appendChild(_0x378b5c.virtualGamepadContainer); + } let blockCSS = 'height:31px;text-align:center;border:1px solid #ccc;border-radius:5px;line-height:31px;'; let html = ''; let info; @@ -3346,466 +3827,123 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { return false; } for (let i=0; i'; - html += '
'; for (let i=0; i'+info[i].text+'
'; + } + opts['b_'+info[i].id.toLowerCase()] = true; + let style = ''; + if (info[i].left) { + style += 'left:'+info[i].left+(typeof info[i].left === 'number'?'px':'')+';'; + } + if (info[i].right) { + style += 'right:'+info[i].right+(typeof info[i].right === 'number'?'px':'')+';'; + } + if (info[i].top) { + style += 'top:'+info[i].top+(typeof info[i].top === 'number'?'px':'')+';'; + } + if (!info[i].bold) { + style += 'font-weight:normal;'; + } else if (info[i].bold) { + style += 'font-weight:bold;'; + } + info[i].fontSize = info[i].fontSize || 30; + style += 'font-size:'+info[i].fontSize+'px;'; + if (info[i].block) { + style += blockCSS; + } + if (['top', 'center', 'left', 'right'].includes(info[i].location)) { + dataHTML[info[i].location] += '
'+info[i].text+'
'; } } + html += '
'; + html += '
'; + html += dataHTML.top; html += '
'; - html += '
'; - for (let i=0; i'+info[i].text+'
'; - } - } + html += '
'; + html += dataHTML.left; html += '
'; - html += '
'; - for (let i=0; i'+info[i].text+'
'; - } - } + html += '
'; + html += dataHTML.center; html += '
'; - html += '
'; - for (let i=0; i'+info[i].text+'
'; - } - } + html += '
'; + html += dataHTML.right; html += '
'; _0x378b5c.virtualGamepadContainer.innerHTML = html; _0x132da7(_0x378b5c.virtualGamepadContainer, !_0x1ed80b); - let _0x2c1832 = _0x449eac({ + let _0x2c1832 = getClass({ 'virtual-gamepad': true }), - _0x2ec721 = _0x449eac({ + _0x2ec721 = getClass({ 'touch': true }); if (! _0x59aa33.isIos) { @@ -3813,21 +3951,136 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { event.stopPropagation(); }); } - - let zone; - for (let i=0; i= 10 && (_0x419bd0 = 1); + _0x3f2d89 >= 10 && (_0x1f5439 = 1, _0x21a1ad = 0, (_0x4fda8c < 0 && _0x4fda8c >= -35 || _0x4fda8c > 0 && _0x4fda8c <= 35) && (_0x1f5439 = 0), _0x10098e = _0x4fda8c < 0 && _0x4fda8c >= -55 ? 1 : 0, _0x419bd0 = _0x4fda8c > 0 && _0x4fda8c <= 55 ? 1 : 0); + _0x3f2d89 <= -10 && (_0x1f5439 = 0, _0x21a1ad = 1, (_0x4fda8c < 0 && _0x4fda8c >= -35 || _0x4fda8c > 0 && _0x4fda8c <= 35) && (_0x21a1ad = 0), _0x10098e = _0x4fda8c > 0 && _0x4fda8c <= 55 ? 1 : 0, _0x419bd0 = _0x4fda8c < 0 && _0x4fda8c >= -55 ? 1 : 0); + _0x2af034.classList.toggle(getClass({"dpad-right": true}), _0x1f5439); + _0x2af034.classList.toggle(getClass({"dpad-left": true}), _0x21a1ad); + _0x2af034.classList.toggle(getClass({"dpad-up": true}), _0x10098e); + _0x2af034.classList.toggle(getClass({"dpad-down": true}), _0x419bd0); + _0x46ee07(_0x10098e, _0x419bd0, _0x21a1ad, _0x1f5439); + } + event.stopPropagation(); } + function _0x320749(event) { + _0x46ee07(0, 0, 0, 0); + _0x2af034.classList.toggle(getClass({"dpad-up": true}), false); + _0x2af034.classList.toggle(getClass({"dpad-down": true}), false); + _0x2af034.classList.toggle(getClass({"dpad-right": true}), false); + _0x2af034.classList.toggle(getClass({"dpad-left": true}), false); + event.stopPropagation(); + } + + _0x2af034.innerHTML = '
\n
'); + _0xb30294.append(_0x2af034); + _0xb30294.append(_0x573eda); + _0x1093f4.call(_this, _0x573eda, 'touchstart touchmove', _0x12b76b); + _0x1093f4.call(_this, _0x573eda, 'touchend touchcancel', _0x320749); } - if (zone) { + info.forEach((dpad, index) => { + if (dpad.type !== 'dpad') return; let opts = {}; + if (leftHandedMode && ['left', 'right'].includes(dpad.location)) { + dpad.location = (dpad.location==='left') ? 'right' : 'left'; + const amnt = JSON.parse(JSON.stringify(dpad)); + if (amnt.left) { + dpad.right = amnt.left; + } + if (amnt.right) { + dpad.left = amnt.right; + } + } + opts[dpad.location.toLowerCase()] = true; + const parent = _0x530042.call(this, '.'.concat(getClass({ + 'ejs-virtual-gamepad': true + }), ' .').concat(getClass(opts))); + opts['dpad_'+index] = true; + const elem = _0x428003('div', { + 'class': '.'.concat(getClass({ + 'ejs-virtual-gamepad': true, + 'dpad-container': true + }), ' .').concat(getClass(opts)) + }); + let style = ''; + if (dpad.left) { + style += 'left:'+dpad.left+';'; + } + if (dpad.right) { + style += 'right:'+dpad.right+';'; + } + if (dpad.top) { + style += 'top:'+dpad.top+';'; + } + elem.style = style; + parent.appendChild(elem); + createDPad({container: elem, event: function(up, down, left, right) { + if (dpad.joystickInput) { + if (up === 1) up=0x7fff; + if (down === 1) up=0x7fff; + if (left === 1) up=0x7fff; + if (right === 1) up=0x7fff; + } + _0x378b5c.syncInput(0, dpad.inputValues[0], up); + _0x378b5c.syncInput(0, dpad.inputValues[1], down); + _0x378b5c.syncInput(0, dpad.inputValues[2], left); + _0x378b5c.syncInput(0, dpad.inputValues[3], right); + }}); + }) + + + if (this.zoneObj) { + this.zoneObj.forEach((zone) => { + zone.destroy(); + }) + } + this.zoneObj = []; + let zone; + info.forEach((zone, index) => { + if (zone.type !== 'zone') return; + let opts = {}; + if (leftHandedMode && ['left', 'right'].includes(zone.location)) { + zone.location = (zone.location==='left') ? 'right' : 'left'; + const amnt = JSON.parse(JSON.stringify(zone)); + if (amnt.left) { + zone.right = amnt.left; + } + if (amnt.right) { + zone.left = amnt.right; + } + } opts[zone.location.toLowerCase()] = true; - let _0x17edbf = _0x3a58c8.a.create({ - 'zone': _0x530042.call(this, '.' .concat(_0x449eac({ - 'ejs-virtual-gamepad': true - }), ' .').concat(_0x449eac(opts))), + const parent = _0x530042.call(this, '.'.concat(getClass({ + 'ejs-virtual-gamepad': true, + }), ' .').concat(getClass(opts))); + opts['zone_'+index] = true; + const elem = _0x428003('div', { + 'class': '.'.concat(getClass({ + 'ejs-virtual-gamepad': true, + }), ' .').concat(getClass(opts)) + }); + parent.appendChild(elem); + const zoneObj = _0x3a58c8.a.create({ + 'zone': elem, 'mode': 'static', 'position': { 'left': zone.left, @@ -3835,47 +4088,101 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, 'color': 'red' }); - function inputs() { - if (_this.system === 'n64') { - let inputLocation; - if (_0x2593da && typeof _0x2593da.getCoreOptionsValues == 'function') { - inputLocation = _0x2593da.getCoreOptionsValues()['joystick-input']; + zoneObj.on('end', function(_0x27f006, _0x1fb527) { + _0x378b5c.syncInput(0, zone.inputValues[0], 0); + _0x378b5c.syncInput(0, zone.inputValues[1], 0); + _0x378b5c.syncInput(0, zone.inputValues[2], 0); + _0x378b5c.syncInput(0, zone.inputValues[3], 0); + }); + zoneObj.on('move', function(_0x1b060e, _0x4ae7d6) { + const degree = _0x4ae7d6.angle.degree; + const distance = _0x4ae7d6.distance; + if (zone.joystickInput === true) { + let _0x4773fe = 0, _0x4c3bc7 = 0; + if (degree > 0 && degree <= 45) { + _0x4773fe = distance / 50; + _0x4c3bc7 = -0.022222222222222223 * degree * distance / 50; } - if (inputLocation === 'd-pad') { - return {downVal:1,4:4,5:5,6:6,7:7}; + if (degree > 45 && degree <= 90) { + _0x4773fe = 0.022222222222222223 * (90 - degree) * distance / 50; + _0x4c3bc7 = -distance / 50; + } + if (degree > 90 && degree <= 135) { + _0x4773fe = 0.022222222222222223 * (90 - degree) * distance / 50; + _0x4c3bc7 = -distance / 50; + } + if (degree > 135 && degree <= 180) { + _0x4773fe = -distance / 50; + _0x4c3bc7 = -0.022222222222222223 * (180 - degree) * distance / 50; + } + if (degree > 135 && degree <= 225) { + _0x4773fe = -distance / 50; + _0x4c3bc7 = -0.022222222222222223 * (180 - degree) * distance / 50; + } + if (degree > 225 && degree <= 270) { + _0x4773fe = -0.022222222222222223 * (270 - degree) * distance / 50; + _0x4c3bc7 = distance / 50; + } + if (degree > 270 && degree <= 315) { + _0x4773fe = -0.022222222222222223 * (270 - degree) * distance / 50; + _0x4c3bc7 = distance / 50; + } + if (degree > 315 && degree <= 359.9) { + _0x4773fe = distance / 50; + _0x4c3bc7 = 0.022222222222222223 * (360 - degree) * distance / 50; + } + if (_0x4773fe > 0) { + _0x378b5c.syncInput(0, zone.inputValues[0], 0x7fff * _0x4773fe); + _0x378b5c.syncInput(0, zone.inputValues[1], 0); } else { - return {downVal:0x7fff,4:19,5:18,6:17,7:16}; + _0x378b5c.syncInput(0, zone.inputValues[1], 0x7fff * -_0x4773fe); + _0x378b5c.syncInput(0, zone.inputValues[0], 0); } + if (_0x4c3bc7 > 0) { + _0x378b5c.syncInput(0, zone.inputValues[2], 0x7fff * _0x4c3bc7); + _0x378b5c.syncInput(0, zone.inputValues[3], 0); + } else { + _0x378b5c.syncInput(0, zone.inputValues[3], 0x7fff * -_0x4c3bc7); + _0x378b5c.syncInput(0, zone.inputValues[2], 0); + } + } else { - return {downVal:1,4:4,5:5,6:6,7:7}; + if (degree >= 30 && degree < 150) { + _0x378b5c.syncInput(0, zone.inputValues[0], 1); + } else { + window.setTimeout(function() { + _0x378b5c.syncInput(0, zone.inputValues[0], 0); + }, 30); + } + if (degree >= 210 && degree < 330) { + _0x378b5c.syncInput(0, zone.inputValues[1], 1); + } else { + window.setTimeout(function() { + _0x378b5c.syncInput(0, zone.inputValues[1], 0); + }, 30); + } + if (degree >= 120 && degree < 240) { + _0x378b5c.syncInput(0, zone.inputValues[2], 1); + } else { + window.setTimeout(function() { + _0x378b5c.syncInput(0, zone.inputValues[2], 0); + }, 30); + } + if (degree >= 300 || degree >= 0 && degree < 60) { + _0x378b5c.syncInput(0, zone.inputValues[3], 1); + } else { + window.setTimeout(function() { + _0x378b5c.syncInput(0, zone.inputValues[3], 0); + }, 30); + } } - } - _0x17edbf.on('end', function(_0x27f006, _0x1fb527) { - _0x378b5c.syncInput(0, inputs()[4], 0); - _0x378b5c.syncInput(0, inputs()[5], 0); - _0x378b5c.syncInput(0, inputs()[6], 0); - _0x378b5c.syncInput(0, inputs()[7], 0); }); - _0x17edbf.on('move', function(_0x1b060e, _0x4ae7d6) { - let _0x2c1832 = _0x4ae7d6.angle.degree; - _0x2c1832 >= 0x1e && _0x2c1832 < 0x96 ? _0x378b5c.syncInput(0, inputs()[4], inputs().downVal) : window.setTimeout(function() { - _0x378b5c.syncInput(0, inputs()[4], 0); - }, 0x1e); - _0x2c1832 >= 0xd2 && _0x2c1832 < 0x14a ? _0x378b5c.syncInput(0, inputs()[5], inputs().downVal) : window.setTimeout(function() { - _0x378b5c.syncInput(0, inputs()[5], 0); - }, 0x1e); - _0x2c1832 >= 0x78 && _0x2c1832 < 0xf0 ? _0x378b5c.syncInput(0, inputs()[6], inputs().downVal) : window.setTimeout(function() { - _0x378b5c.syncInput(0, inputs()[6], 0); - }, 0x1e); - _0x2c1832 >= 0x12c || _0x2c1832 >= 0x0 && _0x2c1832 < 0x3c ? _0x378b5c.syncInput(0, inputs()[7], inputs().downVal) : window.setTimeout(function() { - _0x378b5c.syncInput(0, inputs()[7], 0); - }, 0x1e); - }); - } + this.zoneObj.push(zoneObj); + }) let keys = []; for (let i=0; i { - let element = _0x530042.call(_this, '.'.concat(_0x2c1832, ' .').concat(_0x449eac(a.id))); + let element = _0x530042.call(_this, '.'.concat(_0x2c1832, ' .').concat(getClass(a.id))); if (!element) return; - _0x1093f4.call(_this, element, 'touchstart touchend', function(e) { - if (e.type === 'touchend') { + _0x1093f4.call(_this, element, 'touchstart touchend touchcancel', function(e) { + if (e.type === 'touchend' || e.type === 'touchcancel') { _0x3a8e2f(e.target, _0x2ec721, false); window.setTimeout(function() { _0x378b5c.syncInput(0, a.number, 0); @@ -3899,27 +4206,29 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x3a8e2f(e.target, _0x2ec721, true); _0x378b5c.syncInput(0, a.number, 1) } - e.stopPropagation(); + e.preventDefault(); }) }); - let menuButton = _0x428003('div', { - 'class': _0x449eac({ - 'ejs__widget': true, - 'ejs__widget_controls_toggle': true - }) - }, ''); - menuButton.innerHTML = ''; - _0x530042.call(this, ".".concat(_0x449eac({ejs__widgets: true}))).appendChild(menuButton); - let hideTimeout; - _0x1093f4.call(this, menuButton, 'mousedown touchstart', function(e) { - _0x3a8e2f(e.target, _0x2ec721, true); - clearTimeout(hideTimeout); - _0x5ab74d.toggleControls.call(_this, true); - hideTimeout = setTimeout(function() { - _0x5ab74d.toggleControls.call(_this, false); - }, 5000) - }); + if (!forceUpdateHTML) { + const menuButton = _0x428003('div', { + 'class': getClass({ + 'ejs__widget': true, + 'ejs__widget_controls_toggle': true + }) + }, ''); + menuButton.innerHTML = ''; + _0x530042.call(this, ".".concat(getClass({ejs__widgets: true}))).appendChild(menuButton); + let hideTimeout; + _0x1093f4.call(this, menuButton, 'mousedown touchstart', function(e) { + _0x3a8e2f(e.target, _0x2ec721, true); + clearTimeout(hideTimeout); + _0x5ab74d.toggleControls.call(_this, true); + hideTimeout = setTimeout(function() { + _0x5ab74d.toggleControls.call(_this, false); + }, 5000) + }); + } }, 'setup': function() { let _this = this; @@ -3935,15 +4244,16 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x17edbf = _0x175d8e.toLowerCase(); if (_0x17edbf && /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/ .test(_0x17edbf)) { if (0x4 === _0x17edbf.length) { - for (let _0x2c1832 = '#', _0x4c881f = 0x1; _0x4c881f < 0x4; _0x4c881f += 0x1) _0x2c1832 += _0x17edbf.slice(_0x4c881f, _0x4c881f + 0x1).concat(_0x17edbf.slice(_0x4c881f, _0x4c881f + 0x1)); + for (let _0x2c1832 = '#', _0x4c881f = 1; _0x4c881f < 0x4; _0x4c881f += 1) _0x2c1832 += _0x17edbf.slice(_0x4c881f, _0x4c881f + 1).concat(_0x17edbf.slice(_0x4c881f, _0x4c881f + 1)); _0x17edbf = _0x2c1832; } - for (let _0x5ac4ff = [], _0x324169 = 0x1; _0x324169 < 0x7; _0x324169 += 0x2) _0x5ac4ff.push(parseInt('0x' .concat(_0x17edbf.slice(_0x324169, _0x324169 + 0x2)), 0x10)); + let _0x5ac4ff = []; + for (let _0x324169 = 1; _0x324169 < 0x7; _0x324169 += 2) _0x5ac4ff.push(parseInt('0x' .concat(_0x17edbf.slice(_0x324169, _0x324169 + 2)), 0x10)); return _0x5ac4ff; } return null; }(this.color); - _0x17edbf && this.elements.container.setAttribute('style', '--ejs-primary-color: ' .concat(_0x17edbf[0x0], ', ').concat(_0x17edbf[0x1], ', ').concat(_0x17edbf[0x2])); + _0x17edbf && this.elements.container.setAttribute('style', '--ejs-primary-color: ' .concat(_0x17edbf[0], ', ').concat(_0x17edbf[1], ', ').concat(_0x17edbf[2])); } this.elements.wrapper = _0x428003('div', { 'class': this.config.classNames.video @@ -3995,6 +4305,21 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _this.elements.buttons.restart && _0x1093f4.call(_this, _this.elements.buttons.restart, 'click', function(_0x5cfc51) { _0x378b5c.restartGame(); _0x378b5c.inputsData = {}; + if (_0x378b5c.connected && _0x378b5c.connection.isInitiator) { + (async () => { + const state = await _0x378b5c.saveState(); + const file = new File([state], '0-game.state', { + 'type': '', + 'lastModified': new Date() + }); + _0x378b5c.connection.shareFile(file); + _0x378b5c.inputsData = {}; + _0x378b5c.wait = true; + _0x378b5c.systemPause(1); + _0x27f4c4.Module.pauseMainLoop(); + _0x378b5c.disableControl(true); + })(); + } saveSaveFiles(); }); _this.elements.buttons.screenRecord && _0x1093f4.call(_this, _this.elements.buttons.screenRecord, 'click', function(_0x5cfc51) { @@ -4021,7 +4346,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { options = {}; } function gotStreams(stream) { - _this.elements.buttons.screenRecord.querySelector('.'.concat(_0x449eac({ + _this.elements.buttons.screenRecord.querySelector('.'.concat(getClass({ 'ejs__tooltip': true }))).innerHTML = _this.localization('Stop Screen Recording'); _this.recordData.stream = stream; @@ -4041,7 +4366,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { a.click() window.URL.revokeObjectURL(a.href) delete _this.recordData - _this.elements.buttons.screenRecord.querySelector('.'.concat(_0x449eac({ + _this.elements.buttons.screenRecord.querySelector('.'.concat(getClass({ 'ejs__tooltip': true }))).innerHTML = _this.localization('Start Screen Recording'); } @@ -4049,55 +4374,129 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _this.recordData.recorder.start() _this.recordData.started = true } - _0x27f4c4.Module.pauseMainLoop(); - _this.playing = false; - alert('please check "share system audio" to have audio in the recording. We only need the audio stream so your entire screen will not be recorded'); - let canvasStream = _0x27f4c4.Module.canvas.captureStream(30); - let time = setTimeout(function() { - _this.playing = true; - _0x27f4c4.Module.resumeMainLoop(); - }, 20000); - navigator.mediaDevices.getDisplayMedia({ - audio: true, //we only need the audio, we dont use the video stream at all - video: {mediaSource: "screen"} - }).then(function(stream) { - try { - clearTimeout(time); - }catch(e){} - let audio = stream.getAudioTracks(); - for (let i=0; i'; + _0x27f4c4.romdb.getAll(function(_0x43586d) { + if (_0x43586d) { + let _0x275730 = _0x428003('table', { + 'style': 'width:100%;padding-left:10px;text-align:left' + }), + _0x1ab9e9 = _0x428003('tbody'); + _0x43586d.length > 0 ? (_0x3360eb.innerHTML = '', _0x43586d.forEach(function(_0x32b0b7, _0x2d0e11) { + if (_0x32b0b7.key && !/-part-\d+$/ .test(_0x32b0b7.key)) { + let _0x277c67 = [_0x32b0b7.key]; + for (let _0x3360eb = Math.ceil(_0x32b0b7.filesize / 0x6400000), _0x3edb35 = 1; _0x3edb35 < _0x3360eb; _0x3edb35 += 1) _0x277c67.push('' .concat(_0x32b0b7.key, '-part-').concat(_0x3edb35)); + let _0x3e31f6 = _0x428003('tr'), + _0x5b75bd = _0x428003('td'), + _0x227405 = _0x428003('td'), + _0xac150b = _0x428003('td'); + _0x5b75bd.innerHTML = _0x32b0b7.filename, _0x227405.innerHTML = function(_0x1858c1) { + let _0x2d0e11 = -1; + do { + _0x1858c1 /= 0x400, _0x2d0e11++; + } while (_0x1858c1 > 0x400); + return Math.max(_0x1858c1, 0.1).toFixed(1) + [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'][_0x2d0e11]; + }(_0x32b0b7.filesize), _0xac150b.innerHTML = 'Remove', _0x3e31f6.appendChild(_0x5b75bd), _0x3e31f6.appendChild(_0x227405), _0x3e31f6.appendChild(_0xac150b), _0x1ab9e9.appendChild(_0x3e31f6), _0xac150b.querySelector('a').onclick = function(_0x16f22a) { + _0x27f4c4.romdb.removeBatch(_0x277c67); + try { + _0x1ab9e9.removeChild(_0x3e31f6); + } catch (_0x353628) {} + return _0x16f22a.stopPropagation(), false; + }; + } + }), _0x275730.appendChild(_0x1ab9e9), _0x3360eb.appendChild(_0x275730)) : _0x3360eb.innerHTML = '
'+_this.localization('Empty')+'
'; + } else _0x3360eb.innerHTML = '
'+_this.localization('Empty')+'
'; + }, function() {}); + } + return false; + }) _this.elements.buttons.play && Array.from(_this.elements.buttons.play).forEach(function(_0x24495b) { _0x1093f4.call(_this, _0x24495b, 'click', function(_0x966382) { - _this.playing ? (_this.playing = !0x1, _0x27f4c4.Module.pauseMainLoop(), _0xbae705.call(_this, _this.elements.container, 'pause', !0x1, { - 'pause': true - })) : (_this.playing = true, _0x27f4c4.Module.resumeMainLoop(), _0xbae705.call(_this, _this.elements.container, 'pause', !0x1, { - 'pause': !0x1 - })); + if (_this.playing) { + _this.playing = false; + _0x27f4c4.Module.pauseMainLoop(); + if (_0x378b5c.connected && _0x378b5c.connection.isInitiator) { + _0x378b5c.connection.send(JSON.stringify({ + 'act': 'pause' + })) + } + _0xbae705.call(_this, _this.elements.container, 'pause', false, { + 'pause': true + }) + } else { + _this.playing = true; + _0x27f4c4.Module.resumeMainLoop(); + if (_0x378b5c.connected && _0x378b5c.connection.isInitiator) { + _0x378b5c.connection.send(JSON.stringify({ + 'act': 'resume' + })) + } + _0xbae705.call(_this, _this.elements.container, 'pause', false, { + 'pause': false + }); + } }); - }), /*_this.elements.buttons.netplay && _0x1093f4.call(_this, _this.elements.buttons.netplay, 'click', function(_0x2317b9) { - _0x378b5c.disableControl(true), _0x132da7(_this.elements.dialogs.netplay, !0x1); - }), */_this.elements.buttons.cheat && _0x1093f4.call(_this, _this.elements.buttons.cheat, 'click', function(_0x44b01a) { - _0x132da7(_this.elements.dialogs.cheat, !0x1); + }), _this.elements.buttons.netplay && _0x1093f4.call(_this, _this.elements.buttons.netplay, 'click', function(_0x2317b9) { + _0x378b5c.disableControl(true); + _0x132da7(_this.elements.dialogs.netplay, false); + if (_0x378b5c.players.length > 0) { + _0x378b5c.openRoom(_0xa88a13); + } else { + _0x378b5c.stopLoadRooms(); + _0x378b5c.loadRoomsList(); + } + if (!_0x378b5c.playerName) { + _0x4d8495.show('modal-9de6c4e9ce2b9361', { + 'closeByEsckey': false + }); + } + }), _this.elements.buttons.cheat && _0x1093f4.call(_this, _this.elements.buttons.cheat, 'click', function(_0x44b01a) { + _0x132da7(_this.elements.dialogs.cheat, false); }); _this.game.stateloadField = _0x428003('input'); _this.game.stateloadField.type = 'file'; _this.game.stateloadField.onchange = function _0x17edbf(_0xcd4599) { let _0xfd246e, _0x3fdd71 = _0xcd4599.target.files; - _0x3fdd71.length > 0x0 && ((_0xfd246e = new FileReader()).file_name = _0x3fdd71[0x0].name, _0xfd246e.onload = function() { + _0x3fdd71.length > 0 && ((_0xfd246e = new FileReader()).file_name = _0x3fdd71[0].name, _0xfd246e.onload = function() { EJS_loadState(new Uint8Array(_0xfd246e.result)); - }, _0xfd246e.readAsArrayBuffer(_0x3fdd71[0x0])), _this.game.stateloadField = _0x428003('input'), _this.game.stateloadField.type = 'file', _this.game.stateloadField.onchange = _0x17edbf; + }, _0xfd246e.readAsArrayBuffer(_0x3fdd71[0])), _this.game.stateloadField = _0x428003('input'), _this.game.stateloadField.type = 'file', _this.game.stateloadField.onchange = _0x17edbf; }; _0x1093f4.call(_this, _this.elements.container, 'loadstate', function(_0x13504c) { if (_0x378b5c.saveLoadDB.call(_this, 'load')) { @@ -4111,25 +4510,72 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, 'bindFunction': function() { let _this = this, - _0x17edbf = _this.system; + _0x17edbf = getSystem(_this.system, true); if (_0x27f4c4.Module && _0x27f4c4.Module._set_volume) { let _0x2c1832 = _0x27f4c4.Module.cwrap('set_volume', 'null', ['number']); _0x378b5c.setVolume = function() { - let _0x17edbf = 0x0; - _this.volume < 0x1 && (_0x17edbf = 0x0 === _this.volume ? -0x50 : 0x1e * _this.volume - 0x1e, _0x2c1832(_0x17edbf)), _this.muted && (_0x17edbf = -0x50), _0x2c1832(_0x17edbf); + let _0x17edbf = 0; + _this.volume < 1 && (_0x17edbf = 0 === _this.volume ? -0x50 : 0x1e * _this.volume - 0x1e, _0x2c1832(_0x17edbf)), _this.muted && (_0x17edbf = -0x50), _0x2c1832(_0x17edbf); }; } _0x378b5c.setVariable = _0x27f4c4.Module.cwrap('set_variable', 'null', ['string', 'string']); _0x378b5c.simulateInputFn = _0x27f4c4.Module.cwrap('simulate_input', 'null', ['number', 'number', 'number']); - _0x378b5c.simulateInput = function(_0x249751, _0x480d05, _0x50f784) { - _0x378b5c.simulateInputFn(_0x249751, _0x480d05, _0x50f784); + let _0x2c63cc = { + 0: null, + 1: null, + 2: null, + 3: null, + 4: null, + 5: null, + 6: null, + 7: null, + 8: null, + 9: null, + 10: null, + 11: null, + 12: null, + 13: null, + 14: null, + 15: null, + 16: null, + 17: null, + 18: null, + 19: null, + 20: null, + 21: null, + 22: null, + 23: null, + 24: null, + 25: null, + 26: null, + 27: null, + 28: null, + 29: null, + 30: null, + 31: null + }; + _0x378b5c.simulateInput = function(player, index, value) { + if (_0x378b5c.connected) { + if (_this.playing && !_0x378b5c.disableInput) { + var _0x35b9c1 = _0x378b5c.connection.userid, + _0x4d96ad = _0x378b5c.roomMaster === _0x35b9c1, + _0xf1bb97 = _0x378b5c.players.indexOf(_0x35b9c1), + _0x52e1f4 = _0x378b5c.currentFrameNum(); + player >> 0x0 == 0x0 && (_0x2c63cc[index] !== value && (_0x4d96ad ? (_0x378b5c.inputsData[_0x52e1f4] || (_0x378b5c.inputsData[_0x52e1f4] = []), _0x378b5c.inputsData[_0x52e1f4].push({ + 'index': _0xf1bb97, + 'key': index, + 'status': value, + 'frame': _0x52e1f4 + }),_0x378b5c.simulateInputFn(_0xf1bb97, index, value)) : _0x378b5c.connection.send(JSON.stringify({ + 'act': 'sync-control', + 'value': ['' .concat(_0xf1bb97, '|').concat(index, '|').concat(value, '|').concat(_0x52e1f4)] + }), _0x378b5c.roomMaster)), _0x2c63cc[index] = value); + } + } else _0x378b5c.disableInput || _0x378b5c.simulateInputFn(player, index, value); }; _0x378b5c.syncInput = _0x378b5c.simulateInput; window.simulateInput = _0x378b5c.simulateInput; - let _0x762355 = _0x27f4c4.Module.cwrap('shader_enable', 'null', ['number']); - _0x378b5c.toggleShader = function(_0x433182) { - return _0x762355(_0x433182); - } + _0x378b5c.toggleShader = _0x27f4c4.Module.cwrap('shader_enable', 'null', ['number']); if (_this.coreVer !== 2) { _0x378b5c.getStateInfo = _0x27f4c4.Module.cwrap('get_state_info', 'string', []); } else { @@ -4161,10 +4607,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } else { _0x17edbf = (await _0x378b5c.getStateInfo()).split('|'); } - let _0x2c1832 = _0x17edbf[0x0] >> 0x0; - if (_0x2c1832 > 0x0) { + let _0x2c1832 = _0x17edbf[0] >> 0; + if (_0x2c1832 > 0) { _0xa88a14 = new Uint8Array(_0x2c1832); - for (let _0x2ef6be = _0x17edbf[0x1] >> 0x0, _0x3cc34b = 0x0; _0x3cc34b < _0x2c1832; _0x3cc34b++) _0xa88a14[_0x3cc34b] = _0x27f4c4.Module.getValue(_0x2ef6be + _0x3cc34b); + for (let _0x2ef6be = _0x17edbf[1] >> 0, _0x3cc34b = 0; _0x3cc34b < _0x2c1832; _0x3cc34b++) _0xa88a14[_0x3cc34b] = _0x27f4c4.Module.getValue(_0x2ef6be + _0x3cc34b); } return _0xa88a14; }; @@ -4189,23 +4635,34 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x27f4c4.FS.unlink('game.state'); }, 100) } + if (_0x378b5c.connected && _0x378b5c.connection.isInitiator) { + (async () => { + const state = await _0x378b5c.saveState(); + const file = new File([state], '0-game.state', { + 'type': '', + 'lastModified': new Date() + }); + _0x378b5c.connection.shareFile(file); + _0x378b5c.inputsData = {}; + _0x378b5c.wait = true; + _0x378b5c.systemPause(1); + _0x27f4c4.Module.pauseMainLoop(); + _0x378b5c.disableControl(true); + })(); + } _this.elements.container.focus(); }; _0x27f4c4.Module._set_cheat && (_0x378b5c.setCheat = _0x27f4c4.Module.cwrap('set_cheat', 'number', ['number', 'number', 'string'])); _0x27f4c4.Module._reset_cheat && (_0x378b5c.resetCheat = _0x27f4c4.Module._reset_cheat); _0x378b5c.quickSaveState = async function() { - if (_this.started) { + if (_this.started && !_0x378b5c.connected) { if (_this.statesSupported === false) { - _this.elements.widgets.stateInfoDiv.innerHTML = 'CANNOT CURRENTLY SAVE STATE'; - clearTimeout(_0x378b5c.saveMsgTransitions); - _0x378b5c.saveMsgTransitions = setTimeout(function() { - _this.elements.widgets.stateInfoDiv.innerHTML = ''; - }, 1500) + _0x378b5c.doMessageTransition('CANNOT CURRENTLY LOAD STATE'); return; } let slot; - if (_0x2593da && typeof _0x2593da.getCoreOptionsValues == 'function') { - slot = _0x2593da.getCoreOptionsValues()['save-state-slot']; + if (_0x2593da && typeof _0x2593da.getCoreOptionsValue == 'function') { + slot = _0x2593da.getCoreOptionsValue('save-state-slot'); if (! slot) { slot = 1; } @@ -4219,36 +4676,31 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { try { let _0x17edbf = await _0x378b5c.saveState(); _0x27f4c4.FS.createDataFile('/', name, _0x17edbf, true, true); - _this.elements.widgets.stateInfoDiv.innerHTML = 'STATE SAVED TO SLOT ' + slot; - clearTimeout(_0x378b5c.saveMsgTransitions); - _0x378b5c.saveMsgTransitions = setTimeout(function() { - _this.elements.widgets.stateInfoDiv.innerHTML = ''; - }, 1500) + _0x378b5c.doMessageTransition('STATE SAVED TO SLOT ' + slot); } catch(e) { console.warn(e); - _this.elements.widgets.stateInfoDiv.innerHTML = 'FAILED TO SAVE STATE TO SLOT ' + slot; - clearTimeout(_0x378b5c.saveMsgTransitions); - _0x378b5c.saveMsgTransitions = setTimeout(function() { - _this.elements.widgets.stateInfoDiv.innerHTML = ''; - }, 1500) + _0x378b5c.doMessageTransition('FAILED TO SAVE STATE TO SLOT ' + slot); } saveSaveFiles(); } }; _0x378b5c.saveMsgTransitions = null; + _0x378b5c.doMessageTransition = function(message) { + _this.elements.widgets.stateInfoDiv.innerText = message; + clearTimeout(_0x378b5c.saveMsgTransitions); + _0x378b5c.saveMsgTransitions = setTimeout(function() { + _this.elements.widgets.stateInfoDiv.innerText = ''; + }, 1500) + } _0x378b5c.quickLoadState = function() { - if (_this.started) { + if (_this.started && !_0x378b5c.connected) { if (_this.statesSupported === false) { - _this.elements.widgets.stateInfoDiv.innerHTML = 'CANNOT CURRENTLY LOAD STATE'; - clearTimeout(_0x378b5c.saveMsgTransitions); - _0x378b5c.saveMsgTransitions = setTimeout(function() { - _this.elements.widgets.stateInfoDiv.innerHTML = ''; - }, 1500) + _0x378b5c.doMessageTransition('CANNOT CURRENTLY LOAD STATE'); return; } let slot; - if (_0x2593da && typeof _0x2593da.getCoreOptionsValues == 'function') { - slot = _0x2593da.getCoreOptionsValues()['save-state-slot']; + if (_0x2593da && typeof _0x2593da.getCoreOptionsValue == 'function') { + slot = _0x2593da.getCoreOptionsValue('save-state-slot'); if (! slot) { slot = 1; } @@ -4262,32 +4714,27 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if ('arcade' === _0x17edbf) { setTimeout(function() { _0x378b5c.getStateInfo(); - _0x25a7a2(name, 0x0); + _0x25a7a2(name, 0); }, 0xa); } } catch (_0x4ee386) { success = false; } if (! success) { - _this.elements.widgets.stateInfoDiv.innerHTML = 'FAILED TO LOAD STATE FROM SLOT ' + slot; + _0x378b5c.doMessageTransition('FAILED TO LOAD STATE FROM SLOT ' + slot); } else { - _this.elements.widgets.stateInfoDiv.innerHTML = 'LOADED STATE FROM SLOT ' + slot; + _0x378b5c.doMessageTransition('LOADED STATE FROM SLOT ' + slot); } - clearTimeout(_0x378b5c.saveMsgTransitions); - _0x378b5c.saveMsgTransitions = setTimeout(function() { - _this.elements.widgets.stateInfoDiv.innerHTML = ''; - }, 1500) saveSaveFiles(); } }; _0x378b5c.changeStateSlot = function(e) { - if (_0x2593da && typeof _0x2593da.getCoreOptionsValues == 'function') { - let slot = _0x2593da.getCoreOptionsValues()['save-state-slot']; - if (! slot) { - slot = 1; - } - } else { - let slot = 1; + let slot; + if (_0x2593da && typeof _0x2593da.getCoreOptionsValue == 'function') { + slot = _0x2593da.getCoreOptionsValue('save-state-slot'); + } + if (!slot) { + slot = 1; } let newSlot; if (typeof e != 'number') { @@ -4298,25 +4745,41 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (newSlot > 9) { newSlot = 1; } - _0x7f9f36.updateCoreOptions.call(_this, 'save-state-slot', newSlot) - _this.elements.widgets.stateInfoDiv.innerHTML = 'SET SAVE STATE SLOT TO ' + newSlot; - clearTimeout(_0x378b5c.saveMsgTransitions); - _0x378b5c.saveMsgTransitions = setTimeout(function() { - _this.elements.widgets.stateInfoDiv.innerHTML = ''; - }, 1500) + _0x7f9f36.updateCoreOptions.call(_this, 'save-state-slot', newSlot); + _0x378b5c.doMessageTransition('SET SAVE STATE SLOT TO ' + newSlot); }; - window.EJS_loadState = function(_0x4dd6a5) { - _0x378b5c.loadState(_0x4dd6a5, 0); + window.EJS_loadState = function(data) { + _0x378b5c.loadState(data, 0); + setTimeout(() => { + if (_0x378b5c.connected) { + var file = new File([data], '0-game.state', { + 'type': '', + 'lastModified': new Date() + }); + _0x378b5c.connection.shareFile(file); + _0x378b5c.inputsData = {}; + _0x378b5c.wait = true; + _0x378b5c.systemPause(1); + _0x27f4c4.Module.pauseMainLoop(); + _0x378b5c.disableControl(true); + } + }, 0x1e); }; + window.EJS_saveState = function() { + return _0x378b5c.saveState(); + } let _0x840cf4 = _0x27f4c4.Module.cwrap('cmd_take_screenshot', '', []); _0x378b5c.getScreenData = function() { _0x840cf4(); return _0x27f4c4.FS.readFile('screenshot.png'); }; _0x378b5c.restartGame = _0x27f4c4.Module.cwrap('system_restart', '', []); - //_0x378b5c.currentFrameNum = _0x27f4c4.Module.cwrap('get_current_frame_count', '', []); + _0x378b5c.currentFrameNum = _0x27f4c4.Module.cwrap('get_current_frame_count', '', []); _0x378b5c.saveSavFiles = _0x27f4c4.Module.cwrap('cmd_savefiles', '', []); _0x27f4c4.Module._get_core_options && (_0x378b5c.getGameCoreOptions = _0x27f4c4.Module.cwrap('get_core_options', 'string', [])); + _0x378b5c.systemPause = function(e) { + return false; + }; _0x378b5c.controllers = _0x2593da.storage.get('controllers'); _0x378b5c.controllers || (_0x378b5c.controllers = JSON.parse(JSON.stringify(_0x378b5c.defaultControllers))); } @@ -4329,8 +4792,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }(_0x7f3270) || function(_0x557107, _0x409476) { let _0x2c1832 = [], _0x488a47 = true, - _0x34f76e = !0x1, - _0x19606f = void 0x0; + _0x34f76e = false, + _0x19606f = undefined; try { for (let _0x328f4d, _0x4d9086 = _0x557107[Symbol.iterator](); !(_0x488a47 = (_0x328f4d = _0x4d9086.next()).done) && (_0x2c1832.push(_0x328f4d.value), !_0x409476 || _0x2c1832.length !== _0x409476); _0x488a47 = true); } catch (_0x13c09a) { @@ -4376,6 +4839,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, 'defaultCoreOptionsValues': function() { let _0xa88a13 = {}; + if (this.coreVer === 2) { + return {}; + } switch (this.system) { case 'pce': _0xa88a13 = { @@ -4398,8 +4864,21 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { return _0xa88a13; }, 'getCoreOptionsValues': function() { + if (_0x7f9f36.coreOptionsValues) { + return JSON.parse(JSON.stringify(_0x7f9f36.coreOptionsValues)); + } let _0xa88a13 = _0x7f9f36.storage.get('core-options'); - return _0x1e2c68.empty(_0xa88a13) && (_0xa88a13 = {}), _0xa88a13; + _0x1e2c68.empty(_0xa88a13) && (_0xa88a13 = {}); + return _0xa88a13; + }, + 'getCoreOptionsValue': function(key) { + if (_0x7f9f36.coreOptionsValues) { + let rv = JSON.parse(JSON.stringify(_0x7f9f36.coreOptionsValues))[key]; + if (rv) return rv; + } + let _0xa88a13 = _0x7f9f36.storage.get('core-options'); + _0x1e2c68.empty(_0xa88a13) && (_0xa88a13 = {}); + return _0xa88a13[key]; }, 'getCoreOptions': function() { let _0xa88a13 = {}; @@ -4448,8 +4927,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'nes': 'NES', 'famicom': 'Famicom' }, - 'default': 'nes', - 'netplay': true + 'default': 'nes' }), _0xa88a13.fceumm_turbo_enable = { 'label': this.localization('Turbo Enable'), 'options': { @@ -4458,8 +4936,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'Player 2': this.localization('Player 2'), 'Both': this.localization('Both') }, - 'default': 'None', - 'netplay': true + 'default': 'None' }, _0xa88a13.fceumm_region = { 'label': this.localization('Region'), 'options': { @@ -4467,8 +4944,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'NTSC': 'NTSC', 'PAL': 'PAL', 'Dendy': 'Dendy'}, - 'default': 'Auto', - 'netplay': true + 'default': 'Auto' }; break; case 'snes': @@ -4482,8 +4958,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { '80MHz': '80MHz', '100MHz': '100MHz' }, - 'default': 'disabled', - 'netplay': true + 'default': 'disabled' } }; break; @@ -4578,8 +5053,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'memory': this.localization('memory'), 'rumble': this.localization('rumble') }, - 'default': 'none', - 'netplay': true + 'default': 'none' }, 'glupen64-pak2': { 'label': this.localization('Player 2 Pak'), @@ -4588,8 +5062,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'memory': this.localization('memory'), 'rumble': this.localization('rumble') }, - 'default': 'none', - 'netplay': true + 'default': 'none' }, 'glupen64-pak3': { 'label': this.localization('Player 3 Pak'), @@ -4598,8 +5071,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'memory': this.localization('memory'), 'rumble': this.localization('rumble') }, - 'default': 'none', - 'netplay': true + 'default': 'none' }, 'glupen64-pak4': { 'label': this.localization('Player 4 Pak'), @@ -4608,22 +5080,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'memory': this.localization('memory'), 'rumble': this.localization('rumble') }, - 'default': 'none', - 'netplay': true + 'default': 'none' }, }; - if (_0xdcec2a && (_0xdcec2a.virtualGamepadContainer != 'undefined' || _0xdcec2a.virtualGamepadContainer !== null)) { - - _0xa88a13['joystick-input'] = { - 'label': this.localization('Joystick input keys'), - 'options': { - 'd-pad': this.localization('d-pad'), - 'analog-stick': this.localization('Analog Stick') - }, - 'default': 'analog-stick', - 'netplay': true - } - } break; case 'nds': _0xa88a13 = { @@ -4679,8 +5138,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'genesis_plus_gx_overclock': { 'label': this.localization('CPU speed'), 'options': ['100%', '125%', '150%', '175%', '200%'], - 'default': '100%', - 'netplay': true + 'default': '100%' }, 'genesis_plus_gx_sound_output': { 'label': this.localization('Sound output'), @@ -4757,8 +5215,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'pcsx_rearmed_frameskip': { 'label': this.localization('Frameskip'), 'options': [0, 1, 2, 3], - 'default': 0, - 'netplay': true + 'default': 0 }, 'pcsx_rearmed_memcard2': { 'label': this.localization('Enable second memory card'), @@ -4766,8 +5223,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'disabled': this.localization('disabled'), 'enabled': this.localization('enabled') }, - 'default': 'enabled', - 'netplay': true + 'default': 'enabled' }, 'pcsx_rearmed_pad1type': { 'label': this.localization('Pad 1 Type'), @@ -4778,8 +5234,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'analog': this.localization('analog'), 'negcon': this.localization('negcon') }, - 'default': 'default', - 'netplay': true + 'default': 'default' }, 'pcsx_rearmed_pad2type': { 'label': this.localization('Pad 2 Type'), @@ -4790,8 +5245,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'analog': this.localization('analog'), 'negcon': this.localization('negcon') }, - 'default': 'default', - 'netplay': true + 'default': 'default' }, 'pcsx_rearmed_pad3type': { 'label': this.localization('Pad 3 Type'), @@ -4802,8 +5256,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'analog': this.localization('analog'), 'negcon': this.localization('negcon') }, - 'default': 'default', - 'netplay': true + 'default': 'default' }, 'pcsx_rearmed_pad4type': { 'label': this.localization('Pad 4 Type'), @@ -4814,8 +5267,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'analog': this.localization('analog'), 'negcon': this.localization('negcon') }, - 'default': 'default', - 'netplay': true + 'default': 'default' }, 'pcsx_rearmed_vibration': { 'label': this.localization('Enable Vibration'), @@ -4823,8 +5275,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'disabled': this.localization('disabled'), 'enabled': this.localization('enabled') }, - 'default': 'enabled', - 'netplay': true + 'default': 'enabled' }, 'pcsx_rearmed_neon_interlace_enable': { 'label': this.localization('Enable interlacing mode(s)'), @@ -4832,8 +5283,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'disabled': this.localization('disabled'), 'enabled': this.localization('enabled') }, - 'default': 'disabled', - 'netplay': true + 'default': 'disabled' }, 'pcsx_rearmed_neon_enhancement_enable': { 'label': this.localization('Enhanced resolution (slow)'), @@ -4841,8 +5291,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'disabled': this.localization('disabled'), 'enabled': this.localization('enabled') }, - 'default': 'disabled', - 'netplay': true + 'default': 'disabled' }, 'pcsx_rearmed_neon_enhancement_no_main': { 'label': this.localization('Enhanced resolution speed hack'), @@ -4850,8 +5299,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'disabled': this.localization('disabled'), 'enabled': this.localization('enabled') }, - 'default': 'disabled', - 'netplay': true + 'default': 'disabled' } }; break; @@ -4866,26 +5314,22 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'fba-frameskip': { 'label': this.localization('Frameskip'), 'options': ['0', '1', '2', '3', '4', '5'], - 'default': '0', - 'netplay': true + 'default': '0' }, 'fba-cpu-speed-adjust': { 'label': this.localization('CPU overclock'), 'options': ['100', '110', '120', '130', '140', '150', '160', '170', '180', '190', '200'], - 'default': '100', - 'netplay': true + 'default': '100' }, 'fba-diagnostic-input': { 'label': this.localization('Diagnostic Input'), 'options': ['None', 'Hold Start', 'Start + A + B', 'Hold Start + A + B', 'Start + L + R', 'Hold Start + L + R', 'Hold Select', 'Select + A + B', 'Hold Select + A + B', 'Select + L + R', 'Hold Select + L + R'], - 'default': 'None', - 'netplay': true + 'default': 'None' }, 'fba-neogeo-mode': { 'label': this.localization('Force Neo Geo mode'), 'options': ['MVS', 'AES', 'UNIBIOS', 'DIPSWITCH'], - 'default': 'MVS', - 'netplay': true + 'default': 'MVS' } }; break; @@ -4900,14 +5344,28 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { default: _0xa88a13 = {}; } + const _this = this; if (this.coreVer === 2) { _0xa88a13 = {}; _0xa88a13['fps'] = { 'label': this.localization('FPS'), - 'options': ["show", "hide"], + 'options': { + 'show': this.localization("show"), + 'hide': this.localization("hide") + }, 'default': "hide" } } + if (_0xdcec2a && (_0xdcec2a.virtualGamepadContainer != 'undefined' || _0xdcec2a.virtualGamepadContainer !== null)) { + _0xa88a13['left-handed-mode'] = { + 'label': this.localization('Left Handed Mode'), + 'options': { + 'on': this.localization('On'), + 'off': this.localization('Off') + }, + 'default': 'off' + } + } if (this.statesSupported === true) { _0xa88a13['save-state-slot'] = { 'label': this.localization('Save State Slot'), @@ -4925,36 +5383,38 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'default': 'download' } } - let _this = this; try { _0xdcec2a.getGameCoreOptions && _0xdcec2a.getGameCoreOptions().split('\n').forEach(function(_0x2bef5a, _0x49b64b) { let _0x5995db = _0x2bef5a.split('; '), - _0x16274c = _0x5995db[0x0]; + _0x16274c = _0x5995db[0]; if (0x0 === _0x16274c.indexOf('fba-dipswitch-') || _this.coreVer === 2) { - let _0x757776 = _0x5995db[0x1].split('|'), + let _0x757776 = _0x5995db[1].split('|'), _0x1f895e = _0x16274c.split("|")[0].replace(/_/g, ' ').replace(/.+\-(.+)/, '$1'); _0x757776.slice(1, -1); if (_0x757776.length === 1) return; + let options = {}; + for (let i=0; i<_0x757776.length; i++) { + options[_0x757776[i]] = _this.localization(_0x757776[i]); + } _0xa88a13[_0x16274c.split("|")[0]] = { - 'label': _0x1f895e, - 'options': _0x757776, - 'default': (_0x16274c.split("|").length > 1) ? _0x16274c.split("|")[1] : _0x757776[0].replace('(Default) ', ''), - 'netplay': true + 'label': _this.localization(_0x1f895e), + 'options': options, + 'default': (_0x16274c.split("|").length > 1) ? _0x16274c.split("|")[1] : _0x757776[0].replace('(Default) ', '') }; } }); } catch(e) {}; return _0xa88a13; }, - /* 'supportNetPlay': function() { - if (this.lightgun || this.mouse) return !0x1; + if (!this.listUrl || !this.socketUrl || !this.statesSupported) return false; + if (this.lightgun || this.mouse) return false; let _0xa88a13 = window.RTCPeerConnection || window.webkitPeerConnection00 || window.webkitRTCPeerConnection || window.mozRTCPeerConnection, _0x17edbf = window.mozRTCIceCandidate || window.RTCIceCandidate, _0x2c1832 = window.mozRTCSessionDescription || window.RTCSessionDescription; return !!(_0xa88a13 && _0x17edbf && _0x2c1832) && !!(_0xa88a13 && 'createDataChannel' in _0xa88a13.prototype); }, - 'isNetPlay': function() {},*/ + 'isNetPlay': function() {}, 'findElements': function() { try { return this.elements.controls = _0x530042.call(this, this.config.selectors.controls.wrapper), this.elements.buttons = { @@ -4965,16 +5425,17 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'settings': _0x530042.call(this, this.config.selectors.buttons.settings), 'fullscreen': _0x530042.call(this, this.config.selectors.buttons.fullscreen), 'saveState': _0x530042.call(this, this.config.selectors.buttons.saveState), + 'cacheManager': _0x530042.call(this, this.config.selectors.buttons.cacheManager), 'screenRecord': _0x530042.call(this, this.config.selectors.buttons.screenRecord), 'loadState': _0x530042.call(this, this.config.selectors.buttons.loadState), 'gamepad': _0x530042.call(this, this.config.selectors.buttons.gamepad), - //'netplay': _0x530042.call(this, this.config.selectors.buttons.netplay), + 'netplay': _0x530042.call(this, this.config.selectors.buttons.netplay), 'cheat': _0x530042.call(this, this.config.selectors.buttons.cheat) }, this.elements.inputs = { 'volume': _0x530042.call(this, this.config.selectors.inputs.volume) }, true; } catch (_0x527381) { - return this.debug.warn('It looks like there is a problem with your custom controls HTML', _0x527381), !0x1; + return this.debug.warn('It looks like there is a problem with your custom controls HTML', _0x527381), false; } }, 'createIcon': function(_0x43d42f, _0x42a597) { @@ -4985,11 +5446,11 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { })); let _0x50b7a7 = document.createElement('div'); _0x50b7a7.innerHTML = '' .concat(this.icons[_0x43d42f], ''); - for (let _0x373099 = _0x50b7a7.childNodes[0x0].childNodes, _0x804f4d = 0x0; _0x804f4d < _0x373099.length; _0x804f4d += 0x1) _0x2c1832.appendChild(_0x373099[_0x804f4d]); + for (let _0x373099 = _0x50b7a7.childNodes[0].childNodes, _0x804f4d = 0; _0x804f4d < _0x373099.length; _0x804f4d += 1) _0x2c1832.appendChild(_0x373099[_0x804f4d]); return _0x2c1832; }, 'createLabel': function(_0x185043) { - let _0x17edbf = arguments.length > 0x1 && void 0x0 !== arguments[0x1] ? arguments[0x1] : {}, + let _0x17edbf = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, _0x2c1832 = _0xb9b2ff.get(_0x185043, this.config), _0x3d681f = {}; _0x3d681f[_0x17edbf.class] = true, _0x3d681f[this.config.classNames.hidden] = true; @@ -5011,9 +5472,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x2c1832, _0x325832, _0xcb618b, _0x25c678, _0x58309d = _0x428003('button'), _0x183584 = Object.assign({}, _0x493eb2), _0x2345d2 = _0x9fdcea(_0x427a85), - _0x2ca20d = !0x1; + _0x2ca20d = false; 'type' in _0x183584 || (_0x183584.type = 'button'); - let _0x34225b = _0x449eac({ + let _0x34225b = getClass({ 'ejs__control': true }); switch ('class' in _0x183584 ? _0x183584.class.includes(_0x34225b) || (_0x183584.class += ' ' .concat(_0x34225b)) : _0x183584.class = _0x34225b, _0x427a85) { @@ -5030,19 +5491,19 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x2c1832 = _0x2345d2, _0x325832 = _0x427a85; } return _0x2ca20d ? (_0x58309d.appendChild(_0x7f9f36.createIcon.call(this, _0x25c678, { - 'class': _0x449eac({ + 'class': getClass({ 'icon--pressed': true }) })), _0x58309d.appendChild(_0x7f9f36.createIcon.call(this, _0x325832, { - 'class': _0x449eac({ + 'class': getClass({ 'icon--not-pressed': true }) })), _0x58309d.appendChild(_0x7f9f36.createLabel.call(this, _0xcb618b, { - 'class': _0x449eac({ + 'class': getClass({ 'icon--pressed': true }) })), _0x58309d.appendChild(_0x7f9f36.createLabel.call(this, _0x2c1832, { - 'class': _0x449eac({ + 'class': getClass({ 'icon--not-pressed': true }) }))) : (_0x58309d.appendChild(_0x7f9f36.createIcon.call(this, _0x325832)), _0x58309d.appendChild(_0x7f9f36.createLabel.call(this, _0x2c1832))), _0x5dc0c0(_0x183584, _0xa949a8(this.config.selectors.buttons[_0x2345d2], _0x183584)), _0x154f99(_0x58309d, _0x183584), 'play' === _0x2345d2 ? (_0x1e2c68.array(this.elements.buttons[_0x2345d2]) || (this.elements.buttons[_0x2345d2] = []), this.elements.buttons[_0x2345d2].push(_0x58309d)) : this.elements.buttons[_0x2345d2] = _0x58309d, _0x58309d; @@ -5050,14 +5511,14 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'createRange': function(_0x491b4a, _0x5f154a) { let _0x2c1832 = _0x428003('input', _0x5dc0c0(_0xa949a8(this.config.selectors.inputs[_0x491b4a]), { 'type': 'range', - 'min': 0x0, + 'min': 0, 'max': 0x64, 'step': 0.1, - 'value': 0x0, + 'value': 0, 'autocomplete': 'off', 'role': 'slider', 'aria-label': _0xb9b2ff.get(_0x491b4a, this.config), - 'aria-valuemin': 0x0, + 'aria-valuemin': 0, 'aria-valuemax': 0x64, 'aria-valuenow': 0x0 }, _0x5f154a)); @@ -5071,7 +5532,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (!_0x51717d && [0x20, 0x27].includes(_0x4bb9d6.which)) _0x7f9f36.showMenuPanel.call(_0x2c1832, _0x2770c2, true); else 0x20 !== _0x4bb9d6.which && (0x28 === _0x4bb9d6.which || _0x51717d && 0x27 === _0x4bb9d6.which ? (_0x20ac7b = _0x1830d1.nextElementSibling, _0x1e2c68.element(_0x20ac7b) || (_0x20ac7b = _0x1830d1.parentNode.firstElementChild)) : (_0x20ac7b = _0x1830d1.previousElementSibling, _0x1e2c68.element(_0x20ac7b) || (_0x20ac7b = _0x1830d1.parentNode.lastElementChild)), _0x31cc23.call(_0x2c1832, _0x20ac7b, true)); } - }, !0x1), _0x1093f4(_0x1830d1, 'keyup', function(_0x3844f5) { + }, false), _0x1093f4(_0x1830d1, 'keyup', function(_0x3844f5) { 0xd === _0x3844f5.which && _0x7f9f36.focusFirstMenuItem.call(_0x2c1832, null, true); }); }, @@ -5082,9 +5543,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x57313b = _0x52a95b.type, _0x19be70 = _0x52a95b.title, _0x4ae558 = _0x52a95b.badge, - _0x34a012 = void 0x0 === _0x4ae558 ? null : _0x4ae558, + _0x34a012 = void 0 === _0x4ae558 ? null : _0x4ae558, _0x7dbb2e = _0x52a95b.checked, - _0x200580 = void 0x0 !== _0x7dbb2e && _0x7dbb2e, + _0x200580 = void 0 !== _0x7dbb2e && _0x7dbb2e, _0x4bb1a2 = _0xa949a8(this.config.selectors.inputs[_0x57313b]), _0xb8fbbd = _0x428003('button', _0x5dc0c0(_0x4bb1a2, { 'type': 'button', @@ -5109,14 +5570,19 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }); let _0x449ec7 = _0x7f9f36.getCoreOptions.call(this); this.listeners.bind(_0xb8fbbd, 'click keyup', function(_0x270d0d) { - _0x1e2c68.keyboardEvent(_0x270d0d) && 0x20 !== _0x270d0d.which || (_0x270d0d.preventDefault(), _0x270d0d.stopPropagation(), _0xb8fbbd.checked = true, Object.keys(_0x7f9f36.normalOptions).includes(_0x57313b) && _0x7f9f36.updateNormalOptions.call(_0x17edbf, _0x57313b, _0x2c1832), Object.keys(_0x449ec7).includes(_0x57313b) && _0x7f9f36.updateCoreOptions.call(_0x17edbf, _0x57313b, _0x2c1832)), _0x7f9f36.showMenuPanel.call(_0x17edbf, 'home', _0x1e2c68.keyboardEvent(_0x270d0d)); - }, _0x57313b, !0x1), _0x7f9f36.bindMenuItemShortcuts.call(this, _0xb8fbbd, _0x57313b), _0x231912.appendChild(_0xb8fbbd); + _0x1e2c68.keyboardEvent(_0x270d0d) && 0x20 !== _0x270d0d.which || (_0x270d0d.preventDefault(), _0x270d0d.stopPropagation(), _0xb8fbbd.checked = true, Object.keys(_0x7f9f36.normalOptions).includes(_0x57313b) && _0x7f9f36.updateNormalOptions.call(_0x17edbf, _0x57313b, _0x2c1832), Object.keys(_0x449ec7).includes(_0x57313b) && (_0x449ec7[_0x57313b].netplay && _0xdcec2a.connected ? _0xdcec2a.connection.isInitiator && (_0x7f9f36.updateCoreOptions.call(_0x17edbf, _0x57313b, _0x2c1832), _0xdcec2a.connection.send(JSON.stringify({ + 'act': 'update-core-option', + 'key': _0x57313b, + 'value': _0x2c1832, + 'frame': _0xdcec2a.currentFrame + }))) : _0x7f9f36.updateCoreOptions.call(_0x17edbf, _0x57313b, _0x2c1832)), _0x7f9f36.showMenuPanel.call(_0x17edbf, 'home', _0x1e2c68.keyboardEvent(_0x270d0d))); + }, _0x57313b, false), _0x7f9f36.bindMenuItemShortcuts.call(this, _0xb8fbbd, _0x57313b), _0x231912.appendChild(_0xb8fbbd); }, 'updateVolume': function() { - _0x1e2c68.element(this.elements.inputs.volume) && _0x7f9f36.setRange.call(this, this.elements.inputs.volume, this.muted ? 0x0 : this.volume), _0x1e2c68.element(this.elements.buttons.mute) && (this.elements.buttons.mute.pressed = this.muted || 0x0 === this.volume); + _0x1e2c68.element(this.elements.inputs.volume) && _0x7f9f36.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume), _0x1e2c68.element(this.elements.buttons.mute) && (this.elements.buttons.mute.pressed = this.muted || 0 === this.volume); }, 'setRange': function(_0x1c075b) { - let _0x17edbf = arguments.length > 0x1 && void 0x0 !== arguments[0x1] ? arguments[0x1] : 0x0; + let _0x17edbf = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0; _0x1e2c68.element(_0x1c075b) && (_0x1c075b.value = _0x17edbf, _0x7f9f36.updateRangeFill.call(this, _0x1c075b)); }, 'updateRangeFill': function(_0x2dbde1) { @@ -5124,7 +5590,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (_0x1e2c68.element(_0x17edbf) && 'range' === _0x17edbf.getAttribute('type')) { if (_0x13f491(_0x17edbf, this.config.selectors.inputs.volume)) { let _0x2c1832 = 0x64 * _0x17edbf.value; - _0x17edbf.setAttribute('aria-valuenow', _0x2c1832), _0x17edbf.setAttribute('aria-valuetext', '' .concat(_0x2c1832.toFixed(0x1), '%')); + _0x17edbf.setAttribute('aria-valuenow', _0x2c1832), _0x17edbf.setAttribute('aria-valuetext', '' .concat(_0x2c1832.toFixed(1), '%')); } else _0x17edbf.setAttribute('aria-valuenow', _0x17edbf.value); _0x59aa33.isWebkit && _0x17edbf.style.setProperty('--value', '' .concat(_0x17edbf.value / _0x17edbf.max * 0x64, '%')); } @@ -5132,18 +5598,22 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'toggleMenuButton': function(_0x249814, _0x2948e9) { _0x132da7(this.elements.settings.buttons[_0x249814], !_0x2948e9); }, - 'updateNormalOptions': function(_0x255b79, _0x505484) { - this.elements.settings.buttons[_0x255b79].querySelector('.' .concat(this.config.classNames.menu.value)).innerHTML = _0x7f9f36.normalOptions[_0x255b79].options[_0x505484]; + 'updateNormalOptions': function(option, value) { + this.elements.settings.buttons[option].querySelector('.' .concat(this.config.classNames.menu.value)).innerHTML = _0x7f9f36.normalOptions[option].options[value]; let _0x2c1832 = {}; - _0x2c1832[_0x255b79] = _0x505484, _0x7f9f36.storage.set(_0x2c1832), 'shader' === _0x255b79 && _0xdcec2a.setShader(_0x505484), 'virtual-gamepad' === _0x255b79 && _0xdcec2a.toggleVirtualGamepad.call(this, 'enabled' === _0x505484); + _0x2c1832[option] = value; + _0x7f9f36.storage.set(_0x2c1832); + 'shader' === option && _0xdcec2a.setShader(value); + 'virtual-gamepad' === option && _0xdcec2a.toggleVirtualGamepad.call(this, 'enabled' === value); }, 'updateCoreOptions': function(_0x41c4ad, _0x15823e) { - if ('nds' == this.system && !_0x2d904a.wasm) return true; - if (_0x7f9f36.coreOptionsValues[_0x41c4ad] = _0x15823e, 'psx' === this.system && _0x27f4c4.Module.pauseMainLoop(), _0xdcec2a.setVariable(_0x41c4ad, _0x15823e), 'psx' === this.system && (setTimeout(function() { + if ('nds' === getSystem(this.system, true) && !_0x2d904a.wasm) return true; + _0x7f9f36.coreOptionsValues[_0x41c4ad] = _0x15823e; + if ('psx' === getSystem(this.system, true) && _0x27f4c4.Module.pauseMainLoop(), _0xdcec2a.setVariable(_0x41c4ad, _0x15823e), 'psx' === getSystem(this.system, true) && (setTimeout(function() { _0x27f4c4.Module.resumeMainLoop(); }, 0x64), setTimeout(function() { _0x27f4c4.Module.resumeMainLoop(); - }, 0xc8)), 'nds' === this.system && _0x2d904a.wasm) { + }, 0xc8)), 'nds' === getSystem(this.system, true) && _0x2d904a.wasm) { let _0x2c1832 = this.elements.wrapper.querySelector('canvas'); if ('screen_rotation' === _0x41c4ad) switch (_0x2c1832.style.transform = 'rotate(' + _0x15823e + 'deg)', _0x15823e) { case '0': @@ -5159,9 +5629,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0xdcec2a.setVariable('desmume_input_rotation', '90'); } } - if ('arcade' === this.system || 'fba0.2.97.29' === this.system) { + if ('arcade' === getSystem(this.system, true) || 'fba0.2.97.29' === getSystem(this.system, true)) { let _0x567ccc = this.elements.wrapper.querySelector('canvas'); - _0x567ccc.height = 'fba-aspect' === _0x41c4ad && 'PAR' === _0x15823e ? _0x567ccc.width / 0x10 * 0x9 : _0x567ccc.width / 0x4 * 0x3; + _0x567ccc.height = 'fba-aspect' === _0x41c4ad && 'PAR' === _0x15823e ? _0x567ccc.width / 0x10 * 0x9 : _0x567ccc.width / 4 * 3; } let _0x31bdec = _0x7f9f36.getCoreOptions.call(this), _0x3efd0b = _0x7f9f36.storage.get('core-options'); @@ -5171,16 +5641,19 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0xe95e6a = this.elements.settings.buttons[_0x41c4ad].querySelector('.' .concat(this.config.classNames.menu.value)); _0x1e2c68.object(_0x31bdec[_0x41c4ad].options) ? _0xe95e6a.innerHTML = _0x31bdec[_0x41c4ad].options[_0x15823e] : _0xe95e6a.innerHTML = _0x15823e; } + if (_0x41c4ad === 'left-handed-mode') { + _0xdcec2a.toggleVirtualGamepad.call(this, true, true); + } }, 'setOptionMenuItem': function(_0x2f0e6a, _0x85969e) { let _0x2c1832 = this, _0x549dac = this.elements.settings.panels.home.querySelector('[role="menu"]'), - _0x43777f = this.elements.settings.popup.children[0x0]; + _0x43777f = this.elements.settings.popup.children[0]; Object.keys(_0x2f0e6a).forEach(function(_0x4fcbcf) { let _0x177975 = _0x4fcbcf, _0x5f3e0f = _0x428003('button', _0x5dc0c0(_0xa949a8(_0x2c1832.config.selectors.buttons.settings), { 'type': 'button', - 'class': _0x449eac({ + 'class': getClass({ 'ejs__control': true, 'ejs__control--forward': true }), @@ -5189,7 +5662,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'aria-haspopup': true })); _0x1093f4(_0x5f3e0f, 'click', function() { - _0x7f9f36.showMenuPanel.call(_0x2c1832, _0x177975, !0x1); + _0x7f9f36.showMenuPanel.call(_0x2c1832, _0x177975, false); }); let _0x1d5857, _0x1838f9 = _0x428003('span', null, _0x2f0e6a[_0x4fcbcf].label), _0x455b20 = _0x428003('span', { @@ -5202,7 +5675,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }), _0x288440 = _0x428003('button', { 'type': 'button', - 'class': _0x449eac({ + 'class': getClass({ 'ejs__control': true, 'ejs__control--back': true }) @@ -5210,21 +5683,22 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x288440.appendChild(_0x428003('span', { 'aria-hidden': true }, _0x2f0e6a[_0x4fcbcf].label)), _0x288440.appendChild(_0x428003('span', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__sr-only': true }) }, _0xb9b2ff.get('menuBack', _0x2c1832.config))), _0x1093f4(_0x3f3775, 'keydown', function(_0x462a4d) { 0x25 === _0x462a4d.which && (_0x462a4d.preventDefault(), _0x462a4d.stopPropagation(), _0x7f9f36.showMenuPanel.call(_0x2c1832, 'home', true)); - }, !0x1), _0x1093f4(_0x288440, 'click', function() { - _0x7f9f36.showMenuPanel.call(_0x2c1832, 'home', !0x1); + }, false), _0x1093f4(_0x288440, 'click', function() { + _0x7f9f36.showMenuPanel.call(_0x2c1832, 'home', false); }), _0x3f3775.appendChild(_0x288440), _0x3f3775.appendChild(_0x428003('div', { 'role': 'menu' })), _0x43777f.appendChild(_0x3f3775), _0x2c1832.elements.settings.buttons[_0x177975] = _0x5f3e0f, _0x2c1832.elements.settings.panels[_0x177975] = _0x3f3775; let _0x2c172f = _0x3f3775.querySelector('[role="menu"]'); - ! function(_0x301c01) { + !function(_0x301c01) { if (_0x1e2c68.element(_0x301c01)) - for (let _0x85969e = _0x301c01.childNodes.length; _0x85969e > 0x0;) _0x301c01.removeChild(_0x301c01.lastChild), _0x85969e -= 0x1; - }(_0x2c172f), _0x1e2c68.object(_0x2f0e6a[_0x4fcbcf].options) ? Object.keys(_0x2f0e6a[_0x4fcbcf].options).forEach(function(_0x281296) { + for (let _0x85969e = _0x301c01.childNodes.length; _0x85969e > 0;) _0x301c01.removeChild(_0x301c01.lastChild), _0x85969e -= 1; + }(_0x2c172f); + _0x1e2c68.object(_0x2f0e6a[_0x4fcbcf].options) ? Object.keys(_0x2f0e6a[_0x4fcbcf].options).forEach(function(_0x281296) { _0x7f9f36.createMenuItem.call(_0x2c1832, { 'value': _0x281296, 'list': _0x2c172f, @@ -5247,68 +5721,92 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, 'setNormalOptionsMenu': function() { let _this = this, - _0x17edbf = this, _0x2c1832 = {}; - _0x2c1832.orientation = _0x7f9f36.storage.get('orientation'); - _0x2c1832.shader = _0x7f9f36.storage.get('shader'); - _0x17edbf.touch ? (_0x2c1832['virtual-gamepad'] = _0x7f9f36.storage.get('virtual-gamepad'), _0x1093f4.call(_0x17edbf, _0x17edbf.elements.container, 'start-game', function() { - ('enabled' === _0x2c1832['virtual-gamepad'] || _0x1e2c68.empty(_0x2c1832['virtual-gamepad'])) && _0xdcec2a.toggleVirtualGamepad.call(_0x17edbf, true); - })) : delete _0x7f9f36.normalOptions['virtual-gamepad']; + if (this.config.defaultMenuOptions && this.config.defaultMenuOptions.length === undefined) { + _0x2c1832 = this.config.defaultMenuOptions; + } + _0x2c1832.orientation = _0x7f9f36.storage.get('orientation'); + _0x2c1832.shader = _0x7f9f36.storage.get('shader') || _0x2c1832.shader; + if (_this.touch) { + _0x2c1832['virtual-gamepad'] = _0x7f9f36.storage.get('virtual-gamepad') || _0x2c1832['virtual-gamepad']; + _0x1093f4.call(_this, _this.elements.container, 'start-game', function() { + ('enabled' === _0x2c1832['virtual-gamepad'] || _0x1e2c68.empty(_0x2c1832['virtual-gamepad'])) && _0xdcec2a.toggleVirtualGamepad.call(_this, true); + }) + } else { + delete _0x7f9f36.normalOptions['virtual-gamepad']; + } _0x7f9f36.setOptionMenuItem.call(this, _0x7f9f36.normalOptions, _0x2c1832); - _0x1093f4.call(_0x17edbf, _0x17edbf.elements.container, 'start-game', function() { + _0x1093f4.call(_this, _this.elements.container, 'start-game', function() { let shader = _0x7f9f36.storage.get('shader'); if (shader !== 'disabled') { _0xdcec2a.setShader(shader); } - let _0x2c1832 = _this, - _0x42a7b1 = {}; + let _0x42a7b1 = {}; _0xdcec2a.getGameCoreOptions && _0xdcec2a.getGameCoreOptions().split('\n').forEach(function(_0x4a987e, _0x10bd7a) { let _0x2c1832 = _0x4a987e.split('; '), _0x1ddc5f = _0x2c1832[0]; - if (0 === _0x1ddc5f.indexOf('fba-dipswitch-') || _0x17edbf.coreVer === 2) { + if (0 === _0x1ddc5f.indexOf('fba-dipswitch-') || _this.coreVer === 2) { let _0xbd808 = _0x2c1832[1].split('|'), _0x3c4b1a = _0x1ddc5f.split("|")[0].replace(/_/g, ' ').replace(/.+\-(.+)/, '$1'); _0xbd808.slice(1, -1); if (_0xbd808.length === 1) return; + let options = {}; + for (let i=0; i<_0xbd808.length; i++) { + options[_0xbd808[i]] = _this.localization(_0xbd808[i]); + } _0x42a7b1[_0x1ddc5f.split("|")[0]] = { - 'label': _0x3c4b1a, - 'options': _0xbd808, - 'default': (_0x1ddc5f.split("|").length > 1) ? _0x1ddc5f.split("|")[1] : _0xbd808[0].replace('(Default) ', ''), - 'netplay': true + 'label': _this.localization(_0x3c4b1a), + 'options': options, + 'default': (_0x1ddc5f.split("|").length > 1) ? _0x1ddc5f.split("|")[1] : _0xbd808[0].replace('(Default) ', '') }; } }); let _0x27d859 = _0x7f9f36.storage.get('core-options'); - _0x7f9f36.coreOptionsValues = _0x27d859 || {}; - _0x7f9f36.setOptionMenuItem.call(_0x17edbf, _0x42a7b1, _0x7f9f36.coreOptionsValues); + _0x27d859 = _0x27d859 || {}; + _0x7f9f36.coreOptionsValues = _0x27d859; + _0x7f9f36.setOptionMenuItem.call(_this, _0x42a7b1, _0x7f9f36.coreOptionsValues); Object.keys(_0x7f9f36.coreOptionsValues).forEach(function(_0x51fc4e, _0x4b3613) { _0x7f9f36.updateCoreOptions.call(_0x2c1832, _0x51fc4e, _0x7f9f36.coreOptionsValues[_0x51fc4e]); }); - 'nds' == _0x17edbf.system && (_0x27f4c4.Module._fast_forward_2 ? _0x27f4c4.Module._fast_forward_2(1) : _0x27f4c4.Module._fast_forward && _0x27f4c4.Module._fast_forward(1)); + 'nds' == getSystem(_this.system, true) && (_0x27f4c4.Module._fast_forward_2 ? _0x27f4c4.Module._fast_forward_2(1) : _0x27f4c4.Module._fast_forward && _0x27f4c4.Module._fast_forward(1)); }); }, 'updateCoreOptionMenuItems': function() { let _0xa88a13 = this.elements.settings.panels.home.querySelector('[role="menu"]'), _0x17edbf = _0x7f9f36.getCoreOptions.call(this); - Object.keys(_0x17edbf).forEach(function(_0x20e093) { + _0xdcec2a.connected && !_0xdcec2a.connection.isInitiator ? Object.keys(_0x17edbf).forEach(function(_0x480587) { + _0x17edbf[_0x480587].netplay && _0xa88a13.querySelector('[item="' .concat(_0x480587, '"]')).setAttribute('disabled', ''); + }) : Object.keys(_0x17edbf).forEach(function(_0x20e093) { _0xa88a13.querySelector('[item="' .concat(_0x20e093, '"]')).removeAttribute('disabled'); }); }, 'setCoreOptionsMenu': function() { - this.elements.settings.panels.home.querySelector('[role="menu"]'), this.elements.settings.popup.children[0x0]; + this.elements.settings.panels.home.querySelector('[role="menu"]'), this.elements.settings.popup.children[0]; let _0xa88a13 = _0x7f9f36.getCoreOptions.call(this), _0x17edbf = _0x7f9f36.storage.get('core-options'); - _0x7f9f36.coreOptionsValues = _0x17edbf || {}, _0x7f9f36.setOptionMenuItem.call(this, _0xa88a13, _0x17edbf); + _0x17edbf = _0x17edbf || {} + if (this.config.defaultMenuOptions && this.config.defaultMenuOptions.length === undefined) { + for (let k in this.config.defaultMenuOptions) { + if (!_0x17edbf[k]) { + _0x17edbf[k] = this.config.defaultMenuOptions[k]; + } + } + _0x2c1832 = this.config.defaultMenuOptions; + } + if ('undefined' != typeof EJS_DEBUG_XX && true === EJS_DEBUG_XX) { + console.log('Available core options: ', _0xa88a13); + } + _0x7f9f36.coreOptionsValues = _0x17edbf, _0x7f9f36.setOptionMenuItem.call(this, _0xa88a13, _0x17edbf); }, 'checkMenu': function() { let _0xa88a13 = this.elements.settings.buttons; !_0x1e2c68.empty(_0xa88a13) && Object.values(_0xa88a13).some(function(_0x200331) { return !_0x200331.hidden; }); - _0x132da7(this.elements.settings.menu, !0x1); + _0x132da7(this.elements.settings.menu, false); }, 'focusFirstMenuItem': function(_0x303d68) { - let _0x17edbf = arguments.length > 0x1 && void 0x0 !== arguments[0x1] && arguments[0x1]; + let _0x17edbf = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; if (!this.elements.settings.popup.hidden) { let _0x2c1832 = _0x303d68; _0x1e2c68.element(_0x2c1832) || (_0x2c1832 = Object.values(this.elements.settings.panels).find(function(_0xe94c5e) { @@ -5325,7 +5823,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x614270 = _0x17edbf.hidden, _0x14f1b5 = _0x614270; if (_0x1e2c68.boolean(_0x28d6c6)) _0x14f1b5 = _0x28d6c6; - else if (_0x1e2c68.keyboardEvent(_0x28d6c6) && 0x1b === _0x28d6c6.which) _0x14f1b5 = !0x1; + else if (_0x1e2c68.keyboardEvent(_0x28d6c6) && 0x1b === _0x28d6c6.which) _0x14f1b5 = false; else if (_0x1e2c68.event(_0x28d6c6)) { let _0xcf75ac = _0x17edbf.contains(_0x28d6c6.target); if (_0xcf75ac || !_0xcf75ac && _0x28d6c6.target !== _0x2c1832 && _0x14f1b5) return; @@ -5352,8 +5850,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'showLoadStatePanel': function() {}, 'showMenuPanel': function() { let _this = this, - _0x17edbf = arguments.length > 0x0 && void 0x0 !== arguments[0x0] ? arguments[0x0] : '', - _0x2c1832 = arguments.length > 0x1 && void 0x0 !== arguments[0x1] && arguments[0x1], + _0x17edbf = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : '', + _0x2c1832 = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], _0x7f4281 = _0x530042.call(this, '[data-pane="' .concat(escape(_0x17edbf), '"]')); if (_0x1e2c68.element(_0x7f4281)) { let _0x3d6729 = _0x7f4281.parentNode, @@ -5377,10 +5875,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'setLoadState': function(_0x526828, _0x2ce330) { _0x526828.appendChild(_0x7f9f36.createButton.call(this, 'load-state', { 'aria-haspopup': true, - 'aria-expanded': !0x1 + 'aria-expanded': false })); let _0x2c1832 = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__dialog': true, 'ejs__load-state__container': true }), @@ -5388,23 +5886,23 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }), _0x2e5e96 = _0x428003('div'); _0x2c1832.appendChild(_0x2e5e96); - _0x530042.call(this, '.' .concat(_0x449eac({ + _0x530042.call(this, '.' .concat(getClass({ 'ejs__dialogs': true }))).appendChild(_0x2c1832); this.elements.dialogs.loadState = _0x2c1832; }, 'setScreenRecord': function(_0x4c3fdd, _0x289259) { - if (! window.MediaRecorder) { + if (!window.MediaRecorder) { return; }; let _0x2c1832 = _0x7f9f36.createButton.call(this, 'screen-record', { 'aria-haspopup': true, - 'aria-expanded': !0x1, + 'aria-expanded': false, 'style': 'margin-right:auto;' }); _0x4c3fdd.appendChild(_0x2c1832); let _0x13c0e4 = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__dialog': true, 'ejs__screenRecord__container': true }), @@ -5412,20 +5910,41 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }), _0xe2c02a = _0x428003('div'); _0x13c0e4.appendChild(_0xe2c02a); - _0x530042.call(this, '.' .concat(_0x449eac({ + _0x530042.call(this, '.' .concat(getClass({ 'ejs__dialogs': true }))).appendChild(_0x13c0e4); this.elements.dialogs.screenRecord = _0x13c0e4; }, - 'setGamepad': function(_0x4c3fdd, _0x289259) { - let _0x2c1832 = _0x7f9f36.createButton.call(this, 'gamepad', { + 'setCacheManager': function(_0x4c3fdd, _0x289259) { + let _0x2c1832 = _0x7f9f36.createButton.call(this, 'cache-manager', { 'aria-haspopup': true, - 'aria-expanded': !0x1, + 'aria-expanded': false, 'style': 'margin-right:auto;' }); _0x4c3fdd.appendChild(_0x2c1832); let _0x13c0e4 = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ + 'ejs__dialog': true, + 'ejs__cacheManager__container': true + }), + 'hidden': '' + }), + _0xe2c02a = _0x428003('div'); + _0x13c0e4.appendChild(_0xe2c02a); + _0x530042.call(this, '.' .concat(getClass({ + 'ejs__dialogs': true + }))).appendChild(_0x13c0e4); + this.elements.dialogs.cacheManager = _0x13c0e4; + }, + 'setGamepad': function(_0x4c3fdd, _0x289259) { + let _0x2c1832 = _0x7f9f36.createButton.call(this, 'gamepad', { + 'aria-haspopup': true, + 'aria-expanded': false, + 'style': 'margin-right:auto;' + }); + _0x4c3fdd.appendChild(_0x2c1832); + let _0x13c0e4 = _0x428003('div', { + 'class': getClass({ 'ejs__dialog': true, 'ejs__gamepad__container': true }), @@ -5433,7 +5952,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }), _0xe2c02a = _0x428003('div'); _0x13c0e4.appendChild(_0xe2c02a); - _0x530042.call(this, '.' .concat(_0x449eac({ + _0x530042.call(this, '.' .concat(getClass({ 'ejs__dialogs': true }))).appendChild(_0x13c0e4); this.elements.dialogs.gamepad = _0x13c0e4; @@ -5441,12 +5960,12 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'setCheat': function(_0x328075, _0x21ca37) { let _0x2c1832 = _0x7f9f36.createButton.call(this, 'cheat', { 'aria-haspopup': true, - 'aria-expanded': !0x1, + 'aria-expanded': false, 'style': 'margin-right:auto;' }); _0x328075.appendChild(_0x2c1832); let _0x173db3 = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__dialog': true, 'ejs__cheat__container': true }), @@ -5454,36 +5973,36 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }), _0x460961 = _0x428003('div'); _0x173db3.appendChild(_0x460961); - _0x530042.call(this, '.' .concat(_0x449eac({ + _0x530042.call(this, '.' .concat(getClass({ 'ejs__dialogs': true }))).appendChild(_0x173db3); this.elements.dialogs.cheat = _0x173db3; }, 'setStateInfoBarWidget': function() { let _0xa88a13 = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__widget': true }) }), _0x17edbf = _0x428003('div'); _0x17edbf.style = 'color: red;font-size: 17px;padding:10px;text-align:left;text-shadow:1px 1px 1px #000' _0xa88a13.appendChild(_0x17edbf); - _0x530042.call(this, '.' .concat(_0x449eac({ + _0x530042.call(this, '.' .concat(getClass({ 'ejs__widgets': true }))).appendChild(_0xa88a13); this.elements.widgets.stateInfo = _0xa88a13; this.elements.widgets.stateInfoDiv = _0x17edbf; - },/* + }, 'setNetplayWidgets': function() { let _0xa88a13 = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__widget': true, 'ejs__widget_netplay': true }) }), _0x17edbf = _0x428003('div'); _0xa88a13.appendChild(_0x17edbf); - _0x530042.call(this, '.' .concat(_0x449eac({ + _0x530042.call(this, '.' .concat(getClass({ 'ejs__widgets': true }))).appendChild(_0xa88a13); this.elements.widgets.netplay = _0xa88a13; @@ -5491,10 +6010,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'setNetplay': function(_0x1859f4, _0x50544d) { _0x1859f4.appendChild(_0x7f9f36.createButton.call(this, 'netplay', { 'aria-haspopup': true, - 'aria-expanded': !0x1 + 'aria-expanded': false })); let _0x2c1832 = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__dialog': true, 'ejs__netplay__container': true }), @@ -5502,33 +6021,33 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }), _0x4f63e0 = _0x428003('div'); _0x2c1832.appendChild(_0x4f63e0); - _0x530042.call(this, '.' .concat(_0x449eac({ + _0x530042.call(this, '.' .concat(getClass({ 'ejs__dialogs': true }))).appendChild(_0x2c1832); this.elements.dialogs.netplay = _0x2c1832; _0x7f9f36.setNetplayWidgets.call(this); - },*/ + }, 'toggleContextMenu': function(_0x24b1f3, _0x4b9d55) { - if (_0x350d73(_0x24b1f3.target, _0x449eac({ + if (_0x350d73(_0x24b1f3.target, getClass({ 'ejs__dialogs': true }))) { let _0x2c1832 = _0x7f9f36.contextMenu.timer; if (this.started) { - let _0x2a1dda = _0x530042.call(this, '.' .concat(_0x449eac({ + let _0x2a1dda = _0x530042.call(this, '.' .concat(getClass({ 'ejs__contextmenu': true }), ' ul')); if (_0x4b9d55) { _0x7f9f36.contextMenu.style.display = 'block'; _0x7f9f36.contextMenu.style.left = ''.concat(_0x24b1f3.layerX, 'px'); _0x7f9f36.contextMenu.style.top = ''.concat(_0x24b1f3.layerY, 'px'); - let _0x1b48e7 = _0x23ffa1.call(this, '.' .concat(_0x449eac({ + let _0x1b48e7 = _0x23ffa1.call(this, '.' .concat(getClass({ 'ejs__contextmenu': true }), ' ul li')); if (null === _0x2a1dda.getAttribute('menu')) { let _0x14264d = _0x428003('li', {}); _0x14264d.appendChild(_0x428003('a', { 'target': '_blank', - 'href': 'https://github.com/ethanaobrien/emulatorjs' // Modifying this is against the terms of service + 'href': 'https://github.com/EmulatorJS/EmulatorJS' // Modifying this is against the terms of service }, 'EmulatorJS v' .concat(this.version))); _0x2a1dda.appendChild(_0x14264d); _0x2a1dda.setAttribute('menu', ''); @@ -5543,7 +6062,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x7f9f36.storage = new _0x2f61ba(this, 'ejs_' .concat(this.system, '_settings')); let _0x17edbf = _0x428003('div', _0xa949a8(this.config.selectors.controls.wrapper)); _0x7f9f36.contextMenu = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__contextmenu': true }), 'style': 'position: absolute; display:none;z-index:9' @@ -5579,45 +6098,6 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }) return false; }) - addContextHtml(_this.localization('Cache Manager'), true, function(_0x275730) { - if (_0x27f4c4.romdb) { - _0x132da7(_this.elements.dialogs.cache, !0x1); - let _0x3360eb = _this.elements.dialogs.cache.querySelector('.' .concat(_0x378b5c.classNames['dialog-content'])); - _0x3360eb.innerHTML = '
'+_this.localization('Loading')+'
'; - _0x27f4c4.romdb.getAll(function(_0x43586d) { - if (_0x43586d) { - let _0x275730 = _0x428003('table', { - 'style': 'width:100%;padding-left:10px;text-align:left' - }), - _0x1ab9e9 = _0x428003('tbody'); - _0x43586d.length > 0x0 ? (_0x3360eb.innerHTML = '', _0x43586d.forEach(function(_0x32b0b7, _0x2d0e11) { - if (_0x32b0b7.key && !/-part-\d+$/ .test(_0x32b0b7.key)) { - let _0x277c67 = [_0x32b0b7.key]; - for (let _0x3360eb = Math.ceil(_0x32b0b7.filesize / 0x6400000), _0x3edb35 = 0x1; _0x3edb35 < _0x3360eb; _0x3edb35 += 0x1) _0x277c67.push('' .concat(_0x32b0b7.key, '-part-').concat(_0x3edb35)); - let _0x3e31f6 = _0x428003('tr'), - _0x5b75bd = _0x428003('td'), - _0x227405 = _0x428003('td'), - _0xac150b = _0x428003('td'); - _0x5b75bd.innerHTML = _0x32b0b7.filename, _0x227405.innerHTML = function(_0x1858c1) { - let _0x2d0e11 = -0x1; - do { - _0x1858c1 /= 0x400, _0x2d0e11++; - } while (_0x1858c1 > 0x400); - return Math.max(_0x1858c1, 0.1).toFixed(0x1) + [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'][_0x2d0e11]; - }(_0x32b0b7.filesize), _0xac150b.innerHTML = 'Remove', _0x3e31f6.appendChild(_0x5b75bd), _0x3e31f6.appendChild(_0x227405), _0x3e31f6.appendChild(_0xac150b), _0x1ab9e9.appendChild(_0x3e31f6), _0xac150b.querySelector('a').onclick = function(_0x16f22a) { - _0x27f4c4.romdb.removeBatch(_0x277c67); - try { - _0x1ab9e9.removeChild(_0x3e31f6); - } catch (_0x353628) {} - return _0x16f22a.stopPropagation(), !0x1; - }; - } - }), _0x275730.appendChild(_0x1ab9e9), _0x3360eb.appendChild(_0x275730)) : _0x3360eb.innerHTML = '
'+_this.localization('Empty')+'
'; - } else _0x3360eb.innerHTML = '
'+_this.localization('Empty')+'
'; - }, function() {}); - } - return false; - }) addContextHtml(_this.localization('Quick Save')+' (F2)', false, function(_0x395c73) { _0x378b5c.quickSaveState(); _0x2593da.contextMenu.style.display = 'none'; @@ -5637,35 +6117,36 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x2c1832 = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__dialog': true, 'ejs__cache__container': true }), 'hidden': '' }); - _0x530042.call(this, '.' .concat(_0x449eac({ + _0x530042.call(this, '.' .concat(getClass({ 'ejs__dialogs': true }))).appendChild(_0x2c1832); this.elements.dialogs.cache = _0x2c1832; let _0x3c66db = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__dialog': true, 'ejs__loading__container': true }), 'hidden': '' }); - _0x530042.call(this, '.' .concat(_0x449eac({ + _0x530042.call(this, '.' .concat(getClass({ 'ejs__dialogs': true }))).appendChild(_0x3c66db); this.elements.dialogs.loading = _0x3c66db; _0x17edbf.appendChild(_0x7f9f36.createButton.call(this, 'restart')); _0x17edbf.appendChild(_0x7f9f36.createButton.call(this, 'play')); _0x17edbf.appendChild(_0x7f9f36.createButton.call(this, 'save-state', { - 'aria-expanded': !0x1 + 'aria-expanded': false })); _0x7f9f36.setLoadState.call(this, _0x17edbf, _0x42e40d); _0x7f9f36.setScreenRecord.call(this, _0x17edbf, _0x42e40d); - //_0x7f9f36.supportNetPlay.call(this, _0x17edbf) && parseInt(this.config.gameId, 0xa) > 0x0 && _0x7f9f36.setNetplay.call(this, _0x17edbf, _0x42e40d); + _0x7f9f36.setCacheManager.call(this, _0x17edbf, _0x42e40d); + //parseInt(this.config.gameId) > 0 && _0x7f9f36.setNetplay.call(this, _0x17edbf, _0x42e40d); _0x7f9f36.setGamepad.call(this, _0x17edbf, _0x42e40d); _0x7f9f36.setStateInfoBarWidget.call(this, _0x17edbf, _0x42e40d); _0x7f9f36.setCheat.call(this, _0x17edbf, _0x42e40d); @@ -5673,13 +6154,13 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'style': 'flex:1' })); let _0xd299b = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__volume': true }) }); _0xd299b.appendChild(_0x7f9f36.createButton.call(this, 'mute')); let _0x4bbcd0 = { - 'max': 0x1, + 'max': 1, 'step': 0.01, 'value': this.config.volume }; @@ -5687,16 +6168,16 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { this.elements.volume = _0xd299b; _0x17edbf.appendChild(_0xd299b); let _0x2746ab = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__menu': true }) }); _0x2746ab.appendChild(_0x7f9f36.createButton.call(this, 'settings', { 'aria-haspopup': true, - 'aria-expanded': !0x1 + 'aria-expanded': false })); let _0x262fb8 = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__menu__container': true }), 'hidden': '' @@ -5729,20 +6210,21 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'inject': function() { let _this = this; this.icons = { - 'enter-fullscreen': '', - 'exit-fullscreen': '', + 'enter-fullscreen': '', + 'exit-fullscreen': '', 'gamepad': '', 'load-state': '', - 'muted': '', - //'netplay': '', - 'pause': '', - 'play': '', - 'restart': '', + 'muted': '', + 'netplay': '', + 'pause': '', + 'play': '', + 'restart': '', 'save-state': '', - 'screen-record': '', - 'settings': '', - 'volume': '\n \n ', - 'cheat': '' + 'screen-record': '', + 'settings': '', + 'volume': '', + 'cheat': '', + 'cache-manager': '' }, this.id = Math.floor(0x2710 * Math.random()); let _0x17edbf = null; this.elements.controls = null; @@ -5755,13 +6237,13 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'seektime': this.config.seekTime, 'speed': this.speed, 'quality': this.quality - }), _0x270a9e = !0x1); + }), _0x270a9e = false); let _0x1e6644, _0x3ec218 = function(_0x406126) { let _0x17edbf = _0x406126; return Object.entries(_0x2c1832).forEach(function(_0x3e992c) { - let _0x2c1832 = _0x5005e6(_0x3e992c, 0x2), - _0x47c2ec = _0x2c1832[0x0], - _0x547588 = _0x2c1832[0x1]; + let _0x2c1832 = _0x5005e6(_0x3e992c, 2), + _0x47c2ec = _0x2c1832[0], + _0x547588 = _0x2c1832[1]; _0x17edbf = _0x1a0e98(_0x17edbf, '{' .concat(_0x47c2ec, '}'), _0x547588); }), _0x17edbf; }; @@ -5774,7 +6256,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { return _0x350d73(_0x176a3e, _0x2c1832); }, 'set': function() { - let _0xa88a13 = arguments.length > 0x0 && void 0x0 !== arguments[0x0] && arguments[0x0]; + let _0xa88a13 = arguments.length > 0 && void 0 !== arguments[0] && arguments[0]; _0x3a8e2f(_0x176a3e, _0x2c1832, _0xa88a13); } }); @@ -5789,9 +6271,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x2593da = _0x7f9f36; function _0x28bdca(_0x5c50c3, _0x217698) { - for (let _0x2c1832 = 0x0; _0x2c1832 < _0x217698.length; _0x2c1832++) { + for (let _0x2c1832 = 0; _0x2c1832 < _0x217698.length; _0x2c1832++) { let _0x172cdb = _0x217698[_0x2c1832]; - _0x172cdb.enumerable = _0x172cdb.enumerable || !0x1, _0x172cdb.configurable = true, 'value' in _0x172cdb && (_0x172cdb.writable = true), Object.defineProperty(_0x5c50c3, _0x172cdb.key, _0x172cdb); + _0x172cdb.enumerable = _0x172cdb.enumerable || false, _0x172cdb.configurable = true, 'value' in _0x172cdb && (_0x172cdb.writable = true), Object.defineProperty(_0x5c50c3, _0x172cdb.key, _0x172cdb); } } @@ -5803,9 +6285,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } function _0x3c983f() { - let _0xa88a13 = arguments.length > 0x0 && void 0x0 !== arguments[0x0] && arguments[0x0]; + let _0xa88a13 = arguments.length > 0 && void 0 !== arguments[0] && arguments[0]; _0xa88a13 ? this.scrollPosition = { - 'x': window.scrollX || 0x0, + 'x': window.scrollX || 0, 'y': window.scrollY || 0x0 } : window.scrollTo(this.scrollPosition.x, this.scrollPosition.y), document.body.style.overflow = _0xa88a13 ? 'hidden' : '', _0x3a8e2f(this.target, this.player.config.classNames.fullscreen.fallback, _0xa88a13), _0x238270.call(this); } @@ -5815,7 +6297,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { ! function(_0x143a8a, _0x32a0a1) { if (!(_0x143a8a instanceof _0x32a0a1)) throw new TypeError('Cannot call a class as a function'); }(this, _0x1339df), this.player = _0x5f19c6, this.prefix = _0x1339df.prefix, this.property = _0x1339df.property, this.scrollPosition = { - 'x': 0x0, + 'x': 0, 'y': 0x0 }, _0x1093f4.call(this.player, document, 'ms' === this.prefix ? 'MSFullscreenChange' : '' .concat(this.prefix, 'fullscreenchange'), function() { _0x238270.call(_0x2c1832); @@ -5837,7 +6319,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (_0x1e2c68.function(document.exitFullscreen)) return ''; let _0x1339df = ''; return ['webkit', 'moz', 'ms'].some(function(_0xc1e0c3) { - return !(!_0x1e2c68.function(document['' .concat(_0xc1e0c3, 'ExitFullscreen')]) && !_0x1e2c68.function(document['' .concat(_0xc1e0c3, 'CancelFullScreen')]) || (_0x1339df = _0xc1e0c3, 0x0)); + return !(!_0x1e2c68.function(document['' .concat(_0xc1e0c3, 'ExitFullscreen')]) && !_0x1e2c68.function(document['' .concat(_0xc1e0c3, 'CancelFullScreen')]) || (_0x1339df = _0xc1e0c3, 0)); }), _0x1339df; } }, { @@ -5868,7 +6350,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { document['' .concat(this.prefix).concat(_0x17edbf).concat(this.property)](); } } else(document.cancelFullScreen || document.exitFullscreen).call(document); - else _0x3c983f.call(this, !0x1); + else _0x3c983f.call(this, false); } }, { 'key': 'toggle', @@ -5903,7 +6385,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x2c1832 = [], _0x2e7aa7 = true, _0x393a5f = false, - _0x3b4eca = void 0x0; + _0x3b4eca = undefined; try { for (let _0x1aca09, _0x1bb8de = _0x458e02[Symbol.iterator](); !(_0x2e7aa7 = (_0x1aca09 = _0x1bb8de.next()).done) && (_0x2c1832.push(_0x1aca09.value), !_0x5729e1 || _0x2c1832.length !== _0x5729e1); _0x2e7aa7 = true); } catch (_0x190997) { @@ -5940,17 +6422,17 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (clearTimeout(this.focusTimer), 'keydown' !== _0x20bf1f.type || 0x9 === _0x20bf1f.which) { 'keydown' === _0x20bf1f.type && (this.lastKeyDown = _0x20bf1f.timeStamp); let _0x27d4ad, _0x967a30 = _0x20bf1f.timeStamp - this.lastKeyDown <= 0x14; - ('focus' !== _0x20bf1f.type || _0x967a30) && (_0x27d4ad = _0x48d087.config.classNames.tabFocus, _0x3a8e2f(_0x23ffa1.call(_0x48d087, '.' .concat(_0x27d4ad)), _0x27d4ad, !0x1), this.focusTimer = setTimeout(function() { + ('focus' !== _0x20bf1f.type || _0x967a30) && (_0x27d4ad = _0x48d087.config.classNames.tabFocus, _0x3a8e2f(_0x23ffa1.call(_0x48d087, '.' .concat(_0x27d4ad)), _0x27d4ad, false), this.focusTimer = setTimeout(function() { let _0x20bf1f = document.activeElement; _0x2c1832.container.contains(_0x20bf1f) && _0x3a8e2f(document.activeElement, _0x48d087.config.classNames.tabFocus, true); }, 0xa)); } }, global: function() { - let _0x31e271 = !(arguments.length > 0x0 && void 0x0 !== arguments[0x0]) || arguments[0x0], + let _0x31e271 = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0], _0x17edbf = this.emulator, _0x2c1832 = _0x17edbf; - _0x1ef215.call(_0x2c1832, document.body, 'click', this.toggleMenu, _0x31e271), _0x455c85.call(_0x2c1832, document.body, 'touchstart', this.firstTouch), _0x1ef215.call(_0x2c1832, document.body, 'keydown focus blur', this.setTabFocus, _0x31e271, !0x1, true), _0x1093f4.call(_0x2c1832, document.body, 'keyup', function(_0x4e289a) { + _0x1ef215.call(_0x2c1832, document.body, 'click', this.toggleMenu, _0x31e271), _0x455c85.call(_0x2c1832, document.body, 'touchstart', this.firstTouch), _0x1ef215.call(_0x2c1832, document.body, 'keydown focus blur', this.setTabFocus, _0x31e271, false, true), _0x1093f4.call(_0x2c1832, document.body, 'keyup', function(_0x4e289a) { _0x2c1832.started && (0x71 === _0x4e289a.which && (_0x4e289a.shiftKey ? null === _0x2c1832.elements.buttons.saveState.getAttribute('hidden') && _0xbae705.call(_0x2c1832, _0x2c1832.elements.buttons.saveState, 'click') : _0xdcec2a.quickSaveState()), 0x73 === _0x4e289a.which && (_0x4e289a.shiftKey ? null === _0x2c1832.elements.buttons.loadState.getAttribute('hidden') && _0xbae705.call(_0x2c1832, _0x2c1832.elements.buttons.loadState, 'click') : _0xdcec2a.quickLoadState()), 0x78 === _0x4e289a.which && _0xbae705.call(_0x2c1832, _0x2c1832.elements.buttons.mute, 'click')); }); }, @@ -5961,10 +6443,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { setFullscreenInterval = null; _0x1093f4.call(_0x45d275, _0x2c1832.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen start-game', function(_0x1ac81c) { let _0x3953b5 = _0x2c1832.controls; - _0x3953b5 && 'enterfullscreen' === _0x1ac81c.type && (_0x3953b5.pressed = !0x1, _0x3953b5.hover = !0x1); - let _0x2c3de3 = 0x0; + _0x3953b5 && 'enterfullscreen' === _0x1ac81c.type && (_0x3953b5.pressed = false, _0x3953b5.hover = false); + let _0x2c3de3 = 0; if (['touchstart', 'touchmove', 'mousemove', 'start-game'].includes(_0x1ac81c.type)) { - if (_0x17edbf.system == 'nds' && _0x1ac81c.type == 'mousemove' && _0x27f4c4 && _0x27f4c4.Module && _0x27f4c4.Module.canvas && (document.pointerLockElement === _0x27f4c4.Module.canvas || document.mozPointerLockElement === _0x27f4c4.Module.canvas)) { + if (getSystem(_0x17edbf.system, true) === 'nds' && getSystem(_0x17edbf.system, _0x17edbf.coreVer) !== 'melonds' && _0x1ac81c.type == 'mousemove' && _0x27f4c4 && _0x27f4c4.Module && _0x27f4c4.Module.canvas && (document.pointerLockElement === _0x27f4c4.Module.canvas || document.mozPointerLockElement === _0x27f4c4.Module.canvas)) { _0x5ab74d.toggleControls.call(_0x45d275, false); return; } @@ -5973,23 +6455,23 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x2c3de3 = _0x45d275.touch ? 0xbb8 : 0x7d0; clearTimeout(_0x31e271); _0x31e271 = setTimeout(function() { - return _0x5ab74d.toggleControls.call(_0x45d275, !0x1); + return _0x5ab74d.toggleControls.call(_0x45d275, false); }, _0x2c3de3); _0x2c1832.controls.setAttribute('data-timer', _0x31e271); } }; }), _0x1093f4.call(_0x45d275, window, 'resize', function(_0x3e2cc5) { let _0x17edbf = _0x45d275.elements.container.clientHeight, - _0x2c1832 = _0x23ffa1.call(_0x45d275, '.' .concat(_0x449eac({ + _0x2c1832 = _0x23ffa1.call(_0x45d275, '.' .concat(getClass({ 'ejs__menu__container': true }), ' [role="menu"]')); Array.from(_0x2c1832).forEach(function(_0x43a16d) { _0x43a16d.style.maxHeight = '' .concat(_0x17edbf - 0x5f, 'px'), _0x43a16d.style.overflow = 'auto'; - }), _0x27f4c4.Module && _0x27f4c4.Module.canvas, _0x45d275.elements.container.clientWidth / _0x45d275.elements.container.clientHeight < 1.3 ? _0x3a8e2f(_0x45d275.elements.container, _0x449eac({ + }), _0x27f4c4.Module && _0x27f4c4.Module.canvas, _0x45d275.elements.container.clientWidth / _0x45d275.elements.container.clientHeight < 1.3 ? _0x3a8e2f(_0x45d275.elements.container, getClass({ 'portrait': true - }), true) : _0x3a8e2f(_0x45d275.elements.container, _0x449eac({ + }), true) : _0x3a8e2f(_0x45d275.elements.container, getClass({ 'portrait': true - }), !0x1); + }), false); }), _0xbae705.call(_0x45d275, window, 'resize'), _0x1093f4.call(_0x45d275, _0x45d275.elements.container, 'enterfullscreen', function(_0x586586) { if (_0x27f4c4.isMobileDevice && window.screen && screen.orientation && typeof screen.orientation.lock == 'function') { try { @@ -6033,19 +6515,19 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, 0x12c); }), _0x1093f4.call(_0x45d275, _0x45d275.elements.container, 'start-game', function(_0x5b0a00) { let _0x17edbf = window.document.createEvent('UIEvents'); - _0x17edbf.initUIEvent('resize', true, !0x1, window, 0x0), window.dispatchEvent(_0x17edbf), _0x3a8e2f(_0x45d275.elements.container, _0x449eac({ + _0x17edbf.initUIEvent('resize', true, false, window, 0), window.dispatchEvent(_0x17edbf), _0x3a8e2f(_0x45d275.elements.container, getClass({ 'game-started': true }), true); }), _0x1093f4.call(_0x45d275, _0x45d275.elements.container, 'blur', function(_0x893c7a) { let _0x17edbf = _0x893c7a.currentTarget; setTimeout(function() { _0x17edbf.contains(document.activeElement) || _0xbae705.call(_0x45d275, _0x45d275.elements, 'blurgame'); - }, 0x0); + }, 0); }), _0x1093f4.call(_0x45d275, _0x45d275.elements.container, 'focus', function(_0xe0dee3) { let _0x17edbf = _0xe0dee3.currentTarget; setTimeout(function() { _0x17edbf.contains(document.activeElement) && _0xbae705.call(_0x45d275, _0x45d275.elements, 'focusgame'); - }, 0x0); + }, 0); }); }, media: function() { @@ -6057,10 +6539,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }), _0x1093f4.call(_0x2c1832, _0x17edbf.container, 'contextmenu', function(_0x5c22bc) { _0x2c1832.touch || _0x2c1832.lightgun || _0x2593da.toggleContextMenu.call(_0x2c1832, _0x5c22bc, true); _0x5c22bc.preventDefault(); - }, !0x1), _0x1093f4.call(_0x2c1832, _0x17edbf.container, 'mousewheel', function(_0x49c974) { + }, false), _0x1093f4.call(_0x2c1832, _0x17edbf.container, 'mousewheel', function(_0x49c974) { _0x49c974.stopPropagation(); - }, !0x1), _0x1093f4.call(_0x2c1832, _0x17edbf.container, 'mousedown', function(_0x53ee35) { - if (_0x31e271.system == 'nds' && _0x27f4c4 && _0x27f4c4.Module && _0x27f4c4.Module.canvas && ! _0x27f4c4.isMobileDevice && !(document.pointerLockElement === _0x27f4c4.Module.canvas || document.mozPointerLockElement === _0x27f4c4.Module.canvas) && _0x31e271.started && !_0x31e271.connected) { + }, false), _0x1093f4.call(_0x2c1832, _0x17edbf.container, 'mousedown', function(_0x53ee35) { + if (getSystem(_0x31e271.system, true) === 'nds' && getSystem(_0x31e271.system, _0x31e271.coreVer) !== 'melonds' && _0x27f4c4 && _0x27f4c4.Module && _0x27f4c4.Module.canvas && ! _0x27f4c4.isMobileDevice && !(document.pointerLockElement === _0x27f4c4.Module.canvas || document.mozPointerLockElement === _0x27f4c4.Module.canvas) && _0x31e271.started && !_0x31e271.connected) { setTimeout(function() { if (_0x31e271.onButtonDiv !== true) { _0x27f4c4.Module.canvas.requestPointerLock = _0x27f4c4.Module.canvas.requestPointerLock || _0x27f4c4.Module.canvas.mozRequestPointerLock; @@ -6069,8 +6551,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x31e271.onButtonDiv = false }, 100) } - _0x2c1832.touch || _0x2593da.toggleContextMenu.call(_0x2c1832, _0x53ee35, !0x1); - }, !0x1), _0x1093f4.call(_0x2c1832, _0x2c1832.game, 'volumechange', function() { + _0x2c1832.touch || _0x2593da.toggleContextMenu.call(_0x2c1832, _0x53ee35, false); + }, false), _0x1093f4.call(_0x2c1832, _0x2c1832.game, 'volumechange', function() { _0x2c1832.storage.set({ 'volume': _0x2c1832.volume, 'muted': _0x2c1832.muted @@ -6079,7 +6561,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x38e17f = _0x2c1832.config.events.concat(['keyup', 'keydown']).join(' '); _0x1093f4.call(_0x2c1832, _0x2c1832.game, _0x38e17f, function(_0x38e438) { let _0x2b4804 = _0x38e438.detail, - _0x1bfeb2 = void 0x0 === _0x2b4804 ? {} : _0x2b4804; + _0x1bfeb2 = void 0 === _0x2b4804 ? {} : _0x2b4804; 'error' === _0x38e438.type && (_0x1bfeb2 = _0x2c1832.game.error), _0xbae705.call(_0x2c1832, _0x17edbf.container, _0x38e438.type, true, _0x1bfeb2); }); }, @@ -6091,7 +6573,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, bind: function(_0x4a8d46, _0x8f91ad, _0x2affda, _0x41dfb1) { let _0x1363b1 = this, - _0x53b9a1 = !(arguments.length > 0x4 && void 0x0 !== arguments[0x4]) || arguments[0x4], + _0x53b9a1 = !(arguments.length > 4 && void 0 !== arguments[4]) || arguments[4], _0x5209a5 = this.emulator, _0x27b738 = _0x5209a5, _0x5d89ff = _0x27b738.config.listeners[_0x41dfb1], @@ -6110,9 +6592,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, 'mute'), this.bind(_0x2c1832.buttons.fullscreen, 'click', function() { _0x17edbf.fullscreen.toggle(); }, 'fullscreen'), this.bind(_0x2c1832.buttons.gamepad, 'click', function() { - _0x5ab74d.toggleControls.call(_0x17edbf, !0x1), _0x132da7(_0x2c1832.dialogs.gamepad, !0x1); + _0x5ab74d.toggleControls.call(_0x17edbf, false), _0x132da7(_0x2c1832.dialogs.gamepad, false); }, 'mute'), this.bind(_0x2c1832.buttons.saveState, 'click', function() { - saveSaveFiles(); (async function() { _0xbae705.call(_0x17edbf, _0x17edbf.elements.container, 'savestate-start', false, {}); let _0x31e271 = await _0xdcec2a.saveState(), @@ -6145,14 +6626,15 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } _0x17edbf.elements.container.focus(); })(); + saveSaveFiles(); }, 'mute'), this.bind(_0x2c1832.buttons.loadState, 'click', function() { - _0xbae705.call(_0x17edbf, _0x17edbf.elements.container, 'loadstate', !0x1, {}); + _0xbae705.call(_0x17edbf, _0x17edbf.elements.container, 'loadstate', false, {}); }, 'mute'), this.bind(_0x2c1832.buttons.settings, 'click', function(_0x1396ee) { _0x1396ee.stopPropagation(), _0x2593da.toggleMenu.call(_0x17edbf, _0x1396ee); }), this.bind(_0x2c1832.buttons.settings, 'keyup', function(_0x454936) { let _0x2c1832 = _0x454936.which; [0xd, 0x20].includes(_0x2c1832) && (0xd !== _0x2c1832 ? (_0x454936.preventDefault(), _0x454936.stopPropagation(), _0x2593da.toggleMenu.call(_0x17edbf, _0x454936)) : _0x2593da.focusFirstMenuItem.call(_0x17edbf, null, true)); - }, null, !0x1), this.bind(_0x2c1832.settings.menu, 'keydown', function(_0x40072c) { + }, null, false), this.bind(_0x2c1832.settings.menu, 'keydown', function(_0x40072c) { 0x1b === _0x40072c.which && _0x2593da.toggleMenu.call(_0x17edbf, _0x40072c); }), _0x59aa33.isIos) { let _0x4bd188 = _0x23ffa1.call(_0x17edbf, 'input[type="range"]'); @@ -6177,7 +6659,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { clearTimeout(_0x17edbf); } else { let _0x29ba04 = setTimeout(function() { - _0x2c1832.controls.pressed = !0x1; + _0x2c1832.controls.pressed = false; }, 0xfa0); _0x2c1832.controls.setAttribute('data-timer2', _0x29ba04); } @@ -6188,25 +6670,25 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x11de96 = _0x2ab6f3.controls.getAttribute('data-timer'); if (_0x3a8e2f(_0x2ab6f3.controls, _0x466a37.classNames.noTransition, _0x5f0669), _0x5ab74d.toggleControls.call(_0x17edbf, _0x5f0669), _0x5f0669) { setTimeout(function() { - _0x3a8e2f(_0x2ab6f3.controls, _0x466a37.classNames.noTransition, !0x1); - }, 0x0); + _0x3a8e2f(_0x2ab6f3.controls, _0x466a37.classNames.noTransition, false); + }, 0); let _0x314d11 = _0x31e271.touch ? 0xbb8 : 0xfa0; clearTimeout(_0x11de96), _0x11de96 = setTimeout(function() { - return _0x5ab74d.toggleControls.call(_0x17edbf, !0x1); + return _0x5ab74d.toggleControls.call(_0x17edbf, false); }, _0x314d11), _0x2ab6f3.controls.setAttribute('data-timer', _0x11de96); } }), this.bind(_0x2c1832.inputs.volume, 'wheel', function(_0x28b2d2) { let _0x2c1832 = _0x28b2d2.webkitDirectionInvertedFromDevice, _0x12883c = _0x42b437([_0x28b2d2.deltaX, -_0x28b2d2.deltaY].map(function(_0x1ce956) { return _0x2c1832 ? -_0x1ce956 : _0x1ce956; - }), 0x2), - _0x247794 = _0x12883c[0x0], - _0x5dcee2 = _0x12883c[0x1], + }), 2), + _0x247794 = _0x12883c[0], + _0x5dcee2 = _0x12883c[1], _0x5691ae = Math.sign(Math.abs(_0x247794) > Math.abs(_0x5dcee2) ? _0x247794 : _0x5dcee2); _0x17edbf.increaseVolume(_0x5691ae / 0x32); let _0x47df17 = _0x17edbf.game.volume; - (0x1 === _0x5691ae && _0x47df17 < 0x1 || -0x1 === _0x5691ae && _0x47df17 > 0x0) && _0x28b2d2.preventDefault(); - }, 'volume', !0x1), this.bind(_0x2c1832.controls, 'contextmenu', function(_0x1db0c5) { + (0x1 === _0x5691ae && _0x47df17 < 1 || -0x1 === _0x5691ae && _0x47df17 > 0) && _0x28b2d2.preventDefault(); + }, 'volume', false), this.bind(_0x2c1832.controls, 'contextmenu', function(_0x1db0c5) { _0x1db0c5.stopPropagation(); }), this.bind(_0x2c1832.contextMenu, 'contextmenu', function(_0x37851d) { _0x37851d.stopPropagation(); @@ -6218,7 +6700,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }(); function _0x1a3a6c(_0x5a5a15, _0x4e2d69) { - for (let _0x2c1832 = 0x0; _0x2c1832 < _0x4e2d69.length; _0x2c1832++) { + for (let _0x2c1832 = 0; _0x2c1832 < _0x4e2d69.length; _0x2c1832++) { let _0x2e1c57 = _0x4e2d69[_0x2c1832]; _0x2e1c57.enumerable = _0x2e1c57.enumerable || false, _0x2e1c57.configurable = true, 'value' in _0x2e1c57 && (_0x2e1c57.writable = true), Object.defineProperty(_0x5a5a15, _0x2e1c57.key, _0x2e1c57); } @@ -6243,7 +6725,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (split2[w] == '' || split2[w] == '.') { } else if (split2[w] == '..') { if (split1.length > 0) { - let split1 = function(origpath) { + split1 = function(origpath) { if (origpath === '/') { return '/' } else { @@ -6269,7 +6751,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } return path } - this.version = '2.3.9'; + this.localization = e => {return e}; + this.version = '3.0.5'; this.system = ''; this.adUrl = null; this.gameName = null; @@ -6304,19 +6787,15 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { this.multitap = this.config.multitap; this.cheats = this.config.cheats; this.cheats || (this.cheats = []); - /* - let u = function(a, b) { - if (typeof b === 'string') { - return b; - } else if (a === true) { - return 'https://ws.emulatorjs.com/' + let server = function(newServer) { + if (typeof newServer === 'string') { + return newServer; } else { - return 'https://emuserver.emulatorjs.ga/'; + return null; } - }(this.config.oldNetplayServer, this.config.netplayUrl); - this.listUrl = u; - this.socketUrl = u; - */ + }(this.config.netplayUrl); + this.listUrl = server; + this.socketUrl = server; this.mameCore = this.config.mameCore || null; this.color = this.config.color; this.startOnLoad = this.config.startOnLoad || false; @@ -6361,6 +6840,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let text = await res.text(); let localJson = JSON.parse(text); _0x39ca5e.i18n = localJson.i18n; + _0x7f9f36.normalOptions = localJson.normalOptions; } catch(e) { console.warn('error setting localization', e); } @@ -6380,17 +6860,17 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { let _0x28cce1 = _0x5938bc; if (_0x1e2c68.object(_0x28cce1.config.classNames[_0x1d6b41])) Object.keys(_0x28cce1.config.classNames[_0x1d6b41]).forEach(function(_0x42f7f2) { let _0x2ba0e6 = {}; - _0x2ba0e6[_0x5938bc.config.classNames[_0x1d6b41][_0x42f7f2]] = true, _0x5938bc.config.classNames[_0x1d6b41][_0x42f7f2] = _0x449eac(_0x2ba0e6); + _0x2ba0e6[_0x5938bc.config.classNames[_0x1d6b41][_0x42f7f2]] = true, _0x5938bc.config.classNames[_0x1d6b41][_0x42f7f2] = getClass(_0x2ba0e6); }); else { let _0x2ba0e6 = {}; - _0x2ba0e6[_0x5938bc.config.classNames[_0x1d6b41]] = true, _0x5938bc.config.classNames[_0x1d6b41] = _0x449eac(_0x2ba0e6); + _0x2ba0e6[_0x5938bc.config.classNames[_0x1d6b41]] = true, _0x5938bc.config.classNames[_0x1d6b41] = getClass(_0x2ba0e6); } }); - this.config.selectors.controls.wrapper = '.' .concat(_0x449eac({ + this.config.selectors.controls.wrapper = '.' .concat(getClass({ 'ejs__controls': true })); - this.config.selectors.container = '.' .concat(_0x449eac({ + this.config.selectors.container = '.' .concat(getClass({ 'ejs': true })); this.system = this.config.system; @@ -6422,13 +6902,13 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { this.game.emulator = this; _0x1e2c68.element(this.elements.container) || (this.elements.container = _0x428003('div'), _0x580edd(this.game, this.elements.container)); let _0x5e63f0 = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__widgets': true }) }); this.elements.container.appendChild(_0x5e63f0); let _0x32c8af = _0x428003('div', { - 'class': _0x449eac({ + 'class': getClass({ 'ejs__dialogs': true }) }); @@ -6440,6 +6920,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { this.listeners.global(); this.fullscreen = new _0x335854(this); _0x27f4c4.create.call(this); + let webRTC = document.createElement('script'); + webRTC.src = (this.customPaths && typeof this.customPaths['webrtc-adapter.js'] === 'string') ? this.customPaths['webrtc-adapter.js'] : (this.dataPath + 'webrtc-adapter.js'); + document.body.appendChild(webRTC); resolve(this); }.bind(this)) } @@ -6447,7 +6930,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x17edbf = _0x6954aa, _0x423c42 = [{ 'key': 'setup', 'value': function(_0x3bb461) { - let _0x2c1832 = arguments.length > 0x1 && void 0x0 !== arguments[0x1] ? arguments[0x1] : {}, + let _0x2c1832 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, _0x3eda14 = null; return _0x1e2c68.string(_0x3bb461) ? _0x3eda14 = Array.from(document.querySelectorAll(_0x3bb461)) : _0x1e2c68.nodeList(_0x3bb461) ? _0x3eda14 = Array.from(_0x3bb461) : _0x1e2c68.array(_0x3bb461) && (_0x3eda14 = _0x3bb461.filter(_0x1e2c68.element)), _0x1e2c68.empty(_0x3eda14) ? null : _0x3eda14.map(function(_0x176f95) { return new _0x6954aa(_0x176f95, _0x2c1832); @@ -6456,13 +6939,13 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }], (_0x2c1832 = [{ 'key': 'restart', 'value': function() { - this.currentTime = 0x0; + this.currentTime = 0; } }, { 'key': 'increaseVolume', 'value': function(_0x2881c7) { - let _0x17edbf = this.game.muted ? 0x0 : this.volume; - this.volume = _0x17edbf + (_0x1e2c68.number(_0x2881c7) ? _0x2881c7 : 0x0); + let _0x17edbf = this.game.muted ? 0 : this.volume; + this.volume = _0x17edbf + (_0x1e2c68.number(_0x2881c7) ? _0x2881c7 : 0); } }, { 'key': 'decreaseVolume', @@ -6473,11 +6956,11 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'key': 'toggleControls', 'value': function(_0x1c82b4) { if (this.started) { - let _0x17edbf = void 0x0 === _0x1c82b4 ? void 0x0 : !_0x1c82b4, + let _0x17edbf = void 0 === _0x1c82b4 ? void 0 : !_0x1c82b4, _0x2c1832 = _0x3a8e2f(this.elements.container, this.config.classNames.hideControls, _0x17edbf); - return _0x2c1832 && _0x2593da.toggleMenu.call(this, !0x1), !_0x2c1832; + return _0x2c1832 && _0x2593da.toggleMenu.call(this, false), !_0x2c1832; } - return !0x1; + return false; } }, { 'key': 'getStartName', @@ -6495,14 +6978,14 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } else if (_0x1e2c68.string(this.config.gameUrl) && force === true) { rv = this.config.gameUrl.split('/').pop().split('?')[0].replace(invalidCharacters, ''); } else if (force === true) { - return 'rom'; + rv = 'rom'; } return rv; } }, { 'key': 'loadState', 'value': function(_0x3c6414) { - _0xdcec2a.loadState(_0x3c6414, 0x0); + _0xdcec2a.loadState(_0x3c6414, 0); } }, { 'key': 'on', @@ -6522,7 +7005,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { }, { 'key': 'playing', 'set': function() { - let _0x6954aa = !(arguments.length > 0x0 && void 0x0 !== arguments[0x0]) || arguments[0x0]; + let _0x6954aa = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; Array.from(this.elements.buttons.play || []).forEach(function(_0x4a27d3) { _0x4a27d3.pressed = _0x6954aa; }), this.paused = !_0x6954aa; @@ -6534,7 +7017,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'key': 'volume', 'set': function(_0x52441c) { let _0x17edbf = _0x52441c; - _0x1e2c68.string(_0x17edbf) && (_0x17edbf = Number(_0x17edbf)), _0x1e2c68.number(_0x17edbf) || (_0x17edbf = this.storage.get('volume')), _0x1e2c68.number(_0x17edbf) || (_0x17edbf = this.config.volume), _0x17edbf > 0x1 && (_0x17edbf = 0x1), _0x17edbf < 0x0 && (_0x17edbf = 0x0), this.config.volume = _0x17edbf, this.game.volume = _0x17edbf, !_0x1e2c68.empty(_0x52441c) && this.muted && _0x17edbf > 0x0 && (this.muted = !0x1); + _0x1e2c68.string(_0x17edbf) && (_0x17edbf = Number(_0x17edbf)), _0x1e2c68.number(_0x17edbf) || (_0x17edbf = this.storage.get('volume')), _0x1e2c68.number(_0x17edbf) || (_0x17edbf = this.config.volume), _0x17edbf > 1 && (_0x17edbf = 1), _0x17edbf < 0 && (_0x17edbf = 0), this.config.volume = _0x17edbf, this.game.volume = _0x17edbf, !_0x1e2c68.empty(_0x52441c) && this.muted && _0x17edbf > 0 && (this.muted = false); }, 'get': function() { return Number(this.game.volume); diff --git a/data/emulator.js b/data/emulator.js index 74f2ce1..feaad57 100644 --- a/data/emulator.js +++ b/data/emulator.js @@ -72,7 +72,7 @@ var EJS = function(_0x574f5e) { return Object.prototype.hasOwnProperty.call(_0x1ed01a, _0x4abf0b); }; _0x1d686b.p = ''; - _0x1d686b.s = 161; + _0x1d686b.s = 162; return _0x1d686b(_0x1d686b.s); }([function(module) { module.exports = function(error, element, _this) { @@ -84,110 +84,114 @@ var EJS = function(_0x574f5e) { } } }, null, null, null, null, null, function(module) { - //I wrote this myself -- theres bound to be bugs - function Gamepad() { - var gp = navigator.getGamepads || navigator.webkitGetGamepads; - if (!gp) { - throw new Error("get gamepads not found!"); - } - this.rAF = window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.requestAnimationFrame; - if (!this.rAF) { - throw new Error("request animation frame was not found!"); - } - this.loop(); - } - Gamepad.prototype = { - gamepads: [], - rAF: null, - getGamepads: function() { - return navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []); - }, - loop: async function() { - this.updateGamepadState(); - this.rAF.call(null, this.loop.bind(this)); - }, - updateGamepadState: function() { - var gamepads = this.getGamepads(); - for (var i=0; i { + if (!gamepad) return; + let hasGamepad = false; + this.gamepads.forEach((oldGamepad, oldIndex) => { + if (oldGamepad.index !== gamepad.index) return; + hasGamepad = true; + + oldGamepad.axes.forEach((axis, axisIndex) => { + if (gamepad.axes[axisIndex] !== axis) { + const axis = function(index) { + switch (index) { + case 0: + return 'LEFT_STICK_X'; + case 1: + return 'LEFT_STICK_Y'; + case 2: + return 'RIGHT_STICK_X'; + case 3: + return 'RIGHT_STICK_Y'; + default: + return null; + } + }(axisIndex); + if (!axis) return; + this.dispatchEvent('axischanged', {axis: axis, value: gamepad.axes[axisIndex], index: gamepad.index, gamepadIndex: gamepad.index}); + } + + }) + gamepad.buttons.forEach((button, buttonIndex) => { + let pressed = oldGamepad.buttons[buttonIndex] === 1.0; + if (typeof oldGamepad.buttons[buttonIndex] === "object") { + pressed = oldGamepad.buttons[buttonIndex].pressed; + } + let pressed2 = button === 1.0; + if (typeof button === "object") { + pressed2 = button.pressed; + } + if (pressed !== pressed2) { + if (pressed2) { + this.dispatchEvent('buttondown', {index: buttonIndex, gamepadIndex: gamepad.index}); + } else { + this.dispatchEvent('buttonup', {index: buttonIndex, gamepadIndex: gamepad.index}); + } + } + + }) + this.gamepads[oldIndex] = gamepads[index]; + }) + if (!hasGamepad) { + this.gamepads.push(gamepads[index]); + this.dispatchEvent('connected', {gamepadIndex: gamepad.index}); + } + }); + + for (let j=0; j 0x1) + for (var _0x1c0f88 = 0x1; _0x1c0f88 < arguments.length; _0x1c0f88++) _0x181c20[_0x1c0f88 - 0x1] = arguments[_0x1c0f88]; + _0x501f0f.push(new _0x5b9c05(_0x14ed62, _0x181c20)), 0x1 !== _0x501f0f.length || _0x3ba731 || _0x58e592(_0x30d6c8); + }, _0x5b9c05.prototype.run = function() { + this.fun.apply(null, this.array); + }, _0x40240d.title = 'browser', _0x40240d.browser = true, _0x40240d.env = {}, _0x40240d.argv = [], _0x40240d.version = '', _0x40240d.versions = {}, _0x40240d.on = _0x11873d, _0x40240d.addListener = _0x11873d, _0x40240d.once = _0x11873d, _0x40240d.off = _0x11873d, _0x40240d.removeListener = _0x11873d, _0x40240d.removeAllListeners = _0x11873d, _0x40240d.emit = _0x11873d, _0x40240d.prependListener = _0x11873d, _0x40240d.prependOnceListener = _0x11873d, _0x40240d.listeners = function(_0x4a7ed5) { + return []; + }, _0x40240d.binding = function(_0x4fe55f) { + throw new Error('process.binding is not supported'); + }, _0x40240d.cwd = function() { + return '/'; + }, _0x40240d.chdir = function(_0x33049c) { + throw new Error('process.chdir is not supported'); + }, _0x40240d.umask = function() { + return 0x0; + }; +}, null, null, null, null, null, null, null, function(_0x2e240f, _0x5b82af, _0x39b24a) { var _0xafdfe, _0x133983; ! function(_0xcb4965, _0x3924c5, _0x2b6d6d) { 'use strict'; @@ -677,7 +783,15 @@ var EJS = function(_0x574f5e) { return _0x2b9783.prototype = _0x28a590, _0x2b9783.version = _0x28a590.version, _0x2b9783; }) ? _0xafdfe.call(_0x5b82af, _0x39b24a, _0x5b82af, _0x2e240f) : _0xafdfe) || (_0x2e240f.exports = _0x133983); }(); -}, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, function(_0xc6a4b0, _0x7437ff, _0x459722) { +}, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, function(_0x5cc7da, _0xd81f9c, _0x5928dc) { + /*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ + !function(){return function t(r,e,n){function i(f,u){if(!e[f]){if(!r[f]){var s="function"==typeof require&&require;if(!u&&s)return s(f,!0);if(o)return o(f,!0);var h=new Error("Cannot find module '"+f+"'");throw h.code="MODULE_NOT_FOUND",h}var a=e[f]={exports:{}};r[f][0].call(a.exports,function(t){return i(r[f][1][t]||t)},a,a.exports,t,r,e,n)}return e[f].exports}for(var o="function"==typeof require&&require,f=0;f0?f-4:f;for(e=0;e>16&255,s[a++]=r>>8&255,s[a++]=255&r;2===u&&(r=i[t.charCodeAt(e)]<<2|i[t.charCodeAt(e+1)]>>4,s[a++]=255&r);1===u&&(r=i[t.charCodeAt(e)]<<10|i[t.charCodeAt(e+1)]<<4|i[t.charCodeAt(e+2)]>>2,s[a++]=r>>8&255,s[a++]=255&r);return s},e.fromByteArray=function(t){for(var r,e=t.length,i=e%3,o=[],f=0,u=e-i;fu?u:f+16383));1===i?(r=t[e-1],o.push(n[r>>2]+n[r<<4&63]+"==")):2===i&&(r=(t[e-2]<<8)+t[e-1],o.push(n[r>>10]+n[r>>4&63]+n[r<<2&63]+"="));return o.join("")};for(var n=[],i=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",u=0,s=f.length;u0)throw new Error("Invalid string. Length must be a multiple of 4");var e=t.indexOf("=");return-1===e&&(e=r),[e,e===r?0:4-e%4]}function a(t,r,e){for(var i,o,f=[],u=r;u>18&63]+n[o>>12&63]+n[o>>6&63]+n[63&o]);return f.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},{}],3:[function(t,r,e){(function(r){(function(){"use strict";var r=t("base64-js"),n=t("ieee754");e.Buffer=f,e.SlowBuffer=function(t){+t!=t&&(t=0);return f.alloc(+t)},e.INSPECT_MAX_BYTES=50;var i=2147483647;function o(t){if(t>i)throw new RangeError('The value "'+t+'" is invalid for option "size"');var r=new Uint8Array(t);return r.__proto__=f.prototype,r}function f(t,r,e){if("number"==typeof t){if("string"==typeof r)throw new TypeError('The "string" argument must be of type string. Received type number');return h(t)}return u(t,r,e)}function u(t,r,e){if("string"==typeof t)return function(t,r){"string"==typeof r&&""!==r||(r="utf8");if(!f.isEncoding(r))throw new TypeError("Unknown encoding: "+r);var e=0|p(t,r),n=o(e),i=n.write(t,r);i!==e&&(n=n.slice(0,i));return n}(t,r);if(ArrayBuffer.isView(t))return a(t);if(null==t)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(z(t,ArrayBuffer)||t&&z(t.buffer,ArrayBuffer))return function(t,r,e){if(r<0||t.byteLength=i)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i.toString(16)+" bytes");return 0|t}function p(t,r){if(f.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||z(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);var e=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===e)return 0;for(var i=!1;;)switch(r){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":return N(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*e;case"hex":return e>>>1;case"base64":return P(t).length;default:if(i)return n?-1:N(t).length;r=(""+r).toLowerCase(),i=!0}}function l(t,r,e){var n=t[r];t[r]=t[e],t[e]=n}function y(t,r,e,n,i){if(0===t.length)return-1;if("string"==typeof e?(n=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),D(e=+e)&&(e=i?0:t.length-1),e<0&&(e=t.length+e),e>=t.length){if(i)return-1;e=t.length-1}else if(e<0){if(!i)return-1;e=0}if("string"==typeof r&&(r=f.from(r,n)),f.isBuffer(r))return 0===r.length?-1:g(t,r,e,n,i);if("number"==typeof r)return r&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,r,e):Uint8Array.prototype.lastIndexOf.call(t,r,e):g(t,[r],e,n,i);throw new TypeError("val must be string, number or Buffer")}function g(t,r,e,n,i){var o,f=1,u=t.length,s=r.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||r.length<2)return-1;f=2,u/=2,s/=2,e/=2}function h(t,r){return 1===f?t[r]:t.readUInt16BE(r*f)}if(i){var a=-1;for(o=e;ou&&(e=u-s),o=e;o>=0;o--){for(var c=!0,p=0;pi&&(n=i):n=i;var o=r.length;n>o/2&&(n=o/2);for(var f=0;f>8,i=e%256,o.push(i),o.push(n);return o}(r,t.length-e),t,e,n)}function A(t,e,n){return 0===e&&n===t.length?r.fromByteArray(t):r.fromByteArray(t.slice(e,n))}function B(t,r,e){e=Math.min(t.length,e);for(var n=[],i=r;i239?4:h>223?3:h>191?2:1;if(i+c<=e)switch(c){case 1:h<128&&(a=h);break;case 2:128==(192&(o=t[i+1]))&&(s=(31&h)<<6|63&o)>127&&(a=s);break;case 3:o=t[i+1],f=t[i+2],128==(192&o)&&128==(192&f)&&(s=(15&h)<<12|(63&o)<<6|63&f)>2047&&(s<55296||s>57343)&&(a=s);break;case 4:o=t[i+1],f=t[i+2],u=t[i+3],128==(192&o)&&128==(192&f)&&128==(192&u)&&(s=(15&h)<<18|(63&o)<<12|(63&f)<<6|63&u)>65535&&s<1114112&&(a=s)}null===a?(a=65533,c=1):a>65535&&(a-=65536,n.push(a>>>10&1023|55296),a=56320|1023&a),n.push(a),i+=c}return function(t){var r=t.length;if(r<=U)return String.fromCharCode.apply(String,t);var e="",n=0;for(;nthis.length)return"";if((void 0===e||e>this.length)&&(e=this.length),e<=0)return"";if((e>>>=0)<=(r>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return I(this,r,e);case"utf8":case"utf-8":return B(this,r,e);case"ascii":return _(this,r,e);case"latin1":case"binary":return T(this,r,e);case"base64":return A(this,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,r,e);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}.apply(this,arguments)},f.prototype.toLocaleString=f.prototype.toString,f.prototype.equals=function(t){if(!f.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===f.compare(this,t)},f.prototype.inspect=function(){var t="",r=e.INSPECT_MAX_BYTES;return t=this.toString("hex",0,r).replace(/(.{2})/g,"$1 ").trim(),this.length>r&&(t+=" ... "),""},f.prototype.compare=function(t,r,e,n,i){if(z(t,Uint8Array)&&(t=f.from(t,t.offset,t.byteLength)),!f.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===r&&(r=0),void 0===e&&(e=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),r<0||e>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&r>=e)return 0;if(n>=i)return-1;if(r>=e)return 1;if(this===t)return 0;for(var o=(i>>>=0)-(n>>>=0),u=(e>>>=0)-(r>>>=0),s=Math.min(o,u),h=this.slice(n,i),a=t.slice(r,e),c=0;c>>=0,isFinite(e)?(e>>>=0,void 0===n&&(n="utf8")):(n=e,e=void 0)}var i=this.length-r;if((void 0===e||e>i)&&(e=i),t.length>0&&(e<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return w(this,t,r,e);case"utf8":case"utf-8":return d(this,t,r,e);case"ascii":return v(this,t,r,e);case"latin1":case"binary":return b(this,t,r,e);case"base64":return m(this,t,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,t,r,e);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},f.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var U=4096;function _(t,r,e){var n="";e=Math.min(t.length,e);for(var i=r;in)&&(e=n);for(var i="",o=r;oe)throw new RangeError("Trying to access beyond buffer length")}function L(t,r,e,n,i,o){if(!f.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(r>i||rt.length)throw new RangeError("Index out of range")}function R(t,r,e,n,i,o){if(e+n>t.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function x(t,r,e,i,o){return r=+r,e>>>=0,o||R(t,0,e,4),n.write(t,r,e,i,23,4),e+4}function M(t,r,e,i,o){return r=+r,e>>>=0,o||R(t,0,e,8),n.write(t,r,e,i,52,8),e+8}f.prototype.slice=function(t,r){var e=this.length;(t=~~t)<0?(t+=e)<0&&(t=0):t>e&&(t=e),(r=void 0===r?e:~~r)<0?(r+=e)<0&&(r=0):r>e&&(r=e),r>>=0,r>>>=0,e||C(t,r,this.length);for(var n=this[t],i=1,o=0;++o>>=0,r>>>=0,e||C(t,r,this.length);for(var n=this[t+--r],i=1;r>0&&(i*=256);)n+=this[t+--r]*i;return n},f.prototype.readUInt8=function(t,r){return t>>>=0,r||C(t,1,this.length),this[t]},f.prototype.readUInt16LE=function(t,r){return t>>>=0,r||C(t,2,this.length),this[t]|this[t+1]<<8},f.prototype.readUInt16BE=function(t,r){return t>>>=0,r||C(t,2,this.length),this[t]<<8|this[t+1]},f.prototype.readUInt32LE=function(t,r){return t>>>=0,r||C(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},f.prototype.readUInt32BE=function(t,r){return t>>>=0,r||C(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},f.prototype.readIntLE=function(t,r,e){t>>>=0,r>>>=0,e||C(t,r,this.length);for(var n=this[t],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*r)),n},f.prototype.readIntBE=function(t,r,e){t>>>=0,r>>>=0,e||C(t,r,this.length);for(var n=r,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*r)),o},f.prototype.readInt8=function(t,r){return t>>>=0,r||C(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},f.prototype.readInt16LE=function(t,r){t>>>=0,r||C(t,2,this.length);var e=this[t]|this[t+1]<<8;return 32768&e?4294901760|e:e},f.prototype.readInt16BE=function(t,r){t>>>=0,r||C(t,2,this.length);var e=this[t+1]|this[t]<<8;return 32768&e?4294901760|e:e},f.prototype.readInt32LE=function(t,r){return t>>>=0,r||C(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},f.prototype.readInt32BE=function(t,r){return t>>>=0,r||C(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},f.prototype.readFloatLE=function(t,r){return t>>>=0,r||C(t,4,this.length),n.read(this,t,!0,23,4)},f.prototype.readFloatBE=function(t,r){return t>>>=0,r||C(t,4,this.length),n.read(this,t,!1,23,4)},f.prototype.readDoubleLE=function(t,r){return t>>>=0,r||C(t,8,this.length),n.read(this,t,!0,52,8)},f.prototype.readDoubleBE=function(t,r){return t>>>=0,r||C(t,8,this.length),n.read(this,t,!1,52,8)},f.prototype.writeUIntLE=function(t,r,e,n){(t=+t,r>>>=0,e>>>=0,n)||L(this,t,r,e,Math.pow(2,8*e)-1,0);var i=1,o=0;for(this[r]=255&t;++o>>=0,e>>>=0,n)||L(this,t,r,e,Math.pow(2,8*e)-1,0);var i=e-1,o=1;for(this[r+i]=255&t;--i>=0&&(o*=256);)this[r+i]=t/o&255;return r+e},f.prototype.writeUInt8=function(t,r,e){return t=+t,r>>>=0,e||L(this,t,r,1,255,0),this[r]=255&t,r+1},f.prototype.writeUInt16LE=function(t,r,e){return t=+t,r>>>=0,e||L(this,t,r,2,65535,0),this[r]=255&t,this[r+1]=t>>>8,r+2},f.prototype.writeUInt16BE=function(t,r,e){return t=+t,r>>>=0,e||L(this,t,r,2,65535,0),this[r]=t>>>8,this[r+1]=255&t,r+2},f.prototype.writeUInt32LE=function(t,r,e){return t=+t,r>>>=0,e||L(this,t,r,4,4294967295,0),this[r+3]=t>>>24,this[r+2]=t>>>16,this[r+1]=t>>>8,this[r]=255&t,r+4},f.prototype.writeUInt32BE=function(t,r,e){return t=+t,r>>>=0,e||L(this,t,r,4,4294967295,0),this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t,r+4},f.prototype.writeIntLE=function(t,r,e,n){if(t=+t,r>>>=0,!n){var i=Math.pow(2,8*e-1);L(this,t,r,e,i-1,-i)}var o=0,f=1,u=0;for(this[r]=255&t;++o>0)-u&255;return r+e},f.prototype.writeIntBE=function(t,r,e,n){if(t=+t,r>>>=0,!n){var i=Math.pow(2,8*e-1);L(this,t,r,e,i-1,-i)}var o=e-1,f=1,u=0;for(this[r+o]=255&t;--o>=0&&(f*=256);)t<0&&0===u&&0!==this[r+o+1]&&(u=1),this[r+o]=(t/f>>0)-u&255;return r+e},f.prototype.writeInt8=function(t,r,e){return t=+t,r>>>=0,e||L(this,t,r,1,127,-128),t<0&&(t=255+t+1),this[r]=255&t,r+1},f.prototype.writeInt16LE=function(t,r,e){return t=+t,r>>>=0,e||L(this,t,r,2,32767,-32768),this[r]=255&t,this[r+1]=t>>>8,r+2},f.prototype.writeInt16BE=function(t,r,e){return t=+t,r>>>=0,e||L(this,t,r,2,32767,-32768),this[r]=t>>>8,this[r+1]=255&t,r+2},f.prototype.writeInt32LE=function(t,r,e){return t=+t,r>>>=0,e||L(this,t,r,4,2147483647,-2147483648),this[r]=255&t,this[r+1]=t>>>8,this[r+2]=t>>>16,this[r+3]=t>>>24,r+4},f.prototype.writeInt32BE=function(t,r,e){return t=+t,r>>>=0,e||L(this,t,r,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t,r+4},f.prototype.writeFloatLE=function(t,r,e){return x(this,t,r,!0,e)},f.prototype.writeFloatBE=function(t,r,e){return x(this,t,r,!1,e)},f.prototype.writeDoubleLE=function(t,r,e){return M(this,t,r,!0,e)},f.prototype.writeDoubleBE=function(t,r,e){return M(this,t,r,!1,e)},f.prototype.copy=function(t,r,e,n){if(!f.isBuffer(t))throw new TypeError("argument should be a Buffer");if(e||(e=0),n||0===n||(n=this.length),r>=t.length&&(r=t.length),r||(r=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-r=0;--o)t[o+r]=this[o+e];else Uint8Array.prototype.set.call(t,this.subarray(e,n),r);return i},f.prototype.fill=function(t,r,e,n){if("string"==typeof t){if("string"==typeof r?(n=r,r=0,e=this.length):"string"==typeof e&&(n=e,e=this.length),void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!f.isEncoding(n))throw new TypeError("Unknown encoding: "+n);if(1===t.length){var i=t.charCodeAt(0);("utf8"===n&&i<128||"latin1"===n)&&(t=i)}}else"number"==typeof t&&(t&=255);if(r<0||this.length>>=0,e=void 0===e?this.length:e>>>0,t||(t=0),"number"==typeof t)for(o=r;o55295&&e<57344){if(!i){if(e>56319){(r-=3)>-1&&o.push(239,191,189);continue}if(f+1===n){(r-=3)>-1&&o.push(239,191,189);continue}i=e;continue}if(e<56320){(r-=3)>-1&&o.push(239,191,189),i=e;continue}e=65536+(i-55296<<10|e-56320)}else i&&(r-=3)>-1&&o.push(239,191,189);if(i=null,e<128){if((r-=1)<0)break;o.push(e)}else if(e<2048){if((r-=2)<0)break;o.push(e>>6|192,63&e|128)}else if(e<65536){if((r-=3)<0)break;o.push(e>>12|224,e>>6&63|128,63&e|128)}else{if(!(e<1114112))throw new Error("Invalid code point");if((r-=4)<0)break;o.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}}return o}function P(t){return r.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(O,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function j(t,r,e,n){for(var i=0;i=r.length||i>=t.length);++i)r[i+e]=t[i];return i}function z(t,r){return t instanceof r||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===r.name}function D(t){return t!=t}}).call(this)}).call(this,t("buffer").Buffer)},{"base64-js":2,buffer:3,ieee754:4}],4:[function(t,r,e){e.read=function(t,r,e,n,i){var o,f,u=8*i-n-1,s=(1<>1,a=-7,c=e?i-1:0,p=e?-1:1,l=t[r+c];for(c+=p,o=l&(1<<-a)-1,l>>=-a,a+=u;a>0;o=256*o+t[r+c],c+=p,a-=8);for(f=o&(1<<-a)-1,o>>=-a,a+=n;a>0;f=256*f+t[r+c],c+=p,a-=8);if(0===o)o=1-h;else{if(o===s)return f?NaN:1/0*(l?-1:1);f+=Math.pow(2,n),o-=h}return(l?-1:1)*f*Math.pow(2,o-n)},e.write=function(t,r,e,n,i,o){var f,u,s,h=8*o-i-1,a=(1<>1,p=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?0:o-1,y=n?1:-1,g=r<0||0===r&&1/r<0?1:0;for(r=Math.abs(r),isNaN(r)||r===1/0?(u=isNaN(r)?1:0,f=a):(f=Math.floor(Math.log(r)/Math.LN2),r*(s=Math.pow(2,-f))<1&&(f--,s*=2),(r+=f+c>=1?p/s:p*Math.pow(2,1-c))*s>=2&&(f++,s/=2),f+c>=a?(u=0,f=a):f+c>=1?(u=(r*s-1)*Math.pow(2,i),f+=c):(u=r*Math.pow(2,c-1)*Math.pow(2,i),f=0));i>=8;t[e+l]=255&u,l+=y,u/=256,i-=8);for(f=f<0;t[e+l]=255&f,l+=y,f/=256,h-=8);t[e+l-y]|=128*g}},{}]},{},[1]); +}, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, function(_0xc6a4b0, _0x7437ff, _0x459722) { var _0x4bddd8; ! function() { 'use strict'; @@ -700,8 +814,8 @@ var EJS = function(_0x574f5e) { return _0x428a46; }.apply(_0x7437ff, [])) || (_0xc6a4b0.exports = _0x4bddd8); }(); -}, function(_0x4fe39b, _0x3af40d, _0x2af07b) { - _0x4fe39b.exports = { +}, function(module) { + module.exports = { 'ejs-wrapper': 'ejs--de6433374cb30211f10e148b320b2f', 'ejs': 'ejs--7a5f920ceffb2913f6dbda780573cf', 'ejs--full-ui': 'ejs--f3a002bba9836fe4ebfed357a45521', @@ -819,7 +933,18 @@ var EJS = function(_0x574f5e) { 'ejs--fullscreen-fallback': 'ejs--412041671de21945d3e028b6ae84c9', 'ejs--no-transition': 'ejs--33643265135cf89e6c0a0d9866d6f1', 'ejs__sr-only': 'ejs--6f0e996cd15e5fb6be0256918531d7', - 'ejs-fade-in': 'ejs--7cadf43f3d9eb17c7e3c36de84973b' + 'ejs-fade-in': 'ejs--7cadf43f3d9eb17c7e3c36de84973b', + 'dpad-container': 'ejs--914358605501b11476e86626b2ff16', + 'dpad-bg': 'ejs--be66239219d594001da38f91c9ad02', + 'dpad-front': 'ejs--9dbb9be3403878e912527181e2d41b', + 'dpad-1': 'ejs--f9c7797bdf05569bdc13b4f2074270', + 'dpad-2': 'ejs--2645f3bad105488a313c5e30dab74f', + 'dpad-1-bg': 'ejs--a57cf324c8ff108947112e35e589b5', + 'dpad-2-bg': 'ejs--4873d94c18140ab195da609b40b71a', + 'dpad-left': 'ejs--bd9311b0a4f654af6ab5ba28bcf358', + 'dpad-right': 'ejs--704d45ea060cc6809451a0d9d47ad7', + 'dpad-up': 'ejs--f0b89ca5b5621659af184c8e012ccb', + 'dpad-down': 'ejs--8de361d6b01eaa181f8db4ac3eb7af' }; }, function(_0xfb1bcc, _0x54234e, _0x2fab2f) { var _0x19304b, _0x101743, _0x30cf42; @@ -1376,4 +1501,2889 @@ var EJS = function(_0x574f5e) { 'factory': _0x5c2a4b }; }); -}, null, window.EJS_main]).default; +}, null, function(_0x14da87, _0x57407e, _0x2fa590) { + 'use strict'; + (function(_0x227bc8, _0x21b268, _0x521a09) { + function _0x4ffbab(_0x13a3d0) { + return (_0x4ffbab = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function(_0x5f01ef) { + return typeof _0x5f01ef; + } : function(_0x1020c7) { + return _0x1020c7 && 'function' == typeof Symbol && _0x1020c7.constructor === Symbol && _0x1020c7 !== Symbol.prototype ? 'symbol' : typeof _0x1020c7; + })(_0x13a3d0); + } + + function _0x375f8a() { + var _0x227bc8 = this, + _0x57407e = new _0x9828fc(); + _0x227bc8.chunks = {}, _0x227bc8.users = {}, _0x227bc8.readAsArrayBuffer = function(_0x58dfb2, _0x7626c2, _0x4af133) { + var _0x12911b = { + 'file': _0x58dfb2, + 'earlyCallback': function(_0x12782b) { + _0x7626c2(_0x7086f7(_0x12782b, { + 'currentPosition': -0x1 + })); + }, + 'extra': _0x4af133 || { + 'userid': 0x0 + } + }; + _0x58dfb2.extra && Object.keys(_0x58dfb2.extra).length && Object.keys(_0x58dfb2.extra).forEach(function(_0x558fd0) { + _0x12911b.extra[_0x558fd0] = _0x58dfb2.extra[_0x558fd0]; + }), _0x57407e.readAsArrayBuffer(_0x227bc8, _0x12911b); + }, _0x227bc8.getNextChunk = function(_0x37ae5a, _0x7972ae, _0x4c7a43) { + var _0x604a41; + void 0x0 !== _0x37ae5a.currentPosition && (_0x604a41 = _0x37ae5a.currentPosition, _0x37ae5a = _0x37ae5a.uuid); + var _0x476bde = _0x227bc8.chunks[_0x37ae5a]; + if (_0x476bde) { + void 0x0 !== _0x4c7a43 ? (_0x227bc8.users[_0x4c7a43 + ''] || (_0x227bc8.users[_0x4c7a43 + ''] = { + 'fileUUID': _0x37ae5a, + 'userid': _0x4c7a43, + 'currentPosition': -0x1 + }), void 0x0 !== _0x604a41 && (_0x227bc8.users[_0x4c7a43 + ''].currentPosition = _0x604a41), _0x227bc8.users[_0x4c7a43 + ''].currentPosition++, _0x604a41 = _0x227bc8.users[_0x4c7a43 + ''].currentPosition) : (void 0x0 !== _0x604a41 && (_0x227bc8.chunks[_0x37ae5a].currentPosition = _0x604a41), _0x227bc8.chunks[_0x37ae5a].currentPosition++, _0x604a41 = _0x227bc8.chunks[_0x37ae5a].currentPosition); + var _0x24854d = _0x476bde[_0x604a41]; + if (!_0x24854d) return delete _0x227bc8.chunks[_0x37ae5a], void _0x227bc8.convertToArrayBuffer({ + 'chunkMissing': true, + 'currentPosition': _0x604a41, + 'uuid': _0x37ae5a + }, _0x7972ae); + _0x24854d = _0x7086f7(_0x24854d), void 0x0 !== _0x4c7a43 && (_0x24854d.remoteUserId = _0x4c7a43 + ''), _0x24854d.start && _0x227bc8.onBegin(_0x24854d), _0x24854d.end && _0x227bc8.onEnd(_0x24854d), _0x227bc8.onProgress(_0x24854d), _0x227bc8.convertToArrayBuffer(_0x24854d, function(_0x28aba8) { + _0x24854d.currentPosition != _0x24854d.maxChunks ? _0x7972ae(_0x28aba8, !0x1) : _0x7972ae(_0x28aba8, true); + }); + } + }; + var _0x2fa590 = new _0x16cb0d(_0x227bc8); + + function _0x7086f7(_0x5ae569, _0x132129) { + if (null == _0x5ae569 || 'object' != _0x4ffbab(_0x5ae569)) return _0x5ae569; + if (_0x5ae569.constructor != Object && _0x5ae569.constructor != Array) return _0x5ae569; + if (_0x5ae569.constructor == Date || _0x5ae569.constructor == RegExp || _0x5ae569.constructor == Function || _0x5ae569.constructor == String || _0x5ae569.constructor == Number || _0x5ae569.constructor == Boolean) return new _0x5ae569[('constructor')](_0x5ae569); + for (var _0x2fa590 in _0x132129 = _0x132129 || new _0x5ae569[('constructor')](), _0x5ae569) _0x132129[_0x2fa590] = void 0x0 === _0x132129[_0x2fa590] ? _0x7086f7(_0x5ae569[_0x2fa590], null) : _0x132129[_0x2fa590]; + return _0x132129; + } + _0x227bc8.addChunk = function(_0x1d353d, _0x2f8a6d) { + _0x1d353d && _0x2fa590.receive(_0x1d353d, function(_0x3b5f53) { + _0x227bc8.convertToArrayBuffer({ + 'readyForNextChunk': true, + 'currentPosition': _0x3b5f53.currentPosition, + 'uuid': _0x3b5f53.uuid + }, _0x2f8a6d); + }); + }, _0x227bc8.chunkMissing = function(_0x335036) { + delete _0x2fa590.chunks[_0x335036.uuid], delete _0x2fa590.chunksWaiters[_0x335036.uuid]; + }, _0x227bc8.onBegin = function() {}, _0x227bc8.onEnd = function() {}, _0x227bc8.onProgress = function() {}, _0x227bc8.convertToObject = _0x312465.ConvertToObject, _0x227bc8.convertToArrayBuffer = _0x312465.ConvertToArrayBuffer, _0x227bc8.setMultipleUsers = function() {}; + } + + function _0x9828fc() { + this.readAsArrayBuffer = function(_0x4dd34e, _0x4dcd47) { + var _0x2fa590 = _0x4dcd47.earlyCallback; + delete _0x4dcd47.earlyCallback, + function(_0x10728e, _0x4af117) { + _0x4af117 = _0x4af117 || function(_0x1b86cb) { + postMessage(_0x1b86cb); + }; + var _0x2fa590 = _0x10728e.file; + _0x2fa590.uuid || (_0x2fa590.uuid = (0x64 * Math.random()).toString().replace(/\./g, '')); + var _0x21b268 = _0x10728e.chunkSize || 0x3a98; + _0x10728e.extra && _0x10728e.extra.chunkSize && (_0x21b268 = _0x10728e.extra.chunkSize); + var _0x521a09, _0x501fda = 0x0, + _0x58b232 = _0x21b268, + _0x41e8e7 = Math.floor(Math.min(0x5f5e100, _0x58b232) / _0x21b268) * _0x21b268, + _0x24144f = Math.ceil(_0x2fa590.size / _0x21b268); + _0x2fa590.maxChunks = _0x24144f; + var _0x3a1fa3 = 0x0, + _0x36783 = []; + _0x4af117({ + 'currentPosition': _0x3a1fa3, + 'uuid': _0x2fa590.uuid, + 'maxChunks': _0x24144f, + 'size': _0x2fa590.size, + 'name': _0x2fa590.name, + 'type': _0x2fa590.type, + 'lastModifiedDate': (_0x2fa590.lastModifiedDate || new Date()).toString(), + 'start': true + }); + var _0x14ba6c, _0x11a93b = new FileReader(); + _0x11a93b.onloadend = function(_0x5ab3c3) { + _0x5ab3c3.target.readyState == FileReader.DONE && function(_0x1a8ac9, _0x25d2e6, _0x3fea4f) { + _0x521a09 = Math.ceil(_0x25d2e6.byteLength / _0x21b268); + for (var _0x26fcc7 = 0x0; _0x26fcc7 < _0x521a09; _0x26fcc7++) { + var _0x198455 = _0x26fcc7 * _0x21b268; + _0x36783[_0x3a1fa3] = _0x25d2e6.slice(_0x198455, Math.min(_0x198455 + _0x21b268, _0x25d2e6.byteLength)), _0x4af117({ + 'uuid': _0x2fa590.uuid, + 'buffer': _0x36783[_0x3a1fa3], + 'currentPosition': _0x3a1fa3, + 'maxChunks': _0x24144f, + 'size': _0x2fa590.size, + 'name': _0x2fa590.name, + 'lastModifiedDate': (_0x2fa590.lastModifiedDate || new Date()).toString(), + 'type': _0x2fa590.type + }), _0x3a1fa3++; + } + _0x3a1fa3 == _0x24144f && true, _0x3fea4f(); + }(_0x2fa590.name, _0x5ab3c3.target.result, function() { + (++_0x501fda + 0x1) * _0x41e8e7 < _0x2fa590.size ? (_0x14ba6c = _0x2fa590.slice(_0x501fda * _0x41e8e7, (_0x501fda + 0x1) * _0x41e8e7), _0x11a93b.readAsArrayBuffer(_0x14ba6c)) : _0x501fda * _0x41e8e7 < _0x2fa590.size ? (_0x14ba6c = _0x2fa590.slice(_0x501fda * _0x41e8e7, _0x2fa590.size), _0x11a93b.readAsArrayBuffer(_0x14ba6c)) : (_0x2fa590.url = URL.createObjectURL(_0x2fa590), _0x4af117({ + 'currentPosition': _0x3a1fa3, + 'uuid': _0x2fa590.uuid, + 'maxChunks': _0x24144f, + 'size': _0x2fa590.size, + 'name': _0x2fa590.name, + 'lastModifiedDate': (_0x2fa590.lastModifiedDate || new Date()).toString(), + 'url': URL.createObjectURL(_0x2fa590), + 'type': _0x2fa590.type, + 'end': true + })); + }); + }, _0x3a1fa3 += 0x1, _0x14ba6c = _0x2fa590.slice(_0x501fda * _0x41e8e7, (_0x501fda + 0x1) * _0x41e8e7), _0x11a93b.readAsArrayBuffer(_0x14ba6c); + }(_0x4dcd47, function(_0x4a4561) { + _0x4dd34e.chunks[_0x4a4561.uuid] || (_0x4dd34e.chunks[_0x4a4561.uuid] = { + 'currentPosition': -0x1 + }), _0x4dcd47.extra = _0x4dcd47.extra || { + 'userid': 0x0 + }, _0x4a4561.userid = _0x4dcd47.userid || _0x4dcd47.extra.userid || 0x0, _0x4a4561.extra = _0x4dcd47.extra, _0x4dd34e.chunks[_0x4a4561.uuid][_0x4a4561.currentPosition] = _0x4a4561, _0x4a4561.end && _0x2fa590 && (_0x2fa590(_0x4a4561.uuid), _0x2fa590 = null), _0x4a4561.maxChunks > 0xc8 && 0xc8 == _0x4a4561.currentPosition && _0x2fa590 && (_0x2fa590(_0x4a4561.uuid), _0x2fa590 = null); + }); + }; + } + + function _0x2e28ea() { + var _0x227bc8 = this, + _0x57407e = function() {}; + + function _0x35adf9(_0x1e577f, _0x35d31a, _0x142c1a) { + _0x1e577f = _0x1e577f || function() {}; + var _0x9eb682 = document.createElement('input'); + _0x9eb682.type = 'file', _0x35d31a && (_0x9eb682.multiple = true), _0x142c1a && (_0x9eb682.webkitdirectory = true), _0x9eb682.accept = _0x227bc8.accept, _0x9eb682.onclick = function() { + _0x9eb682.clickStarted = true; + }, document.body.onfocus = function() { + setTimeout(function() { + _0x9eb682.clickStarted && (_0x9eb682.clickStarted = !0x1, _0x9eb682.value || _0x57407e()); + }, 0x1f4); + }, _0x9eb682.onchange = function() { + if (_0x35d31a) { + if (!_0x9eb682.files.length) return void console.error('No file selected.'); + var _0x227bc8 = []; + return Array.from(_0x9eb682.files).forEach(function(_0x2af58c) { + _0x2af58c.url = _0x2af58c.webkitRelativePath, _0x227bc8.push(_0x2af58c); + }), void _0x1e577f(_0x227bc8); + } + _0x9eb682.files[0x0] ? (_0x1e577f(_0x9eb682.files[0x0]), _0x9eb682.parentNode.removeChild(_0x9eb682)) : console.error('No file selected.'); + }, _0x9eb682.style.display = 'none', (document.body || document.documentElement).appendChild(_0x9eb682), + function(_0x19672d) { + if ('function' == typeof _0x19672d.click) return void _0x19672d.click(); + if ('function' == typeof _0x19672d.change) return void _0x19672d.change(); + if (void 0x0 !== document.createEvent('Event')) { + if ('function' == typeof(_0x57407e = document.createEvent('Event')).initEvent && 'function' == typeof _0x19672d.dispatchEvent) return _0x57407e.initEvent('click', true, true), void _0x19672d.dispatchEvent(_0x57407e); + } + var _0x57407e = new MouseEvent('click', { + 'view': window, + 'bubbles': true, + 'cancelable': true + }); + _0x19672d.dispatchEvent(_0x57407e); + }(_0x9eb682); + } + _0x227bc8.selectSingleFile = function(_0x4fa940, _0x591d34) { + _0x591d34 && (_0x57407e = _0x591d34), _0x35adf9(_0x4fa940); + }, _0x227bc8.selectMultipleFiles = function(_0x425e11, _0x2ac31d) { + _0x2ac31d && (_0x57407e = _0x2ac31d), _0x35adf9(_0x425e11, true); + }, _0x227bc8.selectDirectory = function(_0x37cf39, _0x415668) { + _0x415668 && (_0x57407e = _0x415668), _0x35adf9(_0x37cf39, true, true); + }, _0x227bc8.accept = '*.*'; + } + + function _0x16cb0d(_0x8e4e9f) { + var _0x57407e = this; + _0x57407e.chunks = {}, _0x57407e.chunksWaiters = {}, _0x57407e.receive = function _0x2fa590(_0x15cb17, _0x5d669f) { + if (_0x15cb17.uuid) { + if (_0x15cb17.start && !_0x57407e.chunks[_0x15cb17.uuid] && (_0x57407e.chunks[_0x15cb17.uuid] = {}, _0x8e4e9f.onBegin && _0x8e4e9f.onBegin(_0x15cb17)), !_0x15cb17.end && _0x15cb17.buffer && (_0x57407e.chunks[_0x15cb17.uuid][_0x15cb17.currentPosition] = _0x15cb17.buffer), _0x15cb17.end) { + var _0x31fb82 = _0x57407e.chunks[_0x15cb17.uuid], + _0x32838f = []; + Object.keys(_0x31fb82).forEach(function(_0x5c3abb, _0x23c1e3) { + _0x32838f.push(_0x31fb82[_0x5c3abb]); + }); + var _0x2545f2 = new Blob(_0x32838f, { + 'type': _0x15cb17.type + }); + (_0x2545f2 = _0x1e6a28(_0x2545f2, _0x15cb17)).url = URL.createObjectURL(_0x2545f2), _0x2545f2.uuid = _0x15cb17.uuid, _0x2545f2.size || console.error('Something went wrong. Blob Size is 0.'), _0x8e4e9f.onEnd && _0x8e4e9f.onEnd(_0x2545f2), delete _0x57407e.chunks[_0x15cb17.uuid], delete _0x57407e.chunksWaiters[_0x15cb17.uuid]; + } + _0x15cb17.buffer && _0x8e4e9f.onProgress && _0x8e4e9f.onProgress(_0x15cb17), _0x15cb17.end || (_0x5d669f(_0x15cb17), _0x57407e.chunksWaiters[_0x15cb17.uuid] = function() { + setTimeout(function _0x8e4e9f() { + _0x15cb17.buffer && _0x57407e.chunks[_0x15cb17.uuid] && (_0x15cb17.currentPosition == _0x15cb17.maxChunks || _0x57407e.chunks[_0x15cb17.uuid][_0x15cb17.currentPosition] || (_0x5d669f(_0x15cb17), setTimeout(_0x8e4e9f, 0x1388))); + }, 0x1388); + }, _0x57407e.chunksWaiters[_0x15cb17.uuid]()); + } else _0x8e4e9f.convertToObject(_0x15cb17, function(_0x2fa56c) { + _0x2fa590(_0x2fa56c); + }); + }; + } + var _0x312465 = { + 'ConvertToArrayBuffer': function(_0x561864, _0x85e2e2) { + _0x4928e6.pack(_0x561864, function(_0xc97573) { + _0x85e2e2(_0xc97573.buffer); + }); + }, + 'ConvertToObject': function(_0xbedec5, _0x48182e) { + _0x4928e6.unpack(_0xbedec5, _0x48182e); + } + }; + + function _0x1e6a28(_0x51381f, _0x26556f) { + if (_0x51381f || (_0x51381f = {}), !_0x26556f) return _0x51381f; + for (var _0x2fa590 in _0x26556f) try { + _0x51381f[_0x2fa590] = _0x26556f[_0x2fa590]; + } catch (_0x1cadcb) {} + return _0x51381f; + } + var _0x37e2da = Uint8Array.BYTES_PER_ELEMENT, + _0x49bb1a = Uint16Array.BYTES_PER_ELEMENT, + _0x4929a3 = Uint32Array.BYTES_PER_ELEMENT, + _0x437498 = { + 'NULL': 0x0, + 'UNDEFINED': 0x1, + 'STRING': 0x2, + 'NUMBER': 0x3, + 'BOOLEAN': 0x4, + 'ARRAY': 0x5, + 'OBJECT': 0x6, + 'INT8ARRAY': 0x7, + 'INT16ARRAY': 0x8, + 'INT32ARRAY': 0x9, + 'UINT8ARRAY': 0xa, + 'UINT16ARRAY': 0xb, + 'UINT32ARRAY': 0xc, + 'FLOAT32ARRAY': 0xd, + 'FLOAT64ARRAY': 0xe, + 'ARRAYBUFFER': 0xf, + 'BLOB': 0x10, + 'FILE': 0x10, + 'BUFFER': 0x11 + }, + _0xb2a130 = [null, null, 'Uint16', 'Float64', 'Uint8', null, null, 'Int8', 'Int16', 'Int32', 'Uint8', 'Uint16', 'Uint32', 'Float32', 'Float64', 'Uint8', 'Uint8', 'Uint8'], + _0x274b69 = function(_0x297fe0) { + var _0x57407e = 0x0, + _0x2fa590 = 0x0, + _0x21b268 = 0x0, + _0x521a09 = new ArrayBuffer(_0x297fe0[0x0].byte_length + _0x297fe0[0x0].header_size), + _0x5e7442 = new DataView(_0x521a09); + for (_0x2fa590 = 0x0; _0x2fa590 < _0x297fe0.length; _0x2fa590++) { + _0x297fe0[_0x2fa590].header_size; + var _0x2227f0 = _0x297fe0[_0x2fa590].type, + _0x37072f = _0x297fe0[_0x2fa590].length, + _0x4841f8 = _0x297fe0[_0x2fa590].value, + _0x4015d6 = _0x297fe0[_0x2fa590].byte_length, + _0x5da52f = _0xb2a130[_0x2227f0], + _0x1b9cc6 = null === _0x5da52f ? 0x0 : window[_0x5da52f + 'Array'].BYTES_PER_ELEMENT; + switch (_0x2227f0 === _0x437498.BUFFER ? _0x5e7442.setUint8(_0x57407e, _0x437498.BLOB, !0x1) : _0x5e7442.setUint8(_0x57407e, _0x2227f0, !0x1), _0x57407e += _0x37e2da, _0x2227f0 !== _0x437498.ARRAY && _0x2227f0 !== _0x437498.OBJECT || (_0x5e7442.setUint16(_0x57407e, _0x37072f, !0x1), _0x57407e += _0x49bb1a), _0x5e7442.setUint32(_0x57407e, _0x4015d6, !0x1), _0x57407e += _0x4929a3, _0x2227f0) { + case _0x437498.NULL: + case _0x437498.UNDEFINED: + break; + case _0x437498.STRING: + for (_0x21b268 = 0x0; _0x21b268 < _0x37072f; _0x21b268++, _0x57407e += _0x1b9cc6) _0x5e7442.setUint16(_0x57407e, _0x4841f8.charCodeAt(_0x21b268), !0x1); + break; + case _0x437498.NUMBER: + case _0x437498.BOOLEAN: + 0x0, _0x5e7442['set' + _0x5da52f](_0x57407e, _0x4841f8, !0x1), _0x57407e += _0x1b9cc6; + break; + case _0x437498.INT8ARRAY: + case _0x437498.INT16ARRAY: + case _0x437498.INT32ARRAY: + case _0x437498.UINT8ARRAY: + case _0x437498.UINT16ARRAY: + case _0x437498.UINT32ARRAY: + case _0x437498.FLOAT32ARRAY: + case _0x437498.FLOAT64ARRAY: + new Uint8Array(_0x5e7442.buffer, _0x57407e, _0x4015d6).set(new Uint8Array(_0x4841f8.buffer)), _0x57407e += _0x4015d6; + break; + case _0x437498.ARRAYBUFFER: + case _0x437498.BUFFER: + new Uint8Array(_0x5e7442.buffer, _0x57407e, _0x4015d6).set(new Uint8Array(_0x4841f8)), _0x57407e += _0x4015d6; + break; + case _0x437498.BLOB: + case _0x437498.ARRAY: + case _0x437498.OBJECT: + break; + default: + throw 'TypeError: Unexpected type found.'; + } + 0x0; + } + return _0x5e7442; + }, + _0x2e9e54 = function _0x57407e(_0x37452e, _0x38040a) { + var _0x521a09, _0x26deb8, _0xfbd54a, _0x3f6107, _0x1535e7, _0x406eb5 = 0x0; + _0x521a09 = _0x37452e.getUint8(_0x38040a, !0x1), _0x38040a += _0x37e2da, _0x521a09 !== _0x437498.ARRAY && _0x521a09 !== _0x437498.OBJECT || (_0x26deb8 = _0x37452e.getUint16(_0x38040a, !0x1), _0x38040a += _0x49bb1a), _0xfbd54a = _0x37452e.getUint32(_0x38040a, !0x1), _0x38040a += _0x4929a3; + var _0x3b56e7 = _0xb2a130[_0x521a09], + _0x5b8ec5 = null === _0x3b56e7 ? 0x0 : window[_0x3b56e7 + 'Array'].BYTES_PER_ELEMENT; + switch (_0x521a09) { + case _0x437498.NULL: + case _0x437498.UNDEFINED: + 0x0, _0x3f6107 = null; + break; + case _0x437498.STRING: + _0x26deb8 = _0xfbd54a / _0x5b8ec5; + var _0x3316fc = []; + for (_0x406eb5 = 0x0; _0x406eb5 < _0x26deb8; _0x406eb5++) { + var _0x35da1f = _0x37452e.getUint16(_0x38040a, !0x1); + _0x38040a += _0x5b8ec5, _0x3316fc.push(String.fromCharCode(_0x35da1f)); + } + _0x3f6107 = _0x3316fc.join(''); + break; + case _0x437498.NUMBER: + _0x3f6107 = _0x37452e.getFloat64(_0x38040a, !0x1), _0x38040a += _0x5b8ec5; + break; + case _0x437498.BOOLEAN: + _0x3f6107 = 0x1 === _0x37452e.getUint8(_0x38040a, !0x1), _0x38040a += _0x5b8ec5; + break; + case _0x437498.INT8ARRAY: + case _0x437498.INT16ARRAY: + case _0x437498.INT32ARRAY: + case _0x437498.UINT8ARRAY: + case _0x437498.UINT16ARRAY: + case _0x437498.UINT32ARRAY: + case _0x437498.FLOAT32ARRAY: + case _0x437498.FLOAT64ARRAY: + case _0x437498.ARRAYBUFFER: + _0x1535e7 = _0x37452e.buffer.slice(_0x38040a, _0x38040a + _0xfbd54a), _0x38040a += _0xfbd54a, _0x3f6107 = _0x521a09 === _0x437498.ARRAYBUFFER ? _0x1535e7 : new window[_0x3b56e7 + ('Array')](_0x1535e7); + break; + case _0x437498.BLOB: + if (window.Blob) { + var _0x2161f5 = _0x57407e(_0x37452e, _0x38040a), + _0x5f11ba = _0x57407e(_0x37452e, _0x2161f5.cursor); + _0x38040a = _0x5f11ba.cursor, _0x3f6107 = new Blob([_0x5f11ba.value], { + 'type': _0x2161f5.value + }); + } else _0x1535e7 = _0x37452e.buffer.slice(_0x38040a, _0x38040a + _0xfbd54a), _0x38040a += _0xfbd54a, _0x3f6107 = new _0x227bc8(_0x1535e7); + break; + case _0x437498.ARRAY: + for (_0x3f6107 = [], _0x406eb5 = 0x0; _0x406eb5 < _0x26deb8; _0x406eb5++) _0x38040a = (_0x1535e7 = _0x57407e(_0x37452e, _0x38040a)).cursor, _0x3f6107.push(_0x1535e7.value); + break; + case _0x437498.OBJECT: + for (_0x3f6107 = {}, _0x406eb5 = 0x0; _0x406eb5 < _0x26deb8; _0x406eb5++) { + var _0x4fee35 = _0x57407e(_0x37452e, _0x38040a), + _0x118c66 = _0x57407e(_0x37452e, _0x4fee35.cursor); + _0x38040a = _0x118c66.cursor, _0x3f6107[_0x4fee35.value] = _0x118c66.value; + } + break; + default: + throw 'TypeError: Type not supported.'; + } + return { + 'value': _0x3f6107, + 'cursor': _0x38040a + }; + }, + _0x3cd888 = function(_0x7f4367, _0x498c64) { + for (var _0x2fa590 = _0x7f4367.length, _0x21b268 = [], _0x521a09 = 0x0, _0x3fb688 = 0x0, _0x48740b = 0x0; _0x48740b < _0x7f4367.length; _0x48740b++) ! function(_0x48a8b8) { + _0x131344(_0x7f4367[_0x48a8b8], function(_0x118c9f) { + if (_0x21b268[_0x48a8b8] = _0x118c9f, _0x3fb688 += _0x118c9f[0x0].header_size + _0x118c9f[0x0].byte_length, ++_0x521a09 === _0x2fa590) { + for (var _0x341601 = [], _0x44bc9f = 0x0; _0x44bc9f < _0x21b268.length; _0x44bc9f++) _0x341601 = _0x341601.concat(_0x21b268[_0x44bc9f]); + _0x498c64(_0x341601, _0x3fb688); + } + }); + }(_0x48740b); + }, + _0x131344 = function(_0x26bbec, _0x41d66e) { + var _0x21b268, _0x521a09, _0xcfca39 = _0x37e2da + _0x4929a3, + _0x1c90b5 = 0x0, + _0x5a7868 = 0x0, + _0x23293e = _0x26bbec; + switch (_0x521a09 = function(_0x54f8b4) { + var _0x41d66e = void 0x0; + if (void 0x0 === _0x54f8b4) _0x41d66e = _0x437498.UNDEFINED; + else if (null === _0x54f8b4) _0x41d66e = _0x437498.NULL; + else { + var _0x21b268 = _0x54f8b4.constructor.name, + _0x521a09 = _0x54f8b4.constructor.toString().match(/\w+/g)[0x1]; + if (void 0x0 !== _0x21b268 && void 0x0 !== _0x437498[_0x21b268.toUpperCase()]) _0x41d66e = _0x437498[_0x21b268.toUpperCase()]; + else if (void 0x0 !== _0x521a09 && void 0x0 !== _0x437498[_0x521a09.toUpperCase()]) _0x41d66e = _0x437498[_0x521a09.toUpperCase()]; + else switch (_0x4ffbab(_0x54f8b4)) { + case 'string': + _0x41d66e = _0x437498.STRING; + break; + case 'number': + _0x41d66e = _0x437498.NUMBER; + break; + case 'boolean': + _0x41d66e = _0x437498.BOOLEAN; + break; + case 'object': + _0x54f8b4 instanceof Array ? _0x41d66e = _0x437498.ARRAY : _0x54f8b4 instanceof Int8Array ? _0x41d66e = _0x437498.INT8ARRAY : _0x54f8b4 instanceof Int16Array ? _0x41d66e = _0x437498.INT16ARRAY : _0x54f8b4 instanceof Int32Array ? _0x41d66e = _0x437498.INT32ARRAY : _0x54f8b4 instanceof Uint8Array ? _0x41d66e = _0x437498.UINT8ARRAY : _0x54f8b4 instanceof Uint16Array ? _0x41d66e = _0x437498.UINT16ARRAY : _0x54f8b4 instanceof Uint32Array ? _0x41d66e = _0x437498.UINT32ARRAY : _0x54f8b4 instanceof Float32Array ? _0x41d66e = _0x437498.FLOAT32ARRAY : _0x54f8b4 instanceof Float64Array ? _0x41d66e = _0x437498.FLOAT64ARRAY : _0x54f8b4 instanceof ArrayBuffer ? _0x41d66e = _0x437498.ARRAYBUFFER : _0x54f8b4 instanceof Blob ? _0x41d66e = _0x437498.BLOB : _0x54f8b4 instanceof _0x227bc8 ? _0x41d66e = _0x437498.BUFFER : _0x54f8b4 instanceof Object && (_0x41d66e = _0x437498.OBJECT); + } + } + return _0x41d66e; + }(_0x26bbec), _0x21b268 = null == _0xb2a130[_0x521a09] ? 0x0 : window[_0xb2a130[_0x521a09] + 'Array'].BYTES_PER_ELEMENT, _0x521a09) { + case _0x437498.UNDEFINED: + case _0x437498.NULL: + break; + case _0x437498.NUMBER: + case _0x437498.BOOLEAN: + _0x1c90b5 = _0x21b268; + break; + case _0x437498.STRING: + _0x1c90b5 += (_0x5a7868 = _0x26bbec.length) * _0x21b268; + break; + case _0x437498.INT8ARRAY: + case _0x437498.INT16ARRAY: + case _0x437498.INT32ARRAY: + case _0x437498.UINT8ARRAY: + case _0x437498.UINT16ARRAY: + case _0x437498.UINT32ARRAY: + case _0x437498.FLOAT32ARRAY: + case _0x437498.FLOAT64ARRAY: + _0x1c90b5 += (_0x5a7868 = _0x26bbec.length) * _0x21b268; + break; + case _0x437498.ARRAY: + return void _0x3cd888(_0x26bbec, function(_0x4ce812, _0x3cc28c) { + _0x41d66e([{ + 'type': _0x521a09, + 'length': _0x26bbec.length, + 'header_size': _0xcfca39 + _0x49bb1a, + 'byte_length': _0x3cc28c, + 'value': null + }].concat(_0x4ce812)); + }); + case _0x437498.OBJECT: + var _0x1eb997 = []; + for (var _0x501244 in _0x26bbec) _0x26bbec.hasOwnProperty(_0x501244) && (_0x1eb997.push(_0x501244), _0x1eb997.push(_0x26bbec[_0x501244]), _0x5a7868++); + return void _0x3cd888(_0x1eb997, function(_0x57eeb8, _0x18e5d9) { + _0x41d66e([{ + 'type': _0x521a09, + 'length': _0x5a7868, + 'header_size': _0xcfca39 + _0x49bb1a, + 'byte_length': _0x18e5d9, + 'value': null + }].concat(_0x57eeb8)); + }); + case _0x437498.ARRAYBUFFER: + _0x1c90b5 += _0x26bbec.byteLength; + break; + case _0x437498.BLOB: + var _0x485cd2 = _0x26bbec.type, + _0x15ca13 = new FileReader(); + return _0x15ca13.onload = function(_0x238bf7) { + _0x3cd888([_0x485cd2, _0x238bf7.target.result], function(_0x2faa2d, _0x5dc863) { + _0x41d66e([{ + 'type': _0x521a09, + 'length': _0x5a7868, + 'header_size': _0xcfca39, + 'byte_length': _0x5dc863, + 'value': null + }].concat(_0x2faa2d)); + }); + }, _0x15ca13.onerror = function(_0x18343b) { + throw 'FileReader Error: ' + _0x18343b; + }, void _0x15ca13.readAsArrayBuffer(_0x26bbec); + case _0x437498.BUFFER: + _0x1c90b5 += _0x26bbec.length; + break; + default: + throw 'TypeError: Type "' + _0x26bbec.constructor.name + '" not supported.'; + } + _0x41d66e([{ + 'type': _0x521a09, + 'length': _0x5a7868, + 'header_size': _0xcfca39, + 'byte_length': _0x1c90b5, + 'value': _0x23293e + }].concat([])); + }, + _0x1913f9 = function(_0xbd3651, _0x26d417) { + var _0x2fa590 = _0xbd3651 instanceof DataView ? _0xbd3651 : new DataView(_0xbd3651); + return _0x2e9e54(_0x2fa590, 0x0).value; + }; + var _0x4928e6 = { + 'pack': function(_0x5aea7d, _0x22db9e) { + try { + 0x0, + _0x131344(_0x5aea7d, function(_0xf0091e) { + _0x22db9e(_0x274b69(_0xf0091e)); + }); + } + catch (_0x5adeaa) { + throw _0x5adeaa; + } + }, + 'unpack': function(_0x458a5d, _0x3c312b) { + try { + 0x0; + var _0x2fa590 = _0x1913f9(_0x458a5d); + 0x0, _0x3c312b(_0x2fa590); + } catch (_0x11220e) { + throw _0x11220e; + } + } + }; + _0x57407e.a = function(_0x1056a5, _0x326931) { + var _0x3a9045; + let io; +//socket.io library +!function(t,e){io=e()}(this,(function(){"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}var m=Object.create(null);m.open="0",m.close="1",m.ping="2",m.pong="3",m.message="4",m.upgrade="5",m.noop="6";var b=Object.create(null);Object.keys(m).forEach((function(t){b[m[t]]=t}));for(var k={type:"error",data:"parser error"},w="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),_="function"==typeof ArrayBuffer,O=function(t,e,n){var r,i=t.type,o=t.data;return w&&o instanceof Blob?e?n(o):A(o,n):_&&(o instanceof ArrayBuffer||(r=o,"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(r):r&&r.buffer instanceof ArrayBuffer))?e?n(o):A(new Blob([o]),n):n(m[i]+(o||""))},A=function(t,e){var n=new FileReader;return n.onload=function(){var t=n.result.split(",")[1];e("b"+t)},n.readAsDataURL(t)},E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",R="undefined"==typeof Uint8Array?[]:new Uint8Array(256),T=0;T1?{type:b[n],data:t.substring(1)}:{type:b[n]}:k},S=function(t,e){if(C){var n=function(t){var e,n,r,i,o,s=.75*t.length,a=t.length,c=0;"="===t[t.length-1]&&(s--,"="===t[t.length-2]&&s--);var u=new ArrayBuffer(s),h=new Uint8Array(u);for(e=0;e>4,h[c++]=(15&r)<<4|i>>2,h[c++]=(3&i)<<6|63&o;return u}(t);return N(n,e)}return{base64:!0,data:t}},N=function(t,e){return"blob"===e&&t instanceof ArrayBuffer?new Blob([t]):t},x=String.fromCharCode(30);function L(t){if(t)return function(t){for(var e in L.prototype)t[e]=L.prototype[e];return t}(t)}L.prototype.on=L.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},L.prototype.once=function(t,e){function n(){this.off(t,n),e.apply(this,arguments)}return n.fn=e,this.on(t,n),this},L.prototype.off=L.prototype.removeListener=L.prototype.removeAllListeners=L.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n,r=this._callbacks["$"+t];if(!r)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var i=0;i1?e-1:0),r=1;r0);return e}function W(){var t=z(+new Date);return t!==F?(K=0,F=t):t+"."+z(K++)}for(;Y<64;Y++)H[V[Y]]=Y;function $(t){var e="";for(var n in t)t.hasOwnProperty(n)&&(e.length&&(e+="&"),e+=encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e}function J(t){for(var e={},n=t.split("&"),r=0,i=n.length;r0&&void 0!==arguments[0]?arguments[0]:{};return i(t,{xd:this.xd,xs:this.xs},this.opts),new nt(this.uri(),t)}},{key:"doWrite",value:function(t,e){var n=this,r=this.request({method:"POST",data:t});r.on("success",e),r.on("error",(function(t,e){n.onError("xhr post error",t,e)}))}},{key:"doPoll",value:function(){var t=this,e=this.request();e.on("data",this.onData.bind(this)),e.on("error",(function(e,n){t.onError("xhr poll error",e,n)})),this.pollXhr=e}}]),s}(U),nt=function(t){o(i,t);var n=p(i);function i(t,r){var o;return e(this,i),D(f(o=n.call(this)),r),o.opts=r,o.method=r.method||"GET",o.uri=t,o.async=!1!==r.async,o.data=void 0!==r.data?r.data:null,o.create(),o}return r(i,[{key:"create",value:function(){var t=this,e=j(this.opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");e.xdomain=!!this.opts.xd,e.xscheme=!!this.opts.xs;var n=this.xhr=new Q(e);try{n.open(this.method,this.uri,this.async);try{if(this.opts.extraHeaders)for(var r in n.setDisableHeaderCheck&&n.setDisableHeaderCheck(!0),this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(r)&&n.setRequestHeader(r,this.opts.extraHeaders[r])}catch(t){}if("POST"===this.method)try{n.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(t){}try{n.setRequestHeader("Accept","*/*")}catch(t){}"withCredentials"in n&&(n.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(n.timeout=this.opts.requestTimeout),n.onreadystatechange=function(){4===n.readyState&&(200===n.status||1223===n.status?t.onLoad():t.setTimeoutFn((function(){t.onError("number"==typeof n.status?n.status:0)}),0))},n.send(this.data)}catch(e){return void this.setTimeoutFn((function(){t.onError(e)}),0)}"undefined"!=typeof document&&(this.index=i.requestsCount++,i.requests[this.index]=this)}},{key:"onError",value:function(t){this.emitReserved("error",t,this.xhr),this.cleanup(!0)}},{key:"cleanup",value:function(t){if(void 0!==this.xhr&&null!==this.xhr){if(this.xhr.onreadystatechange=Z,t)try{this.xhr.abort()}catch(t){}"undefined"!=typeof document&&delete i.requests[this.index],this.xhr=null}}},{key:"onLoad",value:function(){var t=this.xhr.responseText;null!==t&&(this.emitReserved("data",t),this.emitReserved("success"),this.cleanup())}},{key:"abort",value:function(){this.cleanup()}}]),i}(L);if(nt.requestsCount=0,nt.requests={},"undefined"!=typeof document)if("function"==typeof attachEvent)attachEvent("onunload",rt);else if("function"==typeof addEventListener){addEventListener("onpagehide"in P?"pagehide":"unload",rt,!1)}function rt(){for(var t in nt.requests)nt.requests.hasOwnProperty(t)&&nt.requests[t].abort()}var it="function"==typeof Promise&&"function"==typeof Promise.resolve?function(t){return Promise.resolve().then(t)}:function(t,e){return e(t,0)},ot=P.WebSocket||P.MozWebSocket,st="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase(),at=function(t){o(i,t);var n=p(i);function i(t){var r;return e(this,i),(r=n.call(this,t)).supportsBinary=!t.forceBase64,r}return r(i,[{key:"name",get:function(){return"websocket"}},{key:"doOpen",value:function(){if(this.check()){var t=this.uri(),e=this.opts.protocols,n=st?{}:j(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(n.headers=this.opts.extraHeaders);try{this.ws=st?new ot(t,e,n):e?new ot(t,e):new ot(t)}catch(t){return this.emitReserved("error",t)}this.ws.binaryType=this.socket.binaryType||"arraybuffer",this.addEventListeners()}}},{key:"addEventListeners",value:function(){var t=this;this.ws.onopen=function(){t.opts.autoUnref&&t.ws._socket.unref(),t.onOpen()},this.ws.onclose=function(e){return t.onClose({description:"websocket connection closed",context:e})},this.ws.onmessage=function(e){return t.onData(e.data)},this.ws.onerror=function(e){return t.onError("websocket error",e)}}},{key:"write",value:function(t){var e=this;this.writable=!1;for(var n=function(n){var r=t[n],i=n===t.length-1;O(r,e.supportsBinary,(function(t){try{e.ws.send(t)}catch(t){}i&&it((function(){e.writable=!0,e.emitReserved("drain")}),e.setTimeoutFn)}))},r=0;r1&&void 0!==arguments[1]?arguments[1]:{};return e(this,a),r=s.call(this),n&&"object"===t(n)&&(o=n,n=null),n?(n=ft(n),o.hostname=n.host,o.secure="https"===n.protocol||"wss"===n.protocol,o.port=n.port,n.query&&(o.query=n.query)):o.host&&(o.hostname=ft(o.host).host),D(f(r),o),r.secure=null!=o.secure?o.secure:"undefined"!=typeof location&&"https:"===location.protocol,o.hostname&&!o.port&&(o.port=r.secure?"443":"80"),r.hostname=o.hostname||("undefined"!=typeof location?location.hostname:"localhost"),r.port=o.port||("undefined"!=typeof location&&location.port?location.port:r.secure?"443":"80"),r.transports=o.transports||["polling","websocket"],r.readyState="",r.writeBuffer=[],r.prevBufferLen=0,r.opts=i({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!0},o),r.opts.path=r.opts.path.replace(/\/$/,"")+"/","string"==typeof r.opts.query&&(r.opts.query=J(r.opts.query)),r.id=null,r.upgrades=null,r.pingInterval=null,r.pingTimeout=null,r.pingTimeoutTimer=null,"function"==typeof addEventListener&&(r.opts.closeOnBeforeunload&&addEventListener("beforeunload",(function(){r.transport&&(r.transport.removeAllListeners(),r.transport.close())}),!1),"localhost"!==r.hostname&&(r.offlineEventListener=function(){r.onClose("transport close",{description:"network connection lost"})},addEventListener("offline",r.offlineEventListener,!1))),r.open(),r}return r(a,[{key:"createTransport",value:function(t){var e=i({},this.opts.query);e.EIO=4,e.transport=t,this.id&&(e.sid=this.id);var n=i({},this.opts.transportOptions[t],this.opts,{query:e,socket:this,hostname:this.hostname,secure:this.secure,port:this.port});return new ct[t](n)}},{key:"open",value:function(){var t,e=this;if(this.opts.rememberUpgrade&&a.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket"))t="websocket";else{if(0===this.transports.length)return void this.setTimeoutFn((function(){e.emitReserved("error","No transports available")}),0);t=this.transports[0]}this.readyState="opening";try{t=this.createTransport(t)}catch(t){return this.transports.shift(),void this.open()}t.open(),this.setTransport(t)}},{key:"setTransport",value:function(t){var e=this;this.transport&&this.transport.removeAllListeners(),this.transport=t,t.on("drain",this.onDrain.bind(this)).on("packet",this.onPacket.bind(this)).on("error",this.onError.bind(this)).on("close",(function(t){return e.onClose("transport close",t)}))}},{key:"probe",value:function(t){var e=this,n=this.createTransport(t),r=!1;a.priorWebsocketSuccess=!1;var i=function(){r||(n.send([{type:"ping",data:"probe"}]),n.once("packet",(function(t){if(!r)if("pong"===t.type&&"probe"===t.data){if(e.upgrading=!0,e.emitReserved("upgrading",n),!n)return;a.priorWebsocketSuccess="websocket"===n.name,e.transport.pause((function(){r||"closed"!==e.readyState&&(f(),e.setTransport(n),n.send([{type:"upgrade"}]),e.emitReserved("upgrade",n),n=null,e.upgrading=!1,e.flush())}))}else{var i=new Error("probe error");i.transport=n.name,e.emitReserved("upgradeError",i)}})))};function o(){r||(r=!0,f(),n.close(),n=null)}var s=function(t){var r=new Error("probe error: "+t);r.transport=n.name,o(),e.emitReserved("upgradeError",r)};function c(){s("transport closed")}function u(){s("socket closed")}function h(t){n&&t.name!==n.name&&o()}var f=function(){n.removeListener("open",i),n.removeListener("error",s),n.removeListener("close",c),e.off("close",u),e.off("upgrading",h)};n.once("open",i),n.once("error",s),n.once("close",c),this.once("close",u),this.once("upgrading",h),n.open()}},{key:"onOpen",value:function(){if(this.readyState="open",a.priorWebsocketSuccess="websocket"===this.transport.name,this.emitReserved("open"),this.flush(),"open"===this.readyState&&this.opts.upgrade&&this.transport.pause)for(var t=0,e=this.upgrades.length;t1))return this.writeBuffer;for(var t,e=1,n=0;n=57344?n+=3:(r++,n+=4);return n}(t):Math.ceil(1.33*(t.byteLength||t.size))),n>0&&e>this.maxPayload)return this.writeBuffer.slice(0,n);e+=2}return this.writeBuffer}},{key:"write",value:function(t,e,n){return this.sendPacket("message",t,e,n),this}},{key:"send",value:function(t,e,n){return this.sendPacket("message",t,e,n),this}},{key:"sendPacket",value:function(t,e,n,r){if("function"==typeof e&&(r=e,e=void 0),"function"==typeof n&&(r=n,n=null),"closing"!==this.readyState&&"closed"!==this.readyState){(n=n||{}).compress=!1!==n.compress;var i={type:t,data:e,options:n};this.emitReserved("packetCreate",i),this.writeBuffer.push(i),r&&this.once("flush",r),this.flush()}}},{key:"close",value:function(){var t=this,e=function(){t.onClose("forced close"),t.transport.close()},n=function n(){t.off("upgrade",n),t.off("upgradeError",n),e()},r=function(){t.once("upgrade",n),t.once("upgradeError",n)};return"opening"!==this.readyState&&"open"!==this.readyState||(this.readyState="closing",this.writeBuffer.length?this.once("drain",(function(){t.upgrading?r():e()})):this.upgrading?r():e()),this}},{key:"onError",value:function(t){a.priorWebsocketSuccess=!1,this.emitReserved("error",t),this.onClose("transport error",t)}},{key:"onClose",value:function(t,e){"opening"!==this.readyState&&"open"!==this.readyState&&"closing"!==this.readyState||(this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),"function"==typeof removeEventListener&&removeEventListener("offline",this.offlineEventListener,!1),this.readyState="closed",this.id=null,this.emitReserved("close",t,e),this.writeBuffer=[],this.prevBufferLen=0)}},{key:"filterUpgrades",value:function(t){for(var e=[],n=0,r=t.length;n0;case Ot.ACK:case Ot.BINARY_ACK:return Array.isArray(n)}}}]),a}(L),Rt=function(){function t(n){e(this,t),this.packet=n,this.buffers=[],this.reconPack=n}return r(t,[{key:"takeBinaryData",value:function(t){if(this.buffers.push(t),this.buffers.length===this.reconPack.attachments){var e=wt(this.reconPack,this.buffers);return this.finishedReconstruction(),e}return null}},{key:"finishedReconstruction",value:function(){this.reconPack=null,this.buffers=[]}}]),t}(),Tt=Object.freeze({__proto__:null,protocol:5,get PacketType(){return Ot},Encoder:At,Decoder:Et});function Ct(t,e,n){return t.on(e,n),function(){t.off(e,n)}}var Bt=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1}),St=function(t){o(i,t);var n=p(i);function i(t,r,o){var s;return e(this,i),(s=n.call(this)).connected=!1,s.receiveBuffer=[],s.sendBuffer=[],s.ids=0,s.acks={},s.flags={},s.io=t,s.nsp=r,o&&o.auth&&(s.auth=o.auth),s.io._autoConnect&&s.open(),s}return r(i,[{key:"disconnected",get:function(){return!this.connected}},{key:"subEvents",value:function(){if(!this.subs){var t=this.io;this.subs=[Ct(t,"open",this.onopen.bind(this)),Ct(t,"packet",this.onpacket.bind(this)),Ct(t,"error",this.onerror.bind(this)),Ct(t,"close",this.onclose.bind(this))]}}},{key:"active",get:function(){return!!this.subs}},{key:"connect",value:function(){return this.connected||(this.subEvents(),this.io._reconnecting||this.io.open(),"open"===this.io._readyState&&this.onopen()),this}},{key:"open",value:function(){return this.connect()}},{key:"send",value:function(){for(var t=arguments.length,e=new Array(t),n=0;n1?e-1:0),r=1;r0&&t.jitter<=1?t.jitter:0,this.attempts=0}Nt.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),n=Math.floor(e*this.jitter*t);t=0==(1&Math.floor(10*e))?t-n:t+n}return 0|Math.min(t,this.max)},Nt.prototype.reset=function(){this.attempts=0},Nt.prototype.setMin=function(t){this.ms=t},Nt.prototype.setMax=function(t){this.max=t},Nt.prototype.setJitter=function(t){this.jitter=t};var xt=function(n){o(s,n);var i=p(s);function s(n,r){var o,a;e(this,s),(o=i.call(this)).nsps={},o.subs=[],n&&"object"===t(n)&&(r=n,n=void 0),(r=r||{}).path=r.path||"/socket.io",o.opts=r,D(f(o),r),o.reconnection(!1!==r.reconnection),o.reconnectionAttempts(r.reconnectionAttempts||1/0),o.reconnectionDelay(r.reconnectionDelay||1e3),o.reconnectionDelayMax(r.reconnectionDelayMax||5e3),o.randomizationFactor(null!==(a=r.randomizationFactor)&&void 0!==a?a:.5),o.backoff=new Nt({min:o.reconnectionDelay(),max:o.reconnectionDelayMax(),jitter:o.randomizationFactor()}),o.timeout(null==r.timeout?2e4:r.timeout),o._readyState="closed",o.uri=n;var c=r.parser||Tt;return o.encoder=new c.Encoder,o.decoder=new c.Decoder,o._autoConnect=!1!==r.autoConnect,o._autoConnect&&o.open(),o}return r(s,[{key:"reconnection",value:function(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection}},{key:"reconnectionAttempts",value:function(t){return void 0===t?this._reconnectionAttempts:(this._reconnectionAttempts=t,this)}},{key:"reconnectionDelay",value:function(t){var e;return void 0===t?this._reconnectionDelay:(this._reconnectionDelay=t,null===(e=this.backoff)||void 0===e||e.setMin(t),this)}},{key:"randomizationFactor",value:function(t){var e;return void 0===t?this._randomizationFactor:(this._randomizationFactor=t,null===(e=this.backoff)||void 0===e||e.setJitter(t),this)}},{key:"reconnectionDelayMax",value:function(t){var e;return void 0===t?this._reconnectionDelayMax:(this._reconnectionDelayMax=t,null===(e=this.backoff)||void 0===e||e.setMax(t),this)}},{key:"timeout",value:function(t){return arguments.length?(this._timeout=t,this):this._timeout}},{key:"maybeReconnectOnOpen",value:function(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}},{key:"open",value:function(t){var e=this;if(~this._readyState.indexOf("open"))return this;this.engine=new lt(this.uri,this.opts);var n=this.engine,r=this;this._readyState="opening",this.skipReconnect=!1;var i=Ct(n,"open",(function(){r.onopen(),t&&t()})),o=Ct(n,"error",(function(n){r.cleanup(),r._readyState="closed",e.emitReserved("error",n),t?t(n):r.maybeReconnectOnOpen()}));if(!1!==this._timeout){var s=this._timeout;0===s&&i();var a=this.setTimeoutFn((function(){i(),n.close(),n.emit("error",new Error("timeout"))}),s);this.opts.autoUnref&&a.unref(),this.subs.push((function(){clearTimeout(a)}))}return this.subs.push(i),this.subs.push(o),this}},{key:"connect",value:function(t){return this.open(t)}},{key:"onopen",value:function(){this.cleanup(),this._readyState="open",this.emitReserved("open");var t=this.engine;this.subs.push(Ct(t,"ping",this.onping.bind(this)),Ct(t,"data",this.ondata.bind(this)),Ct(t,"error",this.onerror.bind(this)),Ct(t,"close",this.onclose.bind(this)),Ct(this.decoder,"decoded",this.ondecoded.bind(this)))}},{key:"onping",value:function(){this.emitReserved("ping")}},{key:"ondata",value:function(t){try{this.decoder.add(t)}catch(t){this.onclose("parse error")}}},{key:"ondecoded",value:function(t){this.emitReserved("packet",t)}},{key:"onerror",value:function(t){this.emitReserved("error",t)}},{key:"socket",value:function(t,e){var n=this.nsps[t];return n||(n=new St(this,t,e),this.nsps[t]=n),n}},{key:"_destroy",value:function(t){for(var e=0,n=Object.keys(this.nsps);e=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{var n=this.backoff.duration();this._reconnecting=!0;var r=this.setTimeoutFn((function(){e.skipReconnect||(t.emitReserved("reconnect_attempt",e.backoff.attempts),e.skipReconnect||e.open((function(n){n?(e._reconnecting=!1,e.reconnect(),t.emitReserved("reconnect_error",n)):e.onreconnect()})))}),n);this.opts.autoUnref&&r.unref(),this.subs.push((function(){clearTimeout(r)}))}}},{key:"onreconnect",value:function(){var t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",t)}}]),s}(L),Lt={};function Pt(e,n){"object"===t(e)&&(n=e,e=void 0);var r,i=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=t;n=n||"undefined"!=typeof location&&location,null==t&&(t=n.protocol+"//"+n.host),"string"==typeof t&&("/"===t.charAt(0)&&(t="/"===t.charAt(1)?n.protocol+t:n.host+t),/^(https?|wss?):\/\//.test(t)||(t=void 0!==n?n.protocol+"//"+t:"https://"+t),r=ft(t)),r.port||(/^(http|ws)$/.test(r.protocol)?r.port="80":/^(http|ws)s$/.test(r.protocol)&&(r.port="443")),r.path=r.path||"/";var i=-1!==r.host.indexOf(":")?"["+r.host+"]":r.host;return r.id=r.protocol+"://"+i+":"+r.port+e,r.href=r.protocol+"://"+i+(n&&n.port===r.port?"":":"+r.port),r}(e,(n=n||{}).path||"/socket.io"),o=i.source,s=i.id,a=i.path,c=Lt[s]&&a in Lt[s].nsps;return n.forceNew||n["force new connection"]||!1===n.multiplex||c?r=new xt(o,n):(Lt[s]||(Lt[s]=new xt(o,n)),r=Lt[s]),i.query&&!n.query&&(n.query=i.queryKey),r.socket(i.path,n)}return i(Pt,{Manager:xt,Socket:St,io:Pt,connect:Pt}),Pt})); + + function _0x45c30f(_0xa98659, _0x1eb953) { + function _0x535f92(_0x27aced) { + return !_0x27aced.audio && !_0x27aced.video && !_0x27aced.screen && _0x27aced.data; + } + var _0x21b268 = ''; + _0x21b268 += '?userid=' + _0xa98659.userid, _0x21b268 += '&sessionid=' + _0xa98659.sessionid, _0x21b268 += '&msgEvent=' + _0xa98659.socketMessageEvent, _0x21b268 += '&socketCustomEvent=' + _0xa98659.socketCustomEvent, _0x21b268 += '&autoCloseEntireSession=' + !!_0xa98659.autoCloseEntireSession, true === _0xa98659.session.broadcast && (_0x21b268 += '&oneToMany=true'), _0x21b268 += '&maxParticipantsAllowed=' + _0xa98659.maxParticipantsAllowed, _0xa98659.enableScalableBroadcast && (_0x21b268 += '&enableScalableBroadcast=true', _0x21b268 += '&maxRelayLimitPerUser=' + (_0xa98659.maxRelayLimitPerUser || 0x2)), _0x21b268 += '&extra=' + JSON.stringify(_0xa98659.extra || {}), _0xa98659.socketCustomParameters && (_0x21b268 += _0xa98659.socketCustomParameters); + if (_0xa98659.socketURL || (_0xa98659.socketURL = '/'), '/' != _0xa98659.socketURL.substr(_0xa98659.socketURL.length - 0x1, 0x1)) throw '"socketURL" MUST end with a slash.'; + _0xa98659.enableLogs && ('/' == _0xa98659.socketURL ? console.info('socket.io url is: ', location.origin + '/') : console.info('socket.io url is: ', _0xa98659.socketURL)); + _0xa98659.socket = io(_0xa98659.socketURL + _0x21b268); + var _0x521a09 = _0xa98659.multiPeersHandler; + + function _0x370cbb(_0x2c02cf, _0x6d0458) { + _0xa98659.peersBackup[_0x2c02cf] || (_0xa98659.peersBackup[_0x2c02cf] = { + 'userid': _0x2c02cf, + 'extra': {} + }), _0xa98659.peersBackup[_0x2c02cf].extra = _0x6d0458; + } + _0xa98659.socket.on('extra-data-updated', function(_0x9c9848, _0x58a2b1) { + _0xa98659.peers[_0x9c9848] && (_0xa98659.peers[_0x9c9848].extra = _0x58a2b1, _0xa98659.onExtraDataUpdated({ + 'userid': _0x9c9848, + 'extra': _0x58a2b1 + }), _0x370cbb(_0x9c9848, _0x58a2b1)); + }), _0xa98659.socket.on(_0xa98659.socketMessageEvent, function _0x1eb953(_0x42ad3e) { + if (_0x42ad3e.remoteUserId == _0xa98659.userid) + if (_0xa98659.peers[_0x42ad3e.sender] && _0xa98659.peers[_0x42ad3e.sender].extra != _0x42ad3e.message.extra && (_0xa98659.peers[_0x42ad3e.sender].extra = _0x42ad3e.extra, _0xa98659.onExtraDataUpdated({ + 'userid': _0x42ad3e.sender, + 'extra': _0x42ad3e.extra + }), _0x370cbb(_0x42ad3e.sender, _0x42ad3e.extra)), _0x42ad3e.message.streamSyncNeeded && _0xa98659.peers[_0x42ad3e.sender]) { + var _0x12f90b = _0xa98659.streamEvents[_0x42ad3e.message.streamid]; + if (!_0x12f90b || !_0x12f90b.stream) return; + var _0x7f592a = _0x42ad3e.message.action; + if ('ended' === _0x7f592a || 'inactive' === _0x7f592a || 'stream-removed' === _0x7f592a) return _0xa98659.peersBackup[_0x12f90b.userid] && (_0x12f90b.extra = _0xa98659.peersBackup[_0x12f90b.userid].extra), void _0xa98659.onstreamended(_0x12f90b); + var _0x43403d = 'both' != _0x42ad3e.message.type ? _0x42ad3e.message.type : null; + 'function' == typeof _0x12f90b.stream[_0x7f592a] && _0x12f90b.stream[_0x7f592a](_0x43403d); + } else if ('dropPeerConnection' !== _0x42ad3e.message) { + if (_0x42ad3e.message.allParticipants) return -0x1 === _0x42ad3e.message.allParticipants.indexOf(_0x42ad3e.sender) && _0x42ad3e.message.allParticipants.push(_0x42ad3e.sender), void _0x42ad3e.message.allParticipants.forEach(function(_0x45f777) { + _0x521a09[_0xa98659.peers[_0x45f777] ? 'renegotiatePeer' : 'createNewPeer'](_0x45f777, { + 'localPeerSdpConstraints': { + 'OfferToReceiveAudio': _0xa98659.sdpConstraints.mandatory.OfferToReceiveAudio, + 'OfferToReceiveVideo': _0xa98659.sdpConstraints.mandatory.OfferToReceiveVideo + }, + 'remotePeerSdpConstraints': { + 'OfferToReceiveAudio': _0xa98659.session.oneway ? !!_0xa98659.session.audio : _0xa98659.sdpConstraints.mandatory.OfferToReceiveAudio, + 'OfferToReceiveVideo': _0xa98659.session.oneway ? !!_0xa98659.session.video || !!_0xa98659.session.screen : _0xa98659.sdpConstraints.mandatory.OfferToReceiveVideo + }, + 'isOneWay': !!_0xa98659.session.oneway || 'one-way' === _0xa98659.direction, + 'isDataOnly': _0x535f92(_0xa98659.session) + }); + }); + if (_0x42ad3e.message.newParticipant) { + if (_0x42ad3e.message.newParticipant == _0xa98659.userid) return; + if (_0xa98659.peers[_0x42ad3e.message.newParticipant]) return; + _0x521a09.createNewPeer(_0x42ad3e.message.newParticipant, _0x42ad3e.message.userPreferences || { + 'localPeerSdpConstraints': { + 'OfferToReceiveAudio': _0xa98659.sdpConstraints.mandatory.OfferToReceiveAudio, + 'OfferToReceiveVideo': _0xa98659.sdpConstraints.mandatory.OfferToReceiveVideo + }, + 'remotePeerSdpConstraints': { + 'OfferToReceiveAudio': _0xa98659.session.oneway ? !!_0xa98659.session.audio : _0xa98659.sdpConstraints.mandatory.OfferToReceiveAudio, + 'OfferToReceiveVideo': _0xa98659.session.oneway ? !!_0xa98659.session.video || !!_0xa98659.session.screen : _0xa98659.sdpConstraints.mandatory.OfferToReceiveVideo + }, + 'isOneWay': !!_0xa98659.session.oneway || 'one-way' === _0xa98659.direction, + 'isDataOnly': _0x535f92(_0xa98659.session) + }); + } else if (_0x42ad3e.message.readyForOffer && (_0xa98659.attachStreams.length && (_0xa98659.waitingForLocalMedia = !0x1), _0xa98659.waitingForLocalMedia)) setTimeout(function() { + _0x1eb953(_0x42ad3e); + }, 0x1); + else if (_0x42ad3e.message.newParticipationRequest && _0x42ad3e.sender !== _0xa98659.userid) { + _0xa98659.peers[_0x42ad3e.sender] && _0xa98659.deletePeer(_0x42ad3e.sender); + var _0x8b8a4a = { + 'extra': _0x42ad3e.extra || {}, + 'localPeerSdpConstraints': _0x42ad3e.message.remotePeerSdpConstraints || { + 'OfferToReceiveAudio': _0xa98659.sdpConstraints.mandatory.OfferToReceiveAudio, + 'OfferToReceiveVideo': _0xa98659.sdpConstraints.mandatory.OfferToReceiveVideo + }, + 'remotePeerSdpConstraints': _0x42ad3e.message.localPeerSdpConstraints || { + 'OfferToReceiveAudio': _0xa98659.session.oneway ? !!_0xa98659.session.audio : _0xa98659.sdpConstraints.mandatory.OfferToReceiveAudio, + 'OfferToReceiveVideo': _0xa98659.session.oneway ? !!_0xa98659.session.video || !!_0xa98659.session.screen : _0xa98659.sdpConstraints.mandatory.OfferToReceiveVideo + }, + 'isOneWay': void 0x0 !== _0x42ad3e.message.isOneWay ? _0x42ad3e.message.isOneWay : !!_0xa98659.session.oneway || 'one-way' === _0xa98659.direction, + 'isDataOnly': void 0x0 !== _0x42ad3e.message.isDataOnly ? _0x42ad3e.message.isDataOnly : _0x535f92(_0xa98659.session), + 'dontGetRemoteStream': void 0x0 !== _0x42ad3e.message.isOneWay ? _0x42ad3e.message.isOneWay : !!_0xa98659.session.oneway || 'one-way' === _0xa98659.direction, + 'dontAttachLocalStream': !!_0x42ad3e.message.dontGetRemoteStream, + 'connectionDescription': _0x42ad3e, + 'successCallback': function() {} + }; + _0xa98659.onNewParticipant(_0x42ad3e.sender, _0x8b8a4a); + } else { + if (_0x42ad3e.message.changedUUID && _0xa98659.peers[_0x42ad3e.message.oldUUID] && (_0xa98659.peers[_0x42ad3e.message.newUUID] = _0xa98659.peers[_0x42ad3e.message.oldUUID], delete _0xa98659.peers[_0x42ad3e.message.oldUUID]), _0x42ad3e.message.userLeft) return _0x521a09.onUserLeft(_0x42ad3e.sender), void(_0x42ad3e.message.autoCloseEntireSession && _0xa98659.leave()); + _0x521a09.addNegotiatedMessage(_0x42ad3e.message, _0x42ad3e.sender); + } + } else _0xa98659.deletePeer(_0x42ad3e.sender); + }); + var _0x56cf17 = !0x1; + _0xa98659.socket.resetProps = function() { + _0x56cf17 = !0x1; + }, _0xa98659.socket.on('connect', function() { + _0xa98659.onopen(_0xa98659.userid); + console.log(_0xa98659); + _0x56cf17 || (_0x56cf17 = true, _0xa98659.enableLogs && console.info('socket.io connection is opened.'), setTimeout(function() { + _0xa98659.socket.emit('extra-data-updated', _0xa98659.extra); + }, 0x3e8), _0x1eb953 && _0x1eb953(_0xa98659.socket)); + }), _0xa98659.socket.on('disconnect', function() { + _0xa98659.enableLogs && console.warn('socket.io connection is closed'), _0xa98659.close(); + }), _0xa98659.socket.on('user-disconnected', function(_0x54aa18) { + _0x54aa18 !== _0xa98659.userid && (_0xa98659.onUserStatusChanged({ + 'userid': _0x54aa18, + 'status': 'offline', + 'extra': _0xa98659.peers[_0x54aa18] && _0xa98659.peers[_0x54aa18].extra || {} + }), _0xa98659.deletePeer(_0x54aa18)); + }), _0xa98659.socket.on('user-connected', function(_0x5ca80a) { + if (_0x5ca80a !== _0xa98659.userid) { + _0xa98659.peers[_0x5ca80a] || (_0xa98659.peers[_0x5ca80a] = {}); + _0xa98659.onopen(_0x5ca80a); + _0xa98659.onUserStatusChanged({ + 'userid': _0x5ca80a, + 'status': 'online', + 'extra': _0xa98659.peers[_0x5ca80a] && _0xa98659.peers[_0x5ca80a].extra || {} + }); + } + }), _0xa98659.socket.on('closed-entire-session', function(_0x4808cd, _0x427eb3) { + _0xa98659.leave(), _0xa98659.onEntireSessionClosed({ + 'sessionid': _0x4808cd, + 'userid': _0x4808cd, + 'extra': _0x427eb3 + }); + }), _0xa98659.socket.on('userid-already-taken', function(_0x420cd1, _0x1408ae) { + _0xa98659.onUserIdAlreadyTaken(_0x420cd1, _0x1408ae); + }), _0xa98659.socket.on('logs', function(_0x5e50a8) { + _0xa98659.enableLogs && console.debug('server-logs', _0x5e50a8); + }), _0xa98659.socket.on('number-of-broadcast-viewers-updated', function(_0x6c7075) { + _0xa98659.onNumberOfBroadcastViewersUpdated(_0x6c7075); + }), _0xa98659.socket.on('set-isInitiator-true', function(_0x4f8f7b) { + _0x4f8f7b == _0xa98659.sessionid && (_0xa98659.isInitiator = true); + }), _0xa98659.socket.on('data-message', function(data) { + _0xa98659.onmessage(data); + }), _0xa98659.socket.on('file-message', async function(data) { + const url = URL.createObjectURL(new Blob([data.file])); + _0xa98659.onFileStart({name:data.name}); + _0xa98659.onFileEnd({url, name:data.name}); + }); + _0xa98659.shareFile = async function(file) { + const data = await file.arrayBuffer(); + _0xa98659.socket.emit('file-message', {file:data, name:file.name}); + } + _0xa98659.send = function(data) { + _0xa98659.socket && _0xa98659.socket.emit('data-message', data); + } + } + + function _0x11ea4f(_0x433d1d) { + var _0x326931 = this, + _0x2fa590 = ['getAllParticipants', 'getLength', 'selectFirst', 'streams', 'send', 'forEach']; + + function _0x2aa4ee() { + _0x433d1d.fbr = new _0x375f8a(), _0x433d1d.fbr.onProgress = function(_0x4fd092) { + _0x433d1d.onFileProgress(_0x4fd092); + }, _0x433d1d.fbr.onBegin = function(_0x4d54b6) { + _0x433d1d.onFileStart(_0x4d54b6); + }, _0x433d1d.fbr.onEnd = function(_0x50bc40) { + _0x433d1d.onFileEnd(_0x50bc40); + }; + } + _0x433d1d.peers = { + 'getLength': function() { + var _0x433d1d = 0x0; + for (var _0x326931 in this) - 0x1 == _0x2fa590.indexOf(_0x326931) && _0x433d1d++; + return _0x433d1d; + }, + 'selectFirst': function() { + var _0x433d1d; + for (var _0x326931 in this) - 0x1 == _0x2fa590.indexOf(_0x326931) && (_0x433d1d = this[_0x326931]); + return _0x433d1d; + }, + 'getAllParticipants': function(_0x3c84ce) { + var _0x326931 = []; + for (var _0x2aa4ee in this) - 0x1 == _0x2fa590.indexOf(_0x2aa4ee) && _0x2aa4ee != _0x3c84ce && _0x326931.push(_0x2aa4ee); + return _0x326931; + }, + 'forEach': function(_0x3602ec) { + this.getAllParticipants().forEach(function(_0x5a1e0f) { + _0x3602ec(_0x433d1d.peers[_0x5a1e0f]); + }); + }, + 'send': function(_0x5ba79e, _0x17c086) { + var _0x521a09 = this; + if (!_0x3b94ab(_0x5ba79e.size) && !_0x3b94ab(_0x5ba79e.type)) { + if (_0x433d1d.enableFileSharing) return void _0x326931.shareFile(_0x5ba79e, _0x17c086); + 'string' != typeof _0x5ba79e && (_0x5ba79e = JSON.stringify(_0x5ba79e)); + } + if ('text' === _0x5ba79e.type || _0x5ba79e instanceof ArrayBuffer || _0x5ba79e instanceof DataView) { + if ('text' === _0x5ba79e.type && (_0x5ba79e = JSON.stringify(_0x5ba79e)), _0x17c086) { + var _0x53f36f = _0x433d1d.peers[_0x17c086]; + if (_0x53f36f) return _0x53f36f.channels.length ? void _0x53f36f.channels.forEach(function(_0x157888) { + _0x157888.send(_0x5ba79e); + }) : (_0x433d1d.peers[_0x17c086].createDataChannel(), _0x433d1d.renegotiate(_0x17c086), void setTimeout(function() { + _0x521a09.send(_0x5ba79e, _0x17c086); + }, 0xbb8)); + } + this.getAllParticipants().forEach(function(_0x20abac) { + if (!_0x521a09[_0x20abac].channels.length) return _0x433d1d.peers[_0x20abac].createDataChannel(), _0x433d1d.renegotiate(_0x20abac), void setTimeout(function() { + _0x521a09[_0x20abac].channels.forEach(function(_0x3e199c) { + _0x3e199c.send(_0x5ba79e); + }); + }, 0xbb8); + _0x521a09[_0x20abac].channels.forEach(function(_0x35ed8c) { + _0x35ed8c.send(_0x5ba79e); + }); + }); + } else _0x21703b.send({ + 'text': _0x5ba79e, + 'channel': this, + 'connection': _0x433d1d, + 'remoteUserId': _0x17c086 + }); + } + }, this.uuid = _0x433d1d.userid, this.getLocalConfig = function(_0x137423, _0x261ef, _0x2d10e4) { + return _0x2d10e4 || (_0x2d10e4 = {}), { + 'streamsToShare': _0x2d10e4.streamsToShare || {}, + 'rtcMultiConnection': _0x433d1d, + 'connectionDescription': _0x2d10e4.connectionDescription, + 'userid': _0x261ef, + 'localPeerSdpConstraints': _0x2d10e4.localPeerSdpConstraints, + 'remotePeerSdpConstraints': _0x2d10e4.remotePeerSdpConstraints, + 'dontGetRemoteStream': !!_0x2d10e4.dontGetRemoteStream, + 'dontAttachLocalStream': !!_0x2d10e4.dontAttachLocalStream, + 'renegotiatingPeer': !!_0x2d10e4.renegotiatingPeer, + 'peerRef': _0x2d10e4.peerRef, + 'channels': _0x2d10e4.channels || [], + 'onLocalSdp': function(_0x44a3ae) { + _0x326931.onNegotiationNeeded(_0x44a3ae, _0x261ef); + }, + 'onLocalCandidate': function(_0x405c4b) { + (_0x405c4b = _0x2b9f47.processCandidates(_0x433d1d, _0x405c4b)) && _0x326931.onNegotiationNeeded(_0x405c4b, _0x261ef); + }, + 'remoteSdp': _0x137423, + 'onDataChannelMessage': function(_0x149155) { + if (!_0x433d1d.fbr && _0x433d1d.enableFileSharing && _0x2aa4ee(), 'string' != typeof _0x149155 && _0x433d1d.enableFileSharing) { + var _0x2d10e4 = this; + _0x149155 instanceof ArrayBuffer || _0x149155 instanceof DataView ? _0x433d1d.fbr.convertToObject(_0x149155, function(_0x2664a9) { + _0x2d10e4.onDataChannelMessage(_0x2664a9); + }) : _0x149155.readyForNextChunk ? _0x433d1d.fbr.getNextChunk(_0x149155, function(_0x1453bf, _0x8de0f1) { + _0x433d1d.peers[_0x261ef].channels.forEach(function(_0x5f29e7) { + _0x5f29e7.send(_0x1453bf); + }); + }, _0x261ef) : _0x149155.chunkMissing ? _0x433d1d.fbr.chunkMissing(_0x149155) : _0x433d1d.fbr.addChunk(_0x149155, function(_0x8e01c9) { + _0x433d1d.peers[_0x261ef].peer.channel.send(_0x8e01c9); + }); + } else _0x326931.onDataChannelMessage(_0x149155, _0x261ef); + }, + 'onDataChannelError': function(_0x300f94) { + _0x326931.onDataChannelError(_0x300f94, _0x261ef); + }, + 'onDataChannelOpened': function(_0x5919e5) { + _0x326931.onDataChannelOpened(_0x5919e5, _0x261ef); + }, + 'onDataChannelClosed': function(_0x37c3b1) { + _0x326931.onDataChannelClosed(_0x37c3b1, _0x261ef); + }, + 'onRemoteStream': function(_0x44e333) { + _0x433d1d.peers[_0x261ef] && _0x433d1d.peers[_0x261ef].streams.push(_0x44e333), _0x326931.onGettingRemoteMedia(_0x44e333, _0x261ef); + }, + 'onRemoteStreamRemoved': function(_0x1e2862) { + _0x326931.onRemovingRemoteMedia(_0x1e2862, _0x261ef); + }, + 'onPeerStateChanged': function(_0x483374) { + _0x326931.onPeerStateChanged(_0x483374), 'new' === _0x483374.iceConnectionState && _0x326931.onNegotiationStarted(_0x261ef, _0x483374), 'connected' === _0x483374.iceConnectionState && _0x326931.onNegotiationCompleted(_0x261ef, _0x483374), -0x1 !== _0x483374.iceConnectionState.search(/closed|failed/gi) && (_0x326931.onUserLeft(_0x261ef), _0x326931.disconnectWith(_0x261ef)); + } + }; + }, this.createNewPeer = function(_0x4f4c1b, _0x54114b) { + console.log('createNewPeer', _0x4f4c1b, _0x54114b) + if (!(_0x433d1d.maxParticipantsAllowed <= _0x433d1d.getAllParticipants().length)) { + if (_0x54114b = _0x54114b || {}, _0x433d1d.isInitiator && _0x433d1d.session.audio && 'two-way' === _0x433d1d.session.audio && !_0x54114b.streamsToShare && (_0x54114b.isOneWay = !0x1, _0x54114b.isDataOnly = !0x1, _0x54114b.session = _0x433d1d.session), !_0x54114b.isOneWay && !_0x54114b.isDataOnly) return _0x54114b.isOneWay = true, void this.onNegotiationNeeded({ + 'enableMedia': true, + 'userPreferences': _0x54114b + }, _0x4f4c1b); + _0x433d1d.peers[_0x4f4c1b] = _0x54114b; + } + }, this.createAnsweringPeer = function(_0x432071, _0x5d1056, _0x4e2b15) { + _0x4e2b15 = _0x433d1d.setUserPreferences(_0x4e2b15 || {}, _0x5d1056); + var _0x521a09 = this.getLocalConfig(_0x432071, _0x5d1056, _0x4e2b15); + _0x433d1d.peers[_0x5d1056] = new _0x4c6fdb(_0x521a09); + }, this.renegotiatePeer = function(_0xf6c803, _0x597405, _0x29d9b2) { + if (_0x433d1d.peers[_0xf6c803]) { + _0x597405 || (_0x597405 = {}), _0x597405.renegotiatingPeer = true, _0x597405.peerRef = _0x433d1d.peers[_0xf6c803].peer, _0x597405.channels = _0x433d1d.peers[_0xf6c803].channels; + var _0x521a09 = this.getLocalConfig(_0x29d9b2, _0xf6c803, _0x597405); + _0x433d1d.peers[_0xf6c803] = new _0x4c6fdb(_0x521a09); + } else _0x433d1d.enableLogs && console.error('Peer (' + _0xf6c803 + ') does not exist. Renegotiation skipped.'); + }, this.replaceTrack = function(_0x110184, _0x52c3ce, _0x25f6eb) { + if (!_0x433d1d.peers[_0x52c3ce]) throw 'This peer (' + _0x52c3ce + ') does not exist.'; + var _0x521a09 = _0x433d1d.peers[_0x52c3ce].peer; + _0x521a09.getSenders && 'function' == typeof _0x521a09.getSenders && _0x521a09.getSenders().length ? _0x521a09.getSenders().forEach(function(_0x96ed5f) { + _0x25f6eb && 'video' === _0x96ed5f.track.kind && (_0x433d1d.peers[_0x52c3ce].peer.lastVideoTrack = _0x96ed5f.track, _0x96ed5f.replaceTrack(_0x110184)), _0x25f6eb || 'audio' !== _0x96ed5f.track.kind || (_0x433d1d.peers[_0x52c3ce].peer.lastAudioTrack = _0x96ed5f.track, _0x96ed5f.replaceTrack(_0x110184)); + }) : (console.warn('RTPSender.replaceTrack is NOT supported.'), this.renegotiatePeer(_0x52c3ce)); + }, this.onNegotiationNeeded = function(_0x33db7a, _0x5f4a7c) {}, this.addNegotiatedMessage = function(_0x1d484a, _0x448bd9) { + if (_0x1d484a.type && _0x1d484a.sdp) return 'answer' == _0x1d484a.type && _0x433d1d.peers[_0x448bd9] && _0x433d1d.peers[_0x448bd9].addRemoteSdp(_0x1d484a), 'offer' == _0x1d484a.type && (_0x1d484a.renegotiatingPeer ? this.renegotiatePeer(_0x448bd9, null, _0x1d484a) : this.createAnsweringPeer(_0x1d484a, _0x448bd9)), void(_0x433d1d.enableLogs && console.log('Remote peer\x27s sdp:', _0x1d484a.sdp)); + if (_0x1d484a.candidate) return _0x433d1d.peers[_0x448bd9] && _0x433d1d.peers[_0x448bd9].addRemoteCandidate(_0x1d484a), void(_0x433d1d.enableLogs && console.log('Remote peer\'s candidate pairs:', _0x1d484a.candidate)); + if (_0x1d484a.enableMedia) { + _0x433d1d.session = _0x1d484a.userPreferences.session || _0x433d1d.session, _0x433d1d.session.oneway && _0x433d1d.attachStreams.length && (_0x433d1d.attachStreams = []), _0x1d484a.userPreferences.isDataOnly && _0x433d1d.attachStreams.length && (_0x433d1d.attachStreams.length = []); + var _0x521a09 = {}; + _0x433d1d.attachStreams.forEach(function(_0x549219) { + _0x521a09[_0x549219.streamid] = { + 'isAudio': !!_0x549219.isAudio, + 'isVideo': !!_0x549219.isVideo, + 'isScreen': !!_0x549219.isScreen + }; + }), _0x1d484a.userPreferences.streamsToShare = _0x521a09, _0x326931.onNegotiationNeeded({ + 'readyForOffer': true, + 'userPreferences': _0x1d484a.userPreferences + }, _0x448bd9); + } + _0x1d484a.readyForOffer && _0x433d1d.onReadyForOffer(_0x448bd9, _0x1d484a.userPreferences); + }, this.onGettingRemoteMedia = function(_0x1d2a39, _0x50fcf9) {}, this.onRemovingRemoteMedia = function(_0x2c048b, _0x238637) {}, this.onGettingLocalMedia = function(_0x10860a) {}, this.onLocalMediaError = function(_0x33725e, _0x45b7ee) { + _0x433d1d.onMediaError(_0x33725e, _0x45b7ee); + }; + var _0x521a09 = new _0x342039(_0x433d1d); + this.onDataChannelMessage = function(_0x5f266f, _0x384695) { + _0x521a09.receive(JSON.parse(_0x5f266f), _0x384695, _0x433d1d.peers[_0x384695] ? _0x433d1d.peers[_0x384695].extra : {}); + }, this.onDataChannelClosed = function(_0x5448c4, _0x5c5d37) { + _0x5448c4.userid = _0x5c5d37, _0x5448c4.extra = _0x433d1d.peers[_0x5c5d37] ? _0x433d1d.peers[_0x5c5d37].extra : {}, _0x433d1d.onclose(_0x5448c4); + }, this.onDataChannelError = function(_0x2a9d6, _0x55de25) { + _0x2a9d6.userid = _0x55de25, event.extra = _0x433d1d.peers[_0x55de25] ? _0x433d1d.peers[_0x55de25].extra : {}, _0x433d1d.onerror(_0x2a9d6); + }, this.onDataChannelOpened = function(_0x5d5514, _0x255c92) { + _0x433d1d.peers[_0x255c92].channels.length ? _0x433d1d.peers[_0x255c92].channels = [_0x5d5514] : (_0x433d1d.peers[_0x255c92].channels.push(_0x5d5514), _0x433d1d.onopen({ + 'userid': _0x255c92, + 'extra': _0x433d1d.peers[_0x255c92] ? _0x433d1d.peers[_0x255c92].extra : {}, + 'channel': _0x5d5514 + })); + }, this.onPeerStateChanged = function(_0x463911) { + _0x433d1d.onPeerStateChanged(_0x463911); + }, this.onNegotiationStarted = function(_0x134c39, _0x554768) {}, this.onNegotiationCompleted = function(_0x40ab4e, _0x24f174) {}, this.getRemoteStreams = function(_0x196151) { + return _0x196151 = _0x196151 || _0x433d1d.peers.getAllParticipants()[0x0], _0x433d1d.peers[_0x196151] ? _0x433d1d.peers[_0x196151].streams : []; + }; + } + + function _0x121233(_0x421b61, _0x4c65b9, _0x1382be) { + if ('undefined' != typeof CustomEvent) { + var _0x21b268 = new CustomEvent(_0x4c65b9, { + 'arguments': _0x1382be, + '__exposedProps__': _0x1382be + }); + _0x421b61.dispatchEvent(_0x21b268); + } + } + + function _0x57b754(_0x51d3ee, _0x17d2b8) { + _0x17d2b8.stream && _0x17d2b8.stream && _0x17d2b8.stream.addEventListener && (_0x17d2b8.stream.addEventListener('mute', function(_0x20fbf4) { + (_0x20fbf4 = _0x51d3ee.streamEvents[_0x17d2b8.streamid]).session = { + 'audio': 'audio' === _0x20fbf4.muteType, + 'video': 'video' === _0x20fbf4.muteType + }, _0x51d3ee.onmute(_0x20fbf4); + }, !0x1), _0x17d2b8.stream.addEventListener('unmute', function(_0x5b824c) { + (_0x5b824c = _0x51d3ee.streamEvents[_0x17d2b8.streamid]).session = { + 'audio': 'audio' === _0x5b824c.unmuteType, + 'video': 'video' === _0x5b824c.unmuteType + }, _0x51d3ee.onunmute(_0x5b824c); + }, !0x1)); + } + + function _0x5b8d5d() { + if (window.crypto && window.crypto.getRandomValues && -0x1 === navigator.userAgent.indexOf('Safari')) { + for (var _0x1056a5 = window.crypto.getRandomValues(new Uint32Array(0x3)), _0x326931 = '', _0x2fa590 = 0x0, _0x21b268 = _0x1056a5.length; _0x2fa590 < _0x21b268; _0x2fa590++) _0x326931 += _0x1056a5[_0x2fa590].toString(0x24); + return _0x326931; + } + return (Math.random() * new Date().getTime()).toString(0x24).replace(/\./g, ''); + } + + function _0x412d65(_0x385896, _0x40a9c8, _0x449aca) { + if (_0x449aca.autoCreateMediaElement) { + var _0x21b268 = !0x1; + _0x2cbba5(_0x385896, 'video').length || _0x385896.isVideo || _0x385896.isScreen || (_0x21b268 = true), 'Firefox' === DetectRTC.browser.name && (_0x449aca.session.video || _0x449aca.session.screen) && (_0x21b268 = !0x1); + var _0x521a09 = document.createElement(_0x21b268 ? 'audio' : 'video'); + _0x521a09.srcObject = _0x385896; + try { + _0x521a09.setAttributeNode(document.createAttribute('autoplay')), _0x521a09.setAttributeNode(document.createAttribute('playsinline')), _0x521a09.setAttributeNode(document.createAttribute('controls')); + } catch (_0x1440db) { + _0x521a09.setAttribute('autoplay', true), _0x521a09.setAttribute('playsinline', true), _0x521a09.setAttribute('controls', true); + } + if ('Firefox' === DetectRTC.browser.name) { + var _0x5e279f = 'ended'; + 'oninactive' in _0x521a09 && (_0x5e279f = 'inactive'), _0x521a09.addEventListener(_0x5e279f, function() { + if (currentUserMediaRequest.remove(_0x385896.idInstance), 'local' === _0x385896.type) { + _0x5e279f = 'ended', 'oninactive' in _0x385896 && (_0x5e279f = 'inactive'), _0x25e82e.onSyncNeeded(_0x385896.streamid, _0x5e279f), _0x449aca.attachStreams.forEach(function(_0x30209b, _0x17c711) { + _0x385896.streamid === _0x30209b.streamid && delete _0x449aca.attachStreams[_0x17c711]; + }); + var _0x40a9c8 = []; + _0x449aca.attachStreams.forEach(function(_0x2dbc3e) { + _0x2dbc3e && _0x40a9c8.push(_0x2dbc3e); + }), _0x449aca.attachStreams = _0x40a9c8; + var _0x21b268 = _0x449aca.streamEvents[_0x385896.streamid]; + if (_0x21b268) return void _0x449aca.onstreamended(_0x21b268); + this.parentNode && this.parentNode.removeChild(this); + } + }, !0x1); + } + var _0x2b737d = _0x521a09.play(); + if (void 0x0 !== _0x2b737d) { + var _0x1e20a0 = !0x1; + setTimeout(function() { + _0x1e20a0 || (_0x1e20a0 = true, _0x40a9c8(_0x521a09)); + }, 0x3e8), _0x2b737d.then(function() { + _0x1e20a0 || (_0x1e20a0 = true, _0x40a9c8(_0x521a09)); + }).catch(function(_0x336a06) { + _0x1e20a0 || (_0x1e20a0 = true, _0x40a9c8(_0x521a09)); + }); + } else _0x40a9c8(_0x521a09); + } else _0x40a9c8({}); + } + + function _0x1cbceb(_0x84132f, _0xd43fb8) { + window.removeEventListener(_0x84132f, _0xd43fb8), window.addEventListener(_0x84132f, _0xd43fb8, !0x1); + } + + function _0xf3acd(_0x3d2706) { + var _0x326931 = []; + return _0x3d2706.forEach(function(_0x1e0ee0) { + _0x1e0ee0 && _0x326931.push(_0x1e0ee0); + }), _0x326931; + } + + function _0x5deab2(_0x58c43e) { + return !_0x58c43e.audio && !_0x58c43e.video && !_0x58c43e.screen && _0x58c43e.data; + } + + function _0x3b94ab(_0x3fc589) { + return void 0x0 === _0x3fc589; + }(_0x3a9045 = void 0x0 !== _0x21b268 ? _0x21b268 : null) && 'undefined' == typeof window && void 0x0 !== _0x21b268 && (_0x21b268.navigator = { + 'userAgent': 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45', + 'getUserMedia': function() {} + }, _0x21b268.console || (_0x21b268.console = {}), void 0x0 === _0x21b268.console.debug && (_0x21b268.console.debug = _0x21b268.console.info = _0x21b268.console.error = _0x21b268.console.log = _0x21b268.console.log || function() { + console.log(arguments); + }), 'undefined' == typeof document && (_0x3a9045.document = {}, document.createElement = document.captureStream = document.mozCaptureStream = function() { + var _0x1056a5 = { + 'getContext': function() { + return _0x1056a5; + }, + 'play': function() {}, + 'pause': function() {}, + 'drawImage': function() {}, + 'toDataURL': function() { + return ''; + } + }; + return _0x1056a5; + }, document.addEventListener = document.removeEventListener = _0x3a9045.addEventListener = _0x3a9045.removeEventListener = function() {}, _0x3a9045.HTMLVideoElement = _0x3a9045.HTMLMediaElement = function() {}), void 0x0 === 'undefined' == typeof location && (_0x3a9045.location = { + 'protocol': 'file:', + 'href': '', + 'hash': '', + 'origin': 'self' + }), 'undefined' == typeof screen && (_0x3a9045.screen = { + 'width': 0x0, + 'height': 0x0 + }), 'undefined' == typeof URL && (_0x3a9045.URL = { + 'createObjectURL': function() { + return ''; + }, + 'revokeObjectURL': function() { + return ''; + } + }), _0x3a9045.window = _0x21b268), + function() { + var _0x1056a5 = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45'; + if (_0x3f6d71 = 'object' === (void 0x0 === _0x521a09 ? 'undefined' : _0x4ffbab(_0x521a09)) && 'object' === _0x4ffbab(_0x521a09.versions) && _0x521a09.versions.node && !_0x521a09.browser) { + var _0x326931 = _0x521a09.versions.node.toString().replace('v', ''); + _0x1056a5 = 'Nodejs/' + _0x326931 + ' (NodeOS) AppleWebKit/' + _0x326931 + ' (KHTML, like Gecko) Nodejs/' + _0x326931 + ' Nodejs/' + _0x326931; + }! function(_0x3f410a) { + 'undefined' == typeof window && ('undefined' == typeof window && void 0x0 !== _0x21b268 && (_0x21b268.navigator = { + 'userAgent': _0x1056a5, + 'getUserMedia': function() {} + }, _0x3f410a.window = _0x21b268), 'undefined' == typeof location && (_0x3f410a.location = { + 'protocol': 'file:', + 'href': '', + 'hash': '' + }), 'undefined' == typeof screen && (_0x3f410a.screen = { + 'width': 0x0, + 'height': 0x0 + })); + }(void 0x0 !== _0x21b268 ? _0x21b268 : window); + var _0xd38ed = window.navigator; + void 0x0 !== _0xd38ed ? (void 0x0 !== _0xd38ed.webkitGetUserMedia && (_0xd38ed.getUserMedia = _0xd38ed.webkitGetUserMedia), void 0x0 !== _0xd38ed.mozGetUserMedia && (_0xd38ed.getUserMedia = _0xd38ed.mozGetUserMedia)) : _0xd38ed = { + 'getUserMedia': function() {}, + 'userAgent': _0x1056a5 + }; + var _0x4aed46 = !!/Android|webOS|iPhone|iPad|iPod|BB10|BlackBerry|IEMobile|Opera Mini|Mobile|mobile/i .test(_0xd38ed.userAgent || ''), + _0x4ba312 = !(-0x1 === _0xd38ed.userAgent.indexOf('Edge') || !_0xd38ed.msSaveOrOpenBlob && !_0xd38ed.msSaveBlob), + _0xa57f33 = !!window.opera || _0xd38ed.userAgent.indexOf(' OPR/') >= 0x0, + _0x111853 = void 0x0 !== window.InstallTrigger, + _0x2920ae = /^((?!chrome|android).)*safari/i .test(_0xd38ed.userAgent), + _0x5e24f4 = !!window.chrome && !_0xa57f33, + _0x566860 = 'undefined' != typeof document && !!document.documentMode && !_0x4ba312; + + function _0x8a78df(_0x409296, _0x319fb9) { + var _0x2fa590 = 0x0, + _0x21b268 = !0x1, + _0x521a09 = window.setInterval(function() { + _0x409296() && (window.clearInterval(_0x521a09), _0x319fb9(_0x21b268)), _0x2fa590++ > 0x32 && (window.clearInterval(_0x521a09), _0x319fb9(_0x21b268 = true)); + }, 0xa); + } + var _0x25725b = { + 'Android': function() { + return _0xd38ed.userAgent.match(/Android/i); + }, + 'BlackBerry': function() { + return _0xd38ed.userAgent.match(/BlackBerry|BB10/i); + }, + 'iOS': function() { + return _0xd38ed.userAgent.match(/iPhone|iPad|iPod/i); + }, + 'Opera': function() { + return _0xd38ed.userAgent.match(/Opera Mini/i); + }, + 'Windows': function() { + return _0xd38ed.userAgent.match(/IEMobile/i); + }, + 'any': function() { + return _0x25725b.Android() || _0x25725b.BlackBerry() || _0x25725b.iOS() || _0x25725b.Opera() || _0x25725b.Windows(); + }, + 'getOsName': function() { + var _0x1056a5 = 'Unknown OS'; + return _0x25725b.Android() && (_0x1056a5 = 'Android'), _0x25725b.BlackBerry() && (_0x1056a5 = 'BlackBerry'), _0x25725b.iOS() && (_0x1056a5 = 'iOS'), _0x25725b.Opera() && (_0x1056a5 = 'Opera Mini'), _0x25725b.Windows() && (_0x1056a5 = 'Windows'), _0x1056a5; + } + }; + var _0xfabbbb = 'Unknown OS', + _0x533b2e = 'Unknown OS Version'; + var _0x373254, _0x3c966e, _0x47d25f = function() { + for (var _0x1056a5, _0x326931 = _0xd38ed.appVersion, _0x2fa590 = _0xd38ed.userAgent, _0x21b268 = '-', _0x521a09 = [{ + 's': 'Windows 10', + 'r': /(Windows 10.0|Windows NT 10.0)/ + }, { + 's': 'Windows 8.1', + 'r': /(Windows 8.1|Windows NT 6.3)/ + }, { + 's': 'Windows 8', + 'r': /(Windows 8|Windows NT 6.2)/ + }, { + 's': 'Windows 7', + 'r': /(Windows 7|Windows NT 6.1)/ + }, { + 's': 'Windows Vista', + 'r': /Windows NT 6.0/ + }, { + 's': 'Windows Server 2003', + 'r': /Windows NT 5.2/ + }, { + 's': 'Windows XP', + 'r': /(Windows NT 5.1|Windows XP)/ + }, { + 's': 'Windows 2000', + 'r': /(Windows NT 5.0|Windows 2000)/ + }, { + 's': 'Windows ME', + 'r': /(Win 9x 4.90|Windows ME)/ + }, { + 's': 'Windows 98', + 'r': /(Windows 98|Win98)/ + }, { + 's': 'Windows 95', + 'r': /(Windows 95|Win95|Windows_95)/ + }, { + 's': 'Windows NT 4.0', + 'r': /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/ + }, { + 's': 'Windows CE', + 'r': /Windows CE/ + }, { + 's': 'Windows 3.11', + 'r': /Win16/ + }, { + 's': 'Android', + 'r': /Android/ + }, { + 's': 'Open BSD', + 'r': /OpenBSD/ + }, { + 's': 'Sun OS', + 'r': /SunOS/ + }, { + 's': 'Linux', + 'r': /(Linux|X11)/ + }, { + 's': 'iOS', + 'r': /(iPhone|iPad|iPod)/ + }, { + 's': 'Mac OS X', + 'r': /Mac OS X/ + }, { + 's': 'Mac OS', + 'r': /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ + }, { + 's': 'QNX', + 'r': /QNX/ + }, { + 's': 'UNIX', + 'r': /UNIX/ + }, { + 's': 'BeOS', + 'r': /BeOS/ + }, { + 's': 'OS/2', + 'r': /OS\/2/ + }, { + 's': 'Search Bot', + 'r': /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ + }], _0x443861 = 0x0; _0x1056a5 = _0x521a09[_0x443861]; _0x443861++) + if (_0x1056a5.r.test(_0x2fa590)) { + _0x21b268 = _0x1056a5.s; + break; + } + var _0x434d96 = '-'; + switch (/Windows/ .test(_0x21b268) && (/Windows (.*)/ .test(_0x21b268) && (_0x434d96 = /Windows (.*)/ .exec(_0x21b268)[0x1]), _0x21b268 = 'Windows'), _0x21b268) { + case 'Mac OS X': + /Mac OS X (10[\.\_\d]+)/ .test(_0x2fa590) && (_0x434d96 = /Mac OS X (10[\.\_\d]+)/ .exec(_0x2fa590)[0x1]); + break; + case 'Android': + /Android ([\.\_\d]+)/ .test(_0x2fa590) && (_0x434d96 = /Android ([\.\_\d]+)/ .exec(_0x2fa590)[0x1]); + break; + case 'iOS': + /OS (\d+)_(\d+)_?(\d+)?/ .test(_0x2fa590) && (_0x434d96 = (_0x434d96 = /OS (\d+)_(\d+)_?(\d+)?/ .exec(_0x326931))[0x1] + '.' + _0x434d96[0x2] + '.' + (0x0 | _0x434d96[0x3])); + } + return { + 'osName': _0x21b268, + 'osVersion': _0x434d96 + }; + }(); + _0x47d25f && _0x47d25f.osName && '-' != _0x47d25f.osName ? (_0xfabbbb = _0x47d25f.osName, _0x533b2e = _0x47d25f.osVersion) : _0x25725b.any() && 'Android' == (_0xfabbbb = _0x25725b.getOsName()) && (_0x533b2e = !!(_0x3c966e = (_0x373254 = (_0x373254 || _0xd38ed.userAgent).toLowerCase()).match(/android\s([0-9\.]*)/)) && _0x3c966e[0x1]); + var _0x3f6d71 = 'object' === (void 0x0 === _0x521a09 ? 'undefined' : _0x4ffbab(_0x521a09)) && 'object' === _0x4ffbab(_0x521a09.versions) && _0x521a09.versions.node; + 'Unknown OS' === _0xfabbbb && _0x3f6d71 && (_0xfabbbb = 'Nodejs', _0x533b2e = _0x521a09.versions.node.toString().replace('v', '')); + var _0x233149 = !0x1, + _0x467217 = !0x1; + ['captureStream', 'mozCaptureStream', 'webkitCaptureStream'].forEach(function(_0x2dba73) { + 'undefined' != typeof document && 'function' == typeof document.createElement && (!_0x233149 && _0x2dba73 in document.createElement('canvas') && (_0x233149 = true), !_0x467217 && _0x2dba73 in document.createElement('video') && (_0x467217 = true)); + }); + var _0x327730 = /^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/, + _0x39bfae = /([0-9]{1,3}(\.[0-9]{1,3}){3})/, + _0xe1f7d = /[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}/; + var _0x37c2dd = [], + _0x47e1c4 = [], + _0x1e709a = [], + _0x536d10 = []; + _0xd38ed.mediaDevices && _0xd38ed.mediaDevices.enumerateDevices && (_0xd38ed.enumerateDevices = function(_0x101328) { + var _0x326931 = _0xd38ed.mediaDevices.enumerateDevices(); + _0x326931 && _0x326931.then ? _0xd38ed.mediaDevices.enumerateDevices().then(_0x101328).catch(function() { + _0x101328([]); + }) : _0x101328([]); + }); + var _0x1ec78f = !0x1; + void 0x0 !== _0x1d01b4 && 'getSources' in _0x1d01b4 ? _0x1ec78f = true : _0xd38ed.mediaDevices && _0xd38ed.mediaDevices.enumerateDevices && (_0x1ec78f = true); + var _0x1e6405 = !0x1, + _0x20f7ce = !0x1, + _0x528a8d = !0x1, + _0x242003 = !0x1, + _0x1583d5 = !0x1; + + function _0x5a290a(_0x5b8353) { + if (_0x1ec78f) + if (!_0xd38ed.enumerateDevices && window.MediaStreamTrack && window.MediaStreamTrack.getSources && (_0xd38ed.enumerateDevices = window.MediaStreamTrack.getSources.bind(window.MediaStreamTrack)), !_0xd38ed.enumerateDevices && _0xd38ed.enumerateDevices && (_0xd38ed.enumerateDevices = _0xd38ed.enumerateDevices.bind(_0xd38ed)), _0xd38ed.enumerateDevices) { + _0x37c2dd = [], _0x47e1c4 = [], _0x1e709a = [], _0x536d10 = [], _0x1e6405 = !0x1, _0x20f7ce = !0x1, _0x528a8d = !0x1, _0x242003 = !0x1, _0x1583d5 = !0x1; + var _0x326931 = {}; + _0xd38ed.enumerateDevices(function(_0x11a0f9) { + _0x11a0f9.forEach(function(_0x210fa4) { + var _0x11a0f9 = {}; + for (var _0x21b268 in _0x210fa4) try { + 'function' != typeof _0x210fa4[_0x21b268] && (_0x11a0f9[_0x21b268] = _0x210fa4[_0x21b268]); + } catch (_0x1914ff) {} + _0x326931[_0x11a0f9.deviceId + _0x11a0f9.label + _0x11a0f9.kind] || ('audio' === _0x11a0f9.kind && (_0x11a0f9.kind = 'audioinput'), 'video' === _0x11a0f9.kind && (_0x11a0f9.kind = 'videoinput'), _0x11a0f9.deviceId || (_0x11a0f9.deviceId = _0x11a0f9.id), _0x11a0f9.id || (_0x11a0f9.id = _0x11a0f9.deviceId), _0x11a0f9.label ? ('videoinput' !== _0x11a0f9.kind || _0x1583d5 || (_0x1583d5 = true), 'audioinput' !== _0x11a0f9.kind || _0x242003 || (_0x242003 = true)) : (_0x11a0f9.isCustomLabel = true, 'videoinput' === _0x11a0f9.kind ? _0x11a0f9.label = 'Camera ' + (_0x536d10.length + 0x1) : 'audioinput' === _0x11a0f9.kind ? _0x11a0f9.label = 'Microphone ' + (_0x47e1c4.length + 0x1) : 'audiooutput' === _0x11a0f9.kind ? _0x11a0f9.label = 'Speaker ' + (_0x1e709a.length + 0x1) : _0x11a0f9.label = 'Please invoke getUserMedia once.', void 0x0 !== _0x444319 && _0x444319.browser.isChrome && _0x444319.browser.version >= 0x2e && !/^(https:|chrome-extension:)$/g .test(location.protocol || '') && 'undefined' != typeof document && 'string' == typeof document.domain && document.domain.search && -0x1 === document.domain.search(/localhost|127.0./g) && (_0x11a0f9.label = 'HTTPs is required to get label of this ' + _0x11a0f9.kind + ' device.')), 'audioinput' === _0x11a0f9.kind && (_0x1e6405 = true, -0x1 === _0x47e1c4.indexOf(_0x11a0f9) && _0x47e1c4.push(_0x11a0f9)), 'audiooutput' === _0x11a0f9.kind && (_0x20f7ce = true, -0x1 === _0x1e709a.indexOf(_0x11a0f9) && _0x1e709a.push(_0x11a0f9)), 'videoinput' === _0x11a0f9.kind && (_0x528a8d = true, -0x1 === _0x536d10.indexOf(_0x11a0f9) && _0x536d10.push(_0x11a0f9)), _0x37c2dd.push(_0x11a0f9), _0x326931[_0x11a0f9.deviceId + _0x11a0f9.label + _0x11a0f9.kind] = _0x11a0f9); + }), void 0x0 !== _0x444319 && (_0x444319.MediaDevices = _0x37c2dd, _0x444319.hasMicrophone = _0x1e6405, _0x444319.hasSpeakers = _0x20f7ce, _0x444319.hasWebcam = _0x528a8d, _0x444319.isWebsiteHasWebcamPermissions = _0x1583d5, _0x444319.isWebsiteHasMicrophonePermissions = _0x242003, _0x444319.audioInputDevices = _0x47e1c4, _0x444319.audioOutputDevices = _0x1e709a, _0x444319.videoInputDevices = _0x536d10), _0x5b8353 && _0x5b8353(); + }); + } else _0x5b8353 && _0x5b8353(); + else _0x5b8353 && _0x5b8353(); + } + var _0x444319 = window.DetectRTC || {}; + _0x444319.browser = function() { + _0xd38ed.appVersion; + var _0x1056a5, _0x326931, _0x2fa590, _0x21b268 = _0xd38ed.userAgent, + _0x521a09 = _0xd38ed.appName, + _0x441e45 = '' + parseFloat(_0xd38ed.appVersion), + _0x174a5c = parseInt(_0xd38ed.appVersion, 0xa); + if (_0x2920ae && !_0x5e24f4 && -0x1 !== _0x21b268.indexOf('CriOS') && (_0x2920ae = !0x1, _0x5e24f4 = true), _0xa57f33) { + _0x521a09 = 'Opera'; + try { + _0x174a5c = (_0x441e45 = _0xd38ed.userAgent.split('OPR/')[0x1].split(' ')[0x0]).split('.')[0x0]; + } catch (_0xbb1615) { + _0x441e45 = '0.0.0.0', _0x174a5c = 0x0; + } + } else _0x566860 ? ((_0x326931 = _0x21b268.indexOf('rv:')) > 0x0 ? _0x441e45 = _0x21b268.substring(_0x326931 + 0x3) : (_0x326931 = _0x21b268.indexOf('MSIE'), _0x441e45 = _0x21b268.substring(_0x326931 + 0x5)), _0x521a09 = 'IE') : _0x5e24f4 ? (_0x326931 = _0x21b268.indexOf('Chrome'), _0x521a09 = 'Chrome', _0x441e45 = _0x21b268.substring(_0x326931 + 0x7)) : _0x2920ae ? (_0x326931 = _0x21b268.indexOf('Safari'), _0x521a09 = 'Safari', _0x441e45 = _0x21b268.substring(_0x326931 + 0x7), -0x1 !== (_0x326931 = _0x21b268.indexOf('Version')) && (_0x441e45 = _0x21b268.substring(_0x326931 + 0x8)), -0x1 !== _0xd38ed.userAgent.indexOf('Version/') && (_0x441e45 = _0xd38ed.userAgent.split('Version/')[0x1].split(' ')[0x0])) : _0x111853 ? (_0x326931 = _0x21b268.indexOf('Firefox'), _0x521a09 = 'Firefox', _0x441e45 = _0x21b268.substring(_0x326931 + 0x8)) : (_0x1056a5 = _0x21b268.lastIndexOf(' ') + 0x1) < (_0x326931 = _0x21b268.lastIndexOf('/')) && (_0x521a09 = _0x21b268.substring(_0x1056a5, _0x326931), _0x441e45 = _0x21b268.substring(_0x326931 + 0x1), _0x521a09.toLowerCase() === _0x521a09.toUpperCase() && (_0x521a09 = _0xd38ed.appName)); + return _0x4ba312 && (_0x521a09 = 'Edge', _0x441e45 = _0xd38ed.userAgent.split('Edge/')[0x1]), -0x1 !== (_0x2fa590 = _0x441e45.search(/[; \)]/)) && (_0x441e45 = _0x441e45.substring(0x0, _0x2fa590)), _0x174a5c = parseInt('' + _0x441e45, 0xa), isNaN(_0x174a5c) && (_0x441e45 = '' + parseFloat(_0xd38ed.appVersion), _0x174a5c = parseInt(_0xd38ed.appVersion, 0xa)), { + 'fullVersion': _0x441e45, + 'version': _0x174a5c, + 'name': _0x521a09, + 'isPrivateBrowsing': !0x1 + }; + }(), + function(_0xbf5986) { + var _0x326931; + try { + if (window.webkitRequestFileSystem) window.webkitRequestFileSystem(window.TEMPORARY, 0x1, function() { + _0x326931 = !0x1; + }, function(_0x57feb9) { + _0x326931 = true; + }); + else if (window.indexedDB && /Firefox/ .test(window.navigator.userAgent)) { + var _0x2fa590; + try { + (_0x2fa590 = window.indexedDB.open('test')).onerror = function() { + return true; + }; + } catch (_0xe0bac4) { + _0x326931 = true; + } + void 0x0 === _0x326931 && _0x8a78df(function() { + return 'done' === _0x2fa590.readyState; + }, function(_0x236923) { + _0x236923 || (_0x326931 = !_0x2fa590.result); + }); + } else if (function(_0x8e13f) { + var _0x326931 = _0x8e13f.toLowerCase(); + if (0x0 === _0x326931.indexOf('msie') && 0x0 === _0x326931.indexOf('trident')) return !0x1; + var _0x2fa590 = /(?:msie|rv:)\s?([\d\.]+)/ .exec(_0x326931); + return !!(_0x2fa590 && parseInt(_0x2fa590[0x1], 0xa) >= 0xa); + }(window.navigator.userAgent)) { + _0x326931 = !0x1; + try { + window.indexedDB || (_0x326931 = true); + } catch (_0x4d0f1c) { + _0x326931 = true; + } + } else if (window.localStorage && /Safari/ .test(window.navigator.userAgent)) { + try { + window.localStorage.setItem('test', 0x1); + } catch (_0x217100) { + _0x326931 = true; + } + void 0x0 === _0x326931 && (_0x326931 = !0x1, window.localStorage.removeItem('test')); + } + } catch (_0x54458d) { + _0x326931 = !0x1; + } + _0x8a78df(function() { + return void 0x0 !== _0x326931; + }, function(_0x139aa5) { + _0xbf5986(_0x326931); + }); + }(function(_0x82ccf2) { + _0x444319.browser.isPrivateBrowsing = !!_0x82ccf2; + }), _0x444319.browser['is' + _0x444319.browser.name] = true, _0x444319.osName = _0xfabbbb, _0x444319.osVersion = _0x533b2e; + 'object' === (void 0x0 === _0x521a09 ? 'undefined' : _0x4ffbab(_0x521a09)) && 'object' === _0x4ffbab(_0x521a09.versions) && _0x521a09.versions['node-webkit']; + var _0xb774b1 = !0x1; + ['RTCPeerConnection', 'webkitRTCPeerConnection', 'mozRTCPeerConnection', 'RTCIceGatherer'].forEach(function(_0x1a220e) { + _0xb774b1 || _0x1a220e in window && (_0xb774b1 = true); + }), _0x444319.isWebRTCSupported = _0xb774b1, _0x444319.isORTCSupported = 'undefined' != typeof RTCIceGatherer; + var _0x20eef3 = !0x1; + (_0x444319.browser.isChrome && _0x444319.browser.version >= 0x23 ? _0x20eef3 = true : _0x444319.browser.isFirefox && _0x444319.browser.version >= 0x22 ? _0x20eef3 = true : _0x444319.browser.isEdge && _0x444319.browser.version >= 0x11 ? _0x20eef3 = true : 'Android' === _0x444319.osName && _0x444319.browser.isChrome && (_0x20eef3 = true), /^(https:|chrome-extension:)$/g .test(location.protocol || '')) || ('undefined' != typeof document && 'string' == typeof document.domain && document.domain.search && -0x1 === document.domain.search(/localhost|127.0./g) && (_0x444319.browser.isChrome || _0x444319.browser.isEdge || _0x444319.browser.isOpera) ? _0x20eef3 = !0x1 : _0x444319.browser.isFirefox && (_0x20eef3 = !0x1)); + _0x444319.isScreenCapturingSupported = _0x20eef3; + var _0x41f5bd = { + 'isSupported': !0x1, + 'isCreateMediaStreamSourceSupported': !0x1 + }; + ['AudioContext', 'webkitAudioContext', 'mozAudioContext', 'msAudioContext'].forEach(function(_0x6f8ee8) { + _0x41f5bd.isSupported || _0x6f8ee8 in window && (_0x41f5bd.isSupported = true, window[_0x6f8ee8] && 'createMediaStreamSource' in window[_0x6f8ee8].prototype && (_0x41f5bd.isCreateMediaStreamSourceSupported = true)); + }), _0x444319.isAudioContextSupported = _0x41f5bd.isSupported, _0x444319.isCreateMediaStreamSourceSupported = _0x41f5bd.isCreateMediaStreamSourceSupported; + var _0x3c8f54 = !0x1; + _0x444319.browser.isChrome && _0x444319.browser.version > 0x1f && (_0x3c8f54 = true), _0x444319.isRtpDataChannelsSupported = _0x3c8f54; + var _0x4e0543 = !0x1; + _0x444319.browser.isFirefox && _0x444319.browser.version > 0x1c ? _0x4e0543 = true : _0x444319.browser.isChrome && _0x444319.browser.version > 0x19 ? _0x4e0543 = true : _0x444319.browser.isOpera && _0x444319.browser.version >= 0xb && (_0x4e0543 = true), _0x444319.isSctpDataChannelsSupported = _0x4e0543, _0x444319.isMobileDevice = _0x4aed46; + var _0x27c37d = !0x1; + _0xd38ed.getUserMedia ? _0x27c37d = true : _0xd38ed.mediaDevices && _0xd38ed.mediaDevices.getUserMedia && (_0x27c37d = true), _0x444319.browser.isChrome && _0x444319.browser.version >= 0x2e && !/^(https:|chrome-extension:)$/g .test(location.protocol || '') && 'undefined' != typeof document && 'string' == typeof document.domain && document.domain.search && -0x1 === document.domain.search(/localhost|127.0./g) && (_0x27c37d = 'Requires HTTPs'), 'Nodejs' === _0x444319.osName && (_0x27c37d = !0x1), _0x444319.isGetUserMediaSupported = _0x27c37d; + var _0x5d3017, _0x4c1193, _0x5997d1, _0x4bd937 = ''; + screen.width && (_0x4bd937 += (screen.width ? screen.width : '') + ' x ' + (screen.height ? screen.height : '')); + _0x444319.displayResolution = _0x4bd937, _0x444319.displayAspectRatio = (_0x5d3017 = screen.width, _0x4c1193 = screen.height, _0x5997d1 = function _0x1056a5(_0x9f77a2, _0x157ff4) { + return 0x0 == _0x157ff4 ? _0x9f77a2 : _0x1056a5(_0x157ff4, _0x9f77a2 % _0x157ff4); + }(_0x5d3017, _0x4c1193), _0x5d3017 / _0x5997d1 / (_0x4c1193 / _0x5997d1)).toFixed(0x2), _0x444319.isCanvasSupportsStreamCapturing = _0x233149, _0x444319.isVideoSupportsStreamCapturing = _0x467217, 'Chrome' == _0x444319.browser.name && _0x444319.browser.version >= 0x35 && (_0x444319.isCanvasSupportsStreamCapturing || (_0x444319.isCanvasSupportsStreamCapturing = 'Requires chrome flag: enable-experimental-web-platform-features'), _0x444319.isVideoSupportsStreamCapturing || (_0x444319.isVideoSupportsStreamCapturing = 'Requires chrome flag: enable-experimental-web-platform-features')), _0x444319.DetectLocalIPAddress = function(_0x527d6a, _0x3e6338) { + if (_0x444319.isWebRTCSupported) { + var _0x2fa590 = true, + _0x21b268 = true; + ! function(_0x169ed4, _0x457465) { + if ('undefined' == typeof document || 'function' != typeof document.getElementById) return; + var _0x2fa590 = {}, + _0x21b268 = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; + if (!_0x21b268) { + var _0x521a09 = document.getElementById('iframe'); + if (!_0x521a09) return; + var _0x57dce2 = _0x521a09.contentWindow; + _0x21b268 = _0x57dce2.RTCPeerConnection || _0x57dce2.mozRTCPeerConnection || _0x57dce2.webkitRTCPeerConnection; + } + if (!_0x21b268) return; + var _0x1ebe24 = null; + 'Chrome' === _0x444319.browser && _0x444319.browser.version < 0x3a && (_0x1ebe24 = { + 'optional': [{ + 'RtpDataChannels': true + }] + }); + var _0x355289 = new _0x21b268({ + 'iceServers': [{ + 'urls': 'stun:stun.l.google.com:19302' + }] + }, _0x1ebe24); + _0x457465 && (_0x355289.addStream ? _0x355289.addStream(_0x457465) : _0x355289.addTrack && _0x457465.getTracks()[0x0] && _0x355289.addTrack(_0x457465.getTracks()[0x0], _0x457465)); + + function _0x367cf9(_0x23abd1) { + var _0x21b268 = _0x39bfae.exec(_0x23abd1); + if (_0x21b268) { + var _0x521a09 = _0x21b268[0x1], + _0x2faf0b = _0x23abd1.match(_0x327730); + void 0x0 === _0x2fa590[_0x521a09] && _0x169ed4(_0x521a09, _0x2faf0b, true), _0x2fa590[_0x521a09] = true; + } + } + if (_0x355289.onicecandidate = function(_0xd7031e) { + _0xd7031e.candidate && _0x367cf9(_0xd7031e.candidate.candidate); + }, !_0x457465) try { + _0x355289.createDataChannel('sctp', {}); + } catch (_0x1edf47) {} + _0x444319.isPromisesSupported ? _0x355289.createOffer().then(function(_0xedec09) { + _0x355289.setLocalDescription(_0xedec09).then(_0x45699b); + }) : _0x355289.createOffer(function(_0xf8592b) { + _0x355289.setLocalDescription(_0xf8592b, _0x45699b, function() {}); + }, function() {}); + + function _0x45699b() { + _0x355289.localDescription.sdp.split('\n').forEach(function(_0x4e78ca) { + 0x0 === _0x4e78ca.indexOf('a=candidate:') && _0x367cf9(_0x4e78ca); + }); + } + }(function(_0x2a2630) { + _0x2a2630.match(_0x327730) ? _0x527d6a('Local: ' + _0x2a2630, _0x2fa590 = !0x1, _0x21b268) : _0x2a2630.match(_0xe1f7d) ? _0x527d6a('Public: ' + _0x2a2630, _0x2fa590, _0x21b268 = !0x1) : _0x527d6a('Public: ' + _0x2a2630, _0x2fa590, _0x21b268); + }, _0x3e6338); + } + }, _0x444319.isWebSocketsSupported = 'WebSocket' in window && 0x2 === window.WebSocket.CLOSING, _0x444319.isWebSocketsBlocked = !_0x444319.isWebSocketsSupported, 'Nodejs' === _0x444319.osName && (_0x444319.isWebSocketsSupported = true, _0x444319.isWebSocketsBlocked = !0x1), _0x444319.checkWebSocketsSupport = function(_0x1102a1) { + _0x1102a1 = _0x1102a1 || function() {}; + try { + var _0x326931, _0x2fa590 = new WebSocket('wss://echo.websocket.org:443/'); + _0x2fa590.onopen = function() { + _0x444319.isWebSocketsBlocked = !0x1, _0x326931 = new Date().getTime(), _0x2fa590.send('ping'); + }, _0x2fa590.onmessage = function() { + _0x444319.WebsocketLatency = new Date().getTime() - _0x326931 + 'ms', _0x1102a1(), _0x2fa590.close(), _0x2fa590 = null; + }, _0x2fa590.onerror = function() { + _0x444319.isWebSocketsBlocked = true, _0x1102a1(); + }; + } catch (_0x11ac18) { + _0x444319.isWebSocketsBlocked = true, _0x1102a1(); + } + }, _0x444319.load = function(_0x83e5e9) { + _0x5a290a(_0x83e5e9 = _0x83e5e9 || function() {}); + }, _0x444319.MediaDevices = void 0x0 !== _0x37c2dd ? _0x37c2dd : [], _0x444319.hasMicrophone = _0x1e6405, _0x444319.hasSpeakers = _0x20f7ce, _0x444319.hasWebcam = _0x528a8d, _0x444319.isWebsiteHasWebcamPermissions = _0x1583d5, _0x444319.isWebsiteHasMicrophonePermissions = _0x242003, _0x444319.audioInputDevices = _0x47e1c4, _0x444319.audioOutputDevices = _0x1e709a, _0x444319.videoInputDevices = _0x536d10; + var _0x5da020 = !0x1; + 'undefined' != typeof document && 'function' == typeof document.createElement && 'setSinkId' in document.createElement('video') && (_0x5da020 = true), _0x444319.isSetSinkIdSupported = _0x5da020; + var _0x1b0b81 = !0x1; + _0x444319.browser.isFirefox && 'undefined' != typeof mozRTCPeerConnection ? 'getSenders' in mozRTCPeerConnection.prototype && (_0x1b0b81 = true) : _0x444319.browser.isChrome && 'undefined' != typeof webkitRTCPeerConnection && 'getSenders' in webkitRTCPeerConnection.prototype && (_0x1b0b81 = true), _0x444319.isRTPSenderReplaceTracksSupported = _0x1b0b81; + var _0x83ded = !0x1; + _0x444319.browser.isFirefox && _0x444319.browser.version > 0x26 && (_0x83ded = true), _0x444319.isRemoteStreamProcessingSupported = _0x83ded; + var _0x51520c = !0x1; + void 0x0 !== _0x1d01b4 && 'applyConstraints' in _0x1d01b4.prototype && (_0x51520c = true), _0x444319.isApplyConstraintsSupported = _0x51520c; + var _0x298a09 = !0x1; + _0x444319.browser.isFirefox && _0x444319.browser.version >= 0x2b && (_0x298a09 = true), _0x444319.isMultiMonitorScreenCapturingSupported = _0x298a09, _0x444319.isPromisesSupported = !!('Promise' in window), _0x444319.version = '1.3.7', void 0x0 === _0x444319 && (window.DetectRTC = {}); + var _0x187d8a = window.MediaStream; + void 0x0 === _0x187d8a && 'undefined' != typeof webkitMediaStream && (_0x187d8a = webkitMediaStream), _0x444319.MediaStream = void 0x0 !== _0x187d8a && 'function' == typeof _0x187d8a && Object.keys(_0x187d8a.prototype), _0x444319.MediaStreamTrack = void 0x0 !== _0x1d01b4 && Object.keys(_0x1d01b4.prototype); + var _0x5898a3 = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; + _0x444319.RTCPeerConnection = void 0x0 !== _0x5898a3 && Object.keys(_0x5898a3.prototype), window.DetectRTC = _0x444319, 'function' == typeof define && _0x2fa590(0x90) && define('DetectRTC', [], function() { + return _0x444319; + }); + }(), 'undefined' != typeof cordova && (DetectRTC.isMobileDevice = true, DetectRTC.browser.name = 'Chrome'), navigator && navigator.userAgent && -0x1 !== navigator.userAgent.indexOf('Crosswalk') && (DetectRTC.isMobileDevice = true, DetectRTC.browser.name = 'Chrome'), window.addEventListener || (window.addEventListener = function(_0x1e341e, _0x410d8a, _0x164ba3) { + _0x1e341e.attachEvent && _0x1e341e.attachEvent('on' + _0x410d8a, _0x164ba3); + }), window.attachEventListener = function(_0x28f783, _0xf32336, _0x5ddd69, _0x1e62b3) { + _0x28f783.addEventListener(_0xf32336, _0x5ddd69, _0x1e62b3); + }; + var _0x1d809b = window.MediaStream; + + function _0x93df62(_0x128905, _0x2d6fa0) { + return (!_0x128905.session.audio || 'two-way' !== _0x128905.session.audio) && ('Firefox' === DetectRTC.browser.name && !0x1 !== _0x2d6fa0 || !('Chrome' !== DetectRTC.browser.name || DetectRTC.browser.version < 0x32) && (true === typeof _0x2d6fa0 || !(void 0x0 !== _0x2d6fa0 || !_0x128905.session.audio || !_0x128905.session.screen || _0x128905.session.video) && (_0x2d6fa0 = true, true))); + } + + function _0x405170(_0x53fd0a) { + return 'Firefox' === DetectRTC.browser.name || 'Chrome' === DetectRTC.browser.name && { + 'mandatory': { + 'chromeMediaSource': _0x53fd0a.mandatory.chromeMediaSource, + 'chromeMediaSourceId': _0x53fd0a.mandatory.chromeMediaSourceId + } + }; + } + + function _0x2cbba5(_0x5f06c5, _0x3f8518) { + return _0x5f06c5 && _0x5f06c5.getTracks ? _0x5f06c5.getTracks().filter(function(_0x12aae8) { + return _0x12aae8.kind === (_0x3f8518 || 'audio'); + }) : []; + } + + function _0x5407aa() { + var _0x1056a5 = !0x1; + try { + if ('undefined' == typeof RTCRtpTransceiver) return !0x1; + if (!('currentDirection' in RTCRtpTransceiver.prototype)) return !0x1; + var _0x326931 = new _0x2a4be1(); + try { + _0x326931.addTransceiver('audio'), _0x1056a5 = true; + } catch (_0x365290) {} + _0x326931.close(); + } catch (_0x4e12a1) { + _0x1056a5 = !0x1; + } + return _0x1056a5 && function() { + var _0x1056a5 = !0x1; + try { + var _0x326931 = new _0x2a4be1({ + 'sdpSemantics': 'unified-plan' + }); + try { + var _0x2fa590 = _0x326931.getConfiguration(); + _0x1056a5 = 'unified-plan' == _0x2fa590.sdpSemantics || (_0x2fa590.sdpSemantics, !0x1); + } catch (_0x1ddaa9) { + _0x1056a5 = !0x1; + } + } catch (_0x30213a) { + _0x1056a5 = !0x1; + } + return _0x1056a5; + }(); + } + + function _0x2eda5b() { + if ('undefined' != typeof cordova && void 0x0 !== cordova.plugins && void 0x0 !== cordova.plugins.iosrtc) { + var _0x1056a5 = cordova.plugins.iosrtc; + window.webkitRTCPeerConnection = _0x1056a5.RTCPeerConnection, window.RTCSessionDescription = _0x1056a5.RTCSessionDescription, window.RTCIceCandidate = _0x1056a5.RTCIceCandidate, window.MediaStream = _0x1056a5.MediaStream, window.MediaStreamTrack = _0x1056a5.MediaStreamTrack, navigator.getUserMedia = navigator.webkitGetUserMedia = _0x1056a5.getUserMedia, _0x1056a5.debug.enable('iosrtc*'), 'function' == typeof _0x1056a5.selectAudioOutput && _0x1056a5.selectAudioOutput(window.iOSDefaultAudioOutputDevice || 'speaker'), _0x1056a5.registerGlobals(); + } + } + void 0x0 === _0x1d809b && 'undefined' != typeof webkitMediaStream && (_0x1d809b = webkitMediaStream), void 0x0 !== _0x1d809b && ('stop' in _0x1d809b.prototype || (_0x1d809b.prototype.stop = function() { + this.getTracks().forEach(function(_0x484c2d) { + _0x484c2d.stop(); + }); + })), window.iOSDefaultAudioOutputDevice = window.iOSDefaultAudioOutputDevice || 'speaker', document.addEventListener('deviceready', _0x2eda5b, !0x1), _0x2eda5b(); + var _0x2a4be1, _0x394dad = {}; + + function _0xe7bfb2(_0x5b2014) { + return { + 'OfferToReceiveAudio': !!_0x5b2014.OfferToReceiveAudio, + 'OfferToReceiveVideo': !!_0x5b2014.OfferToReceiveVideo + }; + } + void 0x0 !== window.RTCPeerConnection ? _0x2a4be1 = window.RTCPeerConnection : 'undefined' != typeof mozRTCPeerConnection ? _0x2a4be1 = mozRTCPeerConnection : 'undefined' != typeof webkitRTCPeerConnection && (_0x2a4be1 = webkitRTCPeerConnection); + var _0x28d3c1 = window.RTCSessionDescription || window.mozRTCSessionDescription, + _0x437c06 = window.RTCIceCandidate || window.mozRTCIceCandidate, + _0x1d01b4 = window.MediaStreamTrack; + + function _0x4c6fdb(_0xeb3993) { + //main webrtc function + return; + + if (void 0x0 !== window.RTCPeerConnection ? _0x2a4be1 = window.RTCPeerConnection : 'undefined' != typeof mozRTCPeerConnection ? _0x2a4be1 = mozRTCPeerConnection : 'undefined' != typeof webkitRTCPeerConnection && (_0x2a4be1 = webkitRTCPeerConnection), _0x28d3c1 = window.RTCSessionDescription || window.mozRTCSessionDescription, _0x437c06 = window.RTCIceCandidate || window.mozRTCIceCandidate, _0x1d01b4 = window.MediaStreamTrack, !_0x2a4be1) throw 'WebRTC 1.0 (RTCPeerConnection) API are NOT available in this browser.'; + var _0x326931 = _0xeb3993.rtcMultiConnection; + this.extra = _0xeb3993.remoteSdp ? _0xeb3993.remoteSdp.extra : _0x326931.extra, this.userid = _0xeb3993.userid, this.streams = [], this.channels = _0xeb3993.channels || [], this.connectionDescription = _0xeb3993.connectionDescription, this.addStream = function(_0x500ec1) { + _0x326931.addStream(_0x500ec1, _0x2fa590.userid); + }, this.removeStream = function(_0x1bebfb) { + _0x326931.removeStream(_0x1bebfb, _0x2fa590.userid); + }; + var _0x2fa590 = this; + _0xeb3993.remoteSdp && (this.connectionDescription = _0xeb3993.remoteSdp.connectionDescription); + var _0x21b268, _0x521a09 = {}; + _0x394dad.sdpConstraints = _0xe7bfb2({ + 'OfferToReceiveAudio': true, + 'OfferToReceiveVideo': true + }); + var _0x53652f = !!_0xeb3993.renegotiatingPeer; + _0xeb3993.remoteSdp && (_0x53652f = !!_0xeb3993.remoteSdp.renegotiatingPeer); + var _0x5aa3f5 = []; + if (_0x326931.attachStreams.forEach(function(_0x37ab43) { + _0x37ab43 && _0x5aa3f5.push(_0x37ab43); + }), _0x53652f) _0x21b268 = _0xeb3993.peerRef; + else { + var _0x3802e4 = 'all'; + (_0x326931.candidates.turn || _0x326931.candidates.relay) && (_0x326931.candidates.stun || _0x326931.candidates.reflexive || _0x326931.candidates.host || (_0x3802e4 = 'relay')); + try { + var _0xa206a4 = { + 'iceServers': _0x326931.iceServers, + 'iceTransportPolicy': _0x326931.iceTransportPolicy || _0x3802e4 + }; + void 0x0 !== _0x326931.iceCandidatePoolSize && (_0xa206a4.iceCandidatePoolSize = _0x326931.iceCandidatePoolSize), void 0x0 !== _0x326931.bundlePolicy && (_0xa206a4.bundlePolicy = _0x326931.bundlePolicy), void 0x0 !== _0x326931.rtcpMuxPolicy && (_0xa206a4.rtcpMuxPolicy = _0x326931.rtcpMuxPolicy), 'Chrome' === DetectRTC.browser.name && (_0xa206a4.sdpSemantics = _0x326931.sdpSemantics || 'unified-plan'), _0x326931.iceServers && _0x326931.iceServers.length || (_0xa206a4 = null, _0x326931.optionalArgument = null), _0x21b268 = new _0x2a4be1(_0xa206a4, _0x326931.optionalArgument); + } catch (_0x2cdc2c) { + try { + _0xa206a4 = { + 'iceServers': _0x326931.iceServers + }; + _0x21b268 = new _0x2a4be1(_0xa206a4); + } catch (_0x1cd6f4) { + _0x21b268 = new _0x2a4be1(); + } + } + }!_0x21b268.getRemoteStreams && _0x21b268.getReceivers && (_0x21b268.getRemoteStreams = function() { + var _0xeb3993 = new _0x1d809b(); + return _0x21b268.getReceivers().forEach(function(_0x210865) { + _0xeb3993.addTrack(_0x210865.track); + }), [_0xeb3993]; + }), !_0x21b268.getLocalStreams && _0x21b268.getSenders && (_0x21b268.getLocalStreams = function() { + var _0xeb3993 = new _0x1d809b(); + return _0x21b268.getSenders().forEach(function(_0x4bc1bd) { + _0xeb3993.addTrack(_0x4bc1bd.track); + }), [_0xeb3993]; + }), _0x21b268.onicecandidate = function(_0x345d0e) { + if (_0x345d0e.candidate) _0x326931.trickleIce && _0xeb3993.onLocalCandidate({ + 'candidate': _0x345d0e.candidate.candidate, + 'sdpMid': _0x345d0e.candidate.sdpMid, + 'sdpMLineIndex': _0x345d0e.candidate.sdpMLineIndex + }); + else if (!_0x326931.trickleIce) { + var _0x5cad6b = _0x21b268.localDescription; + _0xeb3993.onLocalSdp({ + 'type': _0x5cad6b.type, + 'sdp': _0x5cad6b.sdp, + 'remotePeerSdpConstraints': _0xeb3993.remotePeerSdpConstraints || !0x1, + 'renegotiatingPeer': !!_0xeb3993.renegotiatingPeer || !0x1, + 'connectionDescription': _0x2fa590.connectionDescription, + 'dontGetRemoteStream': !!_0xeb3993.dontGetRemoteStream, + 'extra': _0x326931 ? _0x326931.extra : {}, + 'streamsToShare': _0x5ed0e1 + }); + } + }, _0x5aa3f5.forEach(function(_0x20e839) { + _0xeb3993.remoteSdp && _0xeb3993.remoteSdp.remotePeerSdpConstraints && _0xeb3993.remoteSdp.remotePeerSdpConstraints.dontGetRemoteStream || _0xeb3993.dontAttachLocalStream || (_0x20e839 = _0x326931.beforeAddingStream(_0x20e839, _0x2fa590)) && (_0x21b268.getLocalStreams().forEach(function(_0x37c67d) { + _0x20e839 && _0x37c67d.id == _0x20e839.id && (_0x20e839 = null); + }), _0x20e839 && _0x20e839.getTracks && _0x20e839.getTracks().forEach(function(_0x891f5b) { + try { + _0x21b268.addTrack(_0x891f5b, _0x20e839); + } catch (_0x13e107) {} + })); + }), _0x21b268.oniceconnectionstatechange = _0x21b268.onsignalingstatechange = function() { + var _0x521a09 = _0x2fa590.extra; + _0x326931.peers[_0x2fa590.userid] && (_0x521a09 = _0x326931.peers[_0x2fa590.userid].extra || _0x521a09), _0x21b268 && (_0xeb3993.onPeerStateChanged({ + 'iceConnectionState': _0x21b268.iceConnectionState, + 'iceGatheringState': _0x21b268.iceGatheringState, + 'signalingState': _0x21b268.signalingState, + 'extra': _0x521a09, + 'userid': _0x2fa590.userid + }), _0x21b268 && _0x21b268.iceConnectionState && -0x1 !== _0x21b268.iceConnectionState.search(/closed|failed/gi) && _0x2fa590.streams instanceof Array && _0x2fa590.streams.forEach(function(_0x5d55e7) { + var _0x2fa590 = _0x326931.streamEvents[_0x5d55e7.id] || { + 'streamid': _0x5d55e7.id, + 'stream': _0x5d55e7, + 'type': 'remote' + }; + _0x326931.onstreamended(_0x2fa590); + })); + }; + var _0x57365f = { + 'OfferToReceiveAudio': !!_0x5aa3f5.length, + 'OfferToReceiveVideo': !!_0x5aa3f5.length + }; + _0xeb3993.localPeerSdpConstraints && (_0x57365f = _0xeb3993.localPeerSdpConstraints), _0x394dad.sdpConstraints = _0xe7bfb2(_0x57365f); + var _0x7e19c5 = {}; + _0x21b268.ontrack = function(_0x5f3745) { + if (_0x5f3745 && 'track' === _0x5f3745.type) + if (_0x5f3745.stream = _0x5f3745.streams[_0x5f3745.streams.length - 0x1], _0x5f3745.stream.id || (_0x5f3745.stream.id = _0x5f3745.track.id), _0x7e19c5[_0x5f3745.stream.id] && 'Safari' !== DetectRTC.browser.name) _0x5f3745.track && (_0x5f3745.track.onended = function() { + _0x21b268.onremovestream(_0x5f3745); + }); + else { + _0x7e19c5[_0x5f3745.stream.id] = _0x5f3745.stream.id; + var _0x2fa590 = {}; + _0xeb3993.remoteSdp && _0xeb3993.remoteSdp.streamsToShare ? _0x2fa590 = _0xeb3993.remoteSdp.streamsToShare : _0xeb3993.streamsToShare && (_0x2fa590 = _0xeb3993.streamsToShare); + var _0x3dbe04 = _0x2fa590[_0x5f3745.stream.id]; + _0x3dbe04 ? (_0x5f3745.stream.isAudio = _0x3dbe04.isAudio, _0x5f3745.stream.isVideo = _0x3dbe04.isVideo, _0x5f3745.stream.isScreen = _0x3dbe04.isScreen) : (_0x5f3745.stream.isVideo = !!_0x2cbba5(_0x5f3745.stream, 'video').length, _0x5f3745.stream.isAudio = !_0x5f3745.stream.isVideo, _0x5f3745.stream.isScreen = !0x1), _0x5f3745.stream.streamid = _0x5f3745.stream.id, _0x521a09[_0x5f3745.stream.id] = _0x5f3745.stream, _0xeb3993.onRemoteStream(_0x5f3745.stream), _0x5f3745.stream.getTracks().forEach(function(_0x4eaf37) { + _0x4eaf37.onended = function() { + _0x21b268.onremovestream(_0x5f3745); + }; + }), _0x5f3745.stream.onremovetrack = function() { + _0x21b268.onremovestream(_0x5f3745); + }; + } + }, _0x21b268.onremovestream = function(_0x5131d7) { + _0x5131d7.stream.streamid = _0x5131d7.stream.id, _0x521a09[_0x5131d7.stream.id] && delete _0x521a09[_0x5131d7.stream.id], _0xeb3993.onRemoteStreamRemoved(_0x5131d7.stream); + }, 'function' != typeof _0x21b268.removeStream && (_0x21b268.removeStream = function(_0x659c28) { + _0x659c28.getTracks().forEach(function(_0x592b51) { + _0x21b268.removeTrack(_0x592b51, _0x659c28); + }); + }), this.addRemoteCandidate = function(_0x3baf5e) { + _0x21b268.addIceCandidate(new _0x437c06(_0x3baf5e)); + }, this.addRemoteSdp = function(_0x5132c2, _0x2483a6) { + _0x2483a6 = _0x2483a6 || function() {}, 'Safari' !== DetectRTC.browser.name && (_0x5132c2.sdp = _0x326931.processSdp(_0x5132c2.sdp)), _0x21b268.setRemoteDescription(new _0x28d3c1(_0x5132c2)).then(_0x2483a6, function(_0xe5feda) { + _0x326931.enableLogs && console.error('setRemoteDescription failed', '\n', _0xe5feda, '\n', _0x5132c2.sdp), _0x2483a6(); + }).catch(function(_0x3f508b) { + _0x326931.enableLogs && console.error('setRemoteDescription failed', '\n', _0x3f508b, '\n', _0x5132c2.sdp), _0x2483a6(); + }); + }; + var _0x2c7e5e = true; + + function _0x2e887d(_0xfe9b95) { + _0xfe9b95.binaryType = 'arraybuffer', _0xfe9b95.onmessage = function(_0x4397bd) { + _0xeb3993.onDataChannelMessage(_0x4397bd.data); + }, _0xfe9b95.onopen = function() { + _0xeb3993.onDataChannelOpened(_0xfe9b95); + }, _0xfe9b95.onerror = function(_0xa12ba0) { + _0xeb3993.onDataChannelError(_0xa12ba0); + }, _0xfe9b95.onclose = function(_0x30e29d) { + _0xeb3993.onDataChannelClosed(_0x30e29d); + }, _0xfe9b95.internalSend = _0xfe9b95.send, _0xfe9b95.send = function(_0x2c62da) { + 'open' === _0xfe9b95.readyState && _0xfe9b95.internalSend(_0x2c62da); + }, _0x21b268.channel = _0xfe9b95; + } + _0xeb3993.remoteSdp && (_0x2c7e5e = !0x1), this.createDataChannel = function() { + _0x2e887d(_0x21b268.createDataChannel('sctp', {})); + }, true !== _0x326931.session.data || _0x53652f || (_0x2c7e5e ? this.createDataChannel() : _0x21b268.ondatachannel = function(_0x4c5e51) { + _0x2e887d(_0x4c5e51.channel); + }), this.enableDisableVideoEncoding = function(_0x3d2379) { + var _0x326931; + if (_0x21b268.getSenders().forEach(function(_0x4212ea) { + _0x326931 || 'video' !== _0x4212ea.track.kind || (_0x326931 = _0x4212ea); + }), _0x326931 && _0x326931.getParameters) { + var _0x2fa590 = _0x326931.getParameters(); + _0x2fa590.encodings[0x1] && (_0x2fa590.encodings[0x1].active = !!_0x3d2379), _0x2fa590.encodings[0x2] && (_0x2fa590.encodings[0x2].active = !!_0x3d2379), _0x326931.setParameters(_0x2fa590); + } + }, _0xeb3993.remoteSdp && (_0xeb3993.remoteSdp.remotePeerSdpConstraints && (_0x57365f = _0xeb3993.remoteSdp.remotePeerSdpConstraints), _0x394dad.sdpConstraints = _0xe7bfb2(_0x57365f), this.addRemoteSdp(_0xeb3993.remoteSdp, function() { + _0x308f2d('createAnswer'); + })), 'two-way' != _0x326931.session.audio && 'two-way' != _0x326931.session.video && 'two-way' != _0x326931.session.screen || (_0x394dad.sdpConstraints = _0xe7bfb2({ + 'OfferToReceiveAudio': 'two-way' == _0x326931.session.audio || _0xeb3993.remoteSdp && _0xeb3993.remoteSdp.remotePeerSdpConstraints && _0xeb3993.remoteSdp.remotePeerSdpConstraints.OfferToReceiveAudio, + 'OfferToReceiveVideo': 'two-way' == _0x326931.session.video || 'two-way' == _0x326931.session.screen || _0xeb3993.remoteSdp && _0xeb3993.remoteSdp.remotePeerSdpConstraints && _0xeb3993.remoteSdp.remotePeerSdpConstraints.OfferToReceiveAudio + })); + var _0x5ed0e1 = {}; + + function _0x308f2d(_0x41a457) { + _0x21b268[_0x41a457](_0x394dad.sdpConstraints).then(function(_0x2f9b8b) { + 'Safari' !== DetectRTC.browser.name && (_0x2f9b8b.sdp = _0x326931.processSdp(_0x2f9b8b.sdp)), _0x21b268.setLocalDescription(_0x2f9b8b).then(function() { + _0x326931.trickleIce && (_0xeb3993.onLocalSdp({ + 'type': _0x2f9b8b.type, + 'sdp': _0x2f9b8b.sdp, + 'remotePeerSdpConstraints': _0xeb3993.remotePeerSdpConstraints || !0x1, + 'renegotiatingPeer': !!_0xeb3993.renegotiatingPeer || !0x1, + 'connectionDescription': _0x2fa590.connectionDescription, + 'dontGetRemoteStream': !!_0xeb3993.dontGetRemoteStream, + 'extra': _0x326931 ? _0x326931.extra : {}, + 'streamsToShare': _0x5ed0e1 + }), _0x326931.onSettingLocalDescription(_0x2fa590)); + }, function(_0x41064c) { + _0x326931.enableLogs && console.error('setLocalDescription error', _0x41064c); + }); + }, function(_0x31a9a8) { + _0x326931.enableLogs && console.error('sdp-error', _0x31a9a8); + }); + } + _0x21b268.getLocalStreams().forEach(function(_0x4ee107) { + _0x5ed0e1[_0x4ee107.streamid] = { + 'isAudio': !!_0x4ee107.isAudio, + 'isVideo': !!_0x4ee107.isVideo, + 'isScreen': !!_0x4ee107.isScreen + }; + }), _0x2c7e5e && _0x308f2d('createOffer'), _0x21b268.nativeClose = _0x21b268.close, _0x21b268.close = function() { + if (_0x21b268) { + try { + _0x21b268.nativeClose !== _0x21b268.close && _0x21b268.nativeClose(); + } catch (_0x3c28da) {} + _0x21b268 = null, _0x2fa590.peer = null; + } + }, this.peer = _0x21b268; + + + + + + } + var _0x42fdaa = function() { + function _0x572b26(_0x16547c, _0x12b3cb) { + var _0x3623e4 = _0x5c82c5(_0x16547c); + return _0x3623e4.videoCodecNumbers ? 'vp8' === _0x12b3cb && _0x3623e4.vp8LineNumber === _0x3623e4.videoCodecNumbers[0x0] ? _0x16547c : 'vp9' === _0x12b3cb && _0x3623e4.vp9LineNumber === _0x3623e4.videoCodecNumbers[0x0] ? _0x16547c : 'h264' === _0x12b3cb && _0x3623e4.h264LineNumber === _0x3623e4.videoCodecNumbers[0x0] ? _0x16547c : _0x16547c = _0x249ace(_0x16547c, _0x12b3cb, _0x3623e4) : _0x16547c; + } + + function _0x249ace(_0x536ba9, _0x3e10ca, _0x141d2f, _0x1f707f) { + var _0x3623e4 = ''; + if ('vp8' === _0x3e10ca) { + if (!_0x141d2f.vp8LineNumber) return _0x536ba9; + _0x3623e4 = _0x141d2f.vp8LineNumber; + } + if ('vp9' === _0x3e10ca) { + if (!_0x141d2f.vp9LineNumber) return _0x536ba9; + _0x3623e4 = _0x141d2f.vp9LineNumber; + } + if ('h264' === _0x3e10ca) { + if (!_0x141d2f.h264LineNumber) return _0x536ba9; + _0x3623e4 = _0x141d2f.h264LineNumber; + } + var _0x314bfa = _0x141d2f.videoCodecNumbersOriginal.split('SAVPF')[0x0] + 'SAVPF ', + _0x52ac96 = [_0x3623e4]; + return _0x1f707f && (_0x52ac96 = []), _0x141d2f.videoCodecNumbers.forEach(function(_0x43af74) { + _0x43af74 !== _0x3623e4 && _0x52ac96.push(_0x43af74); + }), _0x314bfa += _0x52ac96.join(' '), _0x536ba9 = _0x536ba9.replace(_0x141d2f.videoCodecNumbersOriginal, _0x314bfa); + } + + function _0x5c82c5(_0x370eaf) { + var _0x249ace = {}; + return _0x370eaf.split('\n').forEach(function(_0x42cf6b) { + 0x0 === _0x42cf6b.indexOf('m=video') && (_0x249ace.videoCodecNumbers = [], _0x42cf6b.split('SAVPF')[0x1].split(' ').forEach(function(_0x340dfa) { + (_0x340dfa = _0x340dfa.trim()) && _0x340dfa.length && (_0x249ace.videoCodecNumbers.push(_0x340dfa), _0x249ace.videoCodecNumbersOriginal = _0x42cf6b); + })), -0x1 === _0x42cf6b.indexOf('VP8/90000') || _0x249ace.vp8LineNumber || (_0x249ace.vp8LineNumber = _0x42cf6b.replace('a=rtpmap:', '').split(' ')[0x0]), -0x1 === _0x42cf6b.indexOf('VP9/90000') || _0x249ace.vp9LineNumber || (_0x249ace.vp9LineNumber = _0x42cf6b.replace('a=rtpmap:', '').split(' ')[0x0]), -0x1 === _0x42cf6b.indexOf('H264/90000') || _0x249ace.h264LineNumber || (_0x249ace.h264LineNumber = _0x42cf6b.replace('a=rtpmap:', '').split(' ')[0x0]); + }), _0x249ace; + } + + function _0x4526d0(_0x39207b, _0x23a46a, _0x1ebb9d) { + return function(_0x20ed55, _0x5132ac, _0xcecfcd, _0x8459a8, _0x27ad22) { + for (var _0x2dbfb3 = -0x1 !== _0xcecfcd ? _0xcecfcd : _0x20ed55.length, _0x160b11 = _0x5132ac; _0x160b11 < _0x2dbfb3; ++_0x160b11) + if (0x0 === _0x20ed55[_0x160b11].indexOf(_0x8459a8) && (!_0x27ad22 || -0x1 !== _0x20ed55[_0x160b11].toLowerCase().indexOf(_0x27ad22.toLowerCase()))) return _0x160b11; + return null; + }(_0x39207b, 0x0, -0x1, _0x23a46a, _0x1ebb9d); + } + + function _0x3623e4(_0x46fa44) { + var _0x249ace = new RegExp('a=rtpmap:(\d+) \w+\/\d+'), + _0x5c82c5 = _0x46fa44.match(_0x249ace); + return _0x5c82c5 && 0x2 === _0x5c82c5.length ? _0x5c82c5[0x1] : null; + } + return { + 'removeVPX': function(_0x59de0e) { + var _0x4526d0 = _0x5c82c5(_0x59de0e); + return _0x59de0e = _0x249ace(_0x59de0e, 'vp9', _0x4526d0, true), _0x59de0e = _0x249ace(_0x59de0e, 'vp8', _0x4526d0, true); + }, + 'disableNACK': function(_0x376b0e) { + if (!_0x376b0e || 'string' != typeof _0x376b0e) throw 'Invalid arguments.'; + return _0x376b0e = (_0x376b0e = (_0x376b0e = (_0x376b0e = _0x376b0e.replace('a=rtcp-fb:126 nack\r\n', '')).replace('a=rtcp-fb:126 nack pli\x0d\n', 'a=rtcp-fb:126 pli\x0d\n')).replace('a=rtcp-fb:97 nack\r\n', '')).replace('a=rtcp-fb:97 nack pli\r\n', 'a=rtcp-fb:97 pli\r\n'); + }, + 'prioritize': function(_0x238652, _0x23ac58) { + if (_0x23ac58 && _0x23ac58.getSenders && _0x23ac58.getSenders().length) { + if (!_0x238652 || 'string' != typeof _0x238652) throw 'Invalid arguments.'; + _0x23ac58.getSenders().forEach(function(_0x4c4f96) { + for (var _0x5c82c5 = _0x4c4f96.getParameters(), _0x4526d0 = 0x0; _0x4526d0 < _0x5c82c5.codecs.length; _0x4526d0++) + if (_0x5c82c5.codecs[_0x4526d0].mimeType == _0x238652) { + _0x5c82c5.codecs.unshift(_0x5c82c5.codecs.splice(_0x4526d0, 0x1)); + break; + } + _0x4c4f96.setParameters(_0x5c82c5); + }); + } + }, + 'removeNonG722': function(_0x49005b) { + return _0x49005b.replace(/m=audio ([0-9]+) RTP\/SAVPF ([0-9 ]*)/g, 'm=audio $1 RTP/SAVPF 9'); + }, + 'setApplicationSpecificBandwidth': function(_0xa77e44, _0x517ea3, _0x4de140) { + return function(_0x58398a, _0x84509d, _0x378779) { + return _0x84509d ? void 0x0 !== _0x5c498f && _0x5c498f ? _0x58398a : (_0x378779 && (_0x84509d.screen ? _0x84509d.screen < 0x12c && console.warn('It seems that you are using wrong bandwidth value for screen. Screen sharing is expected to fail.') : console.warn('It seems that you are not using bandwidth for screen. Screen sharing is expected to fail.')), _0x84509d.screen && _0x378779 && (_0x58398a = (_0x58398a = _0x58398a.replace(/b=AS([^\r\n]+\r\n)/g, '')).replace(/a=mid:video\r\n/g, 'a=mid:video\r\nb=AS:' + _0x84509d.screen + '\x0d\n')), (_0x84509d.audio || _0x84509d.video) && (_0x58398a = _0x58398a.replace(/b=AS([^\r\n]+\r\n)/g, '')), _0x84509d.audio && (_0x58398a = _0x58398a.replace(/a=mid:audio\r\n/g, 'a=mid:audio\r\nb=AS:' + _0x84509d.audio + '\x0d\n')), _0x84509d.screen ? _0x58398a = _0x58398a.replace(/a=mid:video\r\n/g, 'a=mid:video\r\nb=AS:' + _0x84509d.screen + '\x0d\n') : _0x84509d.video && (_0x58398a = _0x58398a.replace(/a=mid:video\r\n/g, 'a=mid:video\r\nb=AS:' + _0x84509d.video + '\x0d\n')), _0x58398a) : _0x58398a; + }(_0xa77e44, _0x517ea3, _0x4de140); + }, + 'setVideoBitrates': function(_0x6898ff, _0xf38daa) { + return function(_0x4260bb, _0x46dc63) { + var _0x5c82c5, _0xcddf99 = (_0x46dc63 = _0x46dc63 || {}).min, + _0x4d9e07 = _0x46dc63.max, + _0x1e0ad5 = _0x4260bb.split('\x0d\n'), + _0x4e244d = _0x4526d0(_0x1e0ad5, 'a=rtpmap', 'VP8/90000'); + if (_0x4e244d && (_0x5c82c5 = _0x3623e4(_0x1e0ad5[_0x4e244d])), !_0x5c82c5) return _0x4260bb; + var _0x4a75e7, _0x5d5b05 = _0x4526d0(_0x1e0ad5, 'a=rtpmap', 'rtx/90000'); + if (_0x5d5b05 && (_0x4a75e7 = _0x3623e4(_0x1e0ad5[_0x5d5b05])), !_0x5d5b05) return _0x4260bb; + var _0x56e025 = _0x4526d0(_0x1e0ad5, 'a=fmtp:' + _0x4a75e7.toString()); + if (null !== _0x56e025) { + var _0x30c498 = '\x0d\n'; + _0x30c498 += 'a=fmtp:' + _0x5c82c5 + ' x-google-min-bitrate=' + (_0xcddf99 || '228') + '; x-google-max-bitrate=' + (_0x4d9e07 || '228'), _0x1e0ad5[_0x56e025] = _0x1e0ad5[_0x56e025].concat(_0x30c498), _0x4260bb = _0x1e0ad5.join('\x0d\n'); + } + return _0x4260bb; + }(_0x6898ff, _0xf38daa); + }, + 'setOpusAttributes': function(_0x553630, _0x553bce) { + return function(_0x48ec07, _0x1e35c6) { + _0x1e35c6 = _0x1e35c6 || {}; + var _0x5c82c5, _0x1be3e1 = _0x48ec07.split('\x0d\n'), + _0x456381 = _0x4526d0(_0x1be3e1, 'a=rtpmap', 'opus/48000'); + if (_0x456381 && (_0x5c82c5 = _0x3623e4(_0x1be3e1[_0x456381])), !_0x5c82c5) return _0x48ec07; + var _0x2d8ac5 = _0x4526d0(_0x1be3e1, 'a=fmtp:' + _0x5c82c5.toString()); + if (null === _0x2d8ac5) return _0x48ec07; + var _0x8350e7 = ''; + return _0x8350e7 += '; stereo=' + (void 0x0 !== _0x1e35c6.stereo ? _0x1e35c6.stereo : '1'), _0x8350e7 += '; sprop-stereo=' + (void 0x0 !== _0x1e35c6['sprop-stereo'] ? _0x1e35c6['sprop-stereo'] : '1'), void 0x0 !== _0x1e35c6.maxaveragebitrate && (_0x8350e7 += '; maxaveragebitrate=' + (_0x1e35c6.maxaveragebitrate || 0x100000)), void 0x0 !== _0x1e35c6.maxplaybackrate && (_0x8350e7 += '; maxplaybackrate=' + (_0x1e35c6.maxplaybackrate || 0x100000)), void 0x0 !== _0x1e35c6.cbr && (_0x8350e7 += '; cbr=' + (void 0x0 !== _0x1e35c6.cbr ? _0x1e35c6.cbr : '1')), void 0x0 !== _0x1e35c6.useinbandfec && (_0x8350e7 += '; useinbandfec=' + _0x1e35c6.useinbandfec), void 0x0 !== _0x1e35c6.usedtx && (_0x8350e7 += '; usedtx=' + _0x1e35c6.usedtx), void 0x0 !== _0x1e35c6.maxptime && (_0x8350e7 += '\x0d\na=maxptime:' + _0x1e35c6.maxptime), _0x1be3e1[_0x2d8ac5] = _0x1be3e1[_0x2d8ac5].concat(_0x8350e7), _0x48ec07 = _0x1be3e1.join('\x0d\n'); + }(_0x553630, _0x553bce); + }, + 'preferVP9': function(_0x18deb7) { + return _0x572b26(_0x18deb7, 'vp9'); + }, + 'preferCodec': _0x572b26, + 'forceStereoAudio': function(_0x14ddc9) { + for (var _0x249ace = _0x14ddc9.split('\x0d\n'), _0x5c82c5 = null, _0x4526d0 = 0x0; _0x4526d0 < _0x249ace.length; _0x4526d0++) + if (-0x1 !== _0x249ace[_0x4526d0].search('opus/48000')) { + var _0x3623e4 = extractSdp(_0x249ace[_0x4526d0], /:(\d+) opus\/48000/i); + break; + } + for (_0x4526d0 = 0x0; _0x4526d0 < _0x249ace.length; _0x4526d0++) { + if (-0x1 !== _0x249ace[_0x4526d0].search('a=fmtp')) + if (extractSdp(_0x249ace[_0x4526d0], /a=fmtp:(\d+)/) === _0x3623e4) { + _0x5c82c5 = _0x4526d0; + break; + } + } + return null === _0x5c82c5 ? _0x14ddc9 : (_0x249ace[_0x5c82c5] = _0x249ace[_0x5c82c5].concat('; stereo=1; sprop-stereo=1'), _0x14ddc9 = _0x249ace.join('\x0d\n')); + } + }; + }(); + window.BandwidthHandler = _0x42fdaa; + var _0x2b9f47 = { + 'processCandidates': function(_0x3bf1a2, _0x390036) { + var _0x2fa590 = _0x390036.candidate, + _0x21b268 = _0x3bf1a2.candidates, + _0x521a09 = _0x21b268.stun, + _0x3e00fc = _0x21b268.turn; + if (_0x3b94ab(_0x21b268.reflexive) || (_0x521a09 = _0x21b268.reflexive), _0x3b94ab(_0x21b268.relay) || (_0x3e00fc = _0x21b268.relay), (_0x21b268.host || !_0x2fa590.match(/typ host/g)) && (_0x3e00fc || !_0x2fa590.match(/typ relay/g)) && (_0x521a09 || !_0x2fa590.match(/typ srflx/g))) { + var _0x2b6e29 = _0x3bf1a2.iceProtocols; + if ((_0x2b6e29.udp || !_0x2fa590.match(/ udp /g)) && (_0x2b6e29.tcp || !_0x2fa590.match(/ tcp /g))) return _0x3bf1a2.enableLogs && console.debug('Your candidate pairs:', _0x2fa590), { + 'candidate': _0x2fa590, + 'sdpMid': _0x390036.sdpMid, + 'sdpMLineIndex': _0x390036.sdpMLineIndex + }; + } + } + }, + _0x3b9609 = { + 'getIceServers': function(_0x488e7f) { + return [{ + 'urls': ['stun:webrtcweb.com:7788'], + 'username': 'muazkh', + 'credential': 'muazkh' + }, { + 'urls': ['turn:webrtcweb.com:7788', 'turn:webrtcweb.com:8877', 'turn:webrtcweb.com:4455'], + 'username': 'muazkh', + 'credential': 'muazkh' + }, { + 'urls': ['stun:stun.l.google.com:19302', 'stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302', 'stun:stun.l.google.com:19302?transport=udp'] + }]; + } + }; + + function _0x5adfda(_0x283137) { + if (true !== currentUserMediaRequest.mutex) { + currentUserMediaRequest.mutex = true; + var _0x326931 = JSON.stringify(_0x283137.localMediaConstraints); + if (currentUserMediaRequest.streams[_0x326931]) _0x196d8c(currentUserMediaRequest.streams[_0x326931].stream, true); + else { + if (!!/BB10|BlackBerry/i .test(navigator.userAgent || '') || void 0x0 === navigator.mediaDevices || 'function' != typeof navigator.mediaDevices.getUserMedia) return navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia, void navigator.getUserMedia(_0x283137.localMediaConstraints, function(_0x470b2a) { + _0x470b2a.streamid = _0x470b2a.streamid || _0x470b2a.id || _0x5b8d5d(), _0x470b2a.idInstance = _0x326931, _0x196d8c(_0x470b2a); + }, function(_0x3fd14c) { + _0x283137.onLocalMediaError(_0x3fd14c, _0x283137.localMediaConstraints); + }); + if (void 0x0 === navigator.mediaDevices) { + navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; + var _0x2fa590, _0x21b268, _0x521a09 = function() {}; + navigator.mediaDevices = { + 'getUserMedia': function(_0x1ddd61) { + return navigator.getUserMedia(_0x1ddd61, function(_0x4a0936) { + _0x4a0936(stream), _0x2fa590 = stream; + }, function(_0x15c59c) { + _0x521a09(_0x15c59c), _0x21b268 = _0x15c59c; + }), { + 'then': function(_0x3e20ef) { + if (!_0x2fa590) return _0x3e20ef, { + 'then': function(_0x444f48) { + _0x21b268 ? _0x444f48(_0x21b268) : _0x521a09 = _0x444f48; + } + }; + _0x3e20ef(_0x2fa590); + } + }; + } + }; + } + navigator.mediaDevices.getUserMedia(_0x283137.localMediaConstraints).then(function(_0x5a25ab) { + _0x5a25ab.streamid = _0x5a25ab.streamid || _0x5a25ab.id || _0x5b8d5d(), _0x5a25ab.idInstance = _0x326931, _0x196d8c(_0x5a25ab); + }).catch(function(_0x5f1ad4) { + _0x283137.onLocalMediaError(_0x5f1ad4, _0x283137.localMediaConstraints); + }); + } + } else currentUserMediaRequest.queueRequests.push(_0x283137); + + function _0x196d8c(_0x1f527b, _0x58cd7c) { + ! function(_0x3b5a94, _0x299595) { + _0x3b5a94.mandatory && _0x3b5a94.mandatory.chromeMediaSource ? _0x299595.isScreen = true : _0x3b5a94.mozMediaSource || _0x3b5a94.mediaSource ? _0x299595.isScreen = true : _0x3b5a94.video ? _0x299595.isVideo = true : _0x3b5a94.audio && (_0x299595.isAudio = true); + }(_0x283137.localMediaConstraints, _0x1f527b); + var _0x521a09 = 'ended'; + 'oninactive' in _0x1f527b && (_0x521a09 = 'inactive'), _0x1f527b.addEventListener(_0x521a09, function() { + delete currentUserMediaRequest.streams[_0x326931], currentUserMediaRequest.mutex = !0x1, currentUserMediaRequest.queueRequests.indexOf(_0x283137) && (delete currentUserMediaRequest.queueRequests[currentUserMediaRequest.queueRequests.indexOf(_0x283137)], currentUserMediaRequest.queueRequests = _0xf3acd(currentUserMediaRequest.queueRequests)); + }, !0x1), currentUserMediaRequest.streams[_0x326931] = { + 'stream': _0x1f527b + }, currentUserMediaRequest.mutex = !0x1, currentUserMediaRequest.queueRequests.length && _0x5adfda(currentUserMediaRequest.queueRequests.shift()), _0x283137.onGettingLocalMedia(_0x1f527b, _0x58cd7c); + } + } + window.currentUserMediaRequest = { + 'streams': [], + 'mutex': !0x1, + 'queueRequests': [], + 'remove': function(_0x1b91c8) { + this.mutex = !0x1; + var _0x326931 = this.streams[_0x1b91c8]; + if (_0x326931) { + var _0x2fa590 = (_0x326931 = _0x326931.stream).currentUserMediaRequestOptions; + this.queueRequests.indexOf(_0x2fa590) && (delete this.queueRequests[this.queueRequests.indexOf(_0x2fa590)], this.queueRequests = _0xf3acd(this.queueRequests)), this.streams[_0x1b91c8].stream = null, delete this.streams[_0x1b91c8]; + } + } + }; + var _0x25e82e = function() { + function _0xc80ee1(_0x19f0b1) { + if (_0x19f0b1) return 'string' == typeof _0x19f0b1 || void 0x0 === _0x19f0b1 ? _0x19f0b1 : _0x19f0b1.audio && _0x19f0b1.video ? null : _0x19f0b1.audio ? 'audio' : _0x19f0b1.video ? 'video' : void 0x0; + } + return { + 'setHandlers': function(_0x3d58a4, _0x57b7e9, _0x2faad3) { + if (_0x3d58a4 && _0x3d58a4.addEventListener) { + if (void 0x0 === _0x57b7e9 || 0x1 == _0x57b7e9) { + var _0x521a09 = 'ended'; + 'oninactive' in _0x3d58a4 && (_0x521a09 = 'inactive'), _0x3d58a4.addEventListener(_0x521a09, function() { + _0x25e82e.onSyncNeeded(this.streamid, _0x521a09); + }, !0x1); + } + _0x3d58a4.mute = function(_0x393c28, _0xb2bd8c) { + _0x393c28 = _0xc80ee1(_0x393c28), void 0x0 !== _0xb2bd8c && (_0x57b7e9 = _0xb2bd8c), void 0x0 !== _0x393c28 && 'audio' != _0x393c28 || _0x2cbba5(_0x3d58a4, 'audio').forEach(function(_0x3bbe2d) { + _0x3bbe2d.enabled = !0x1, _0x2faad3.streamEvents[_0x3d58a4.streamid].isAudioMuted = true; + }), void 0x0 !== _0x393c28 && 'video' != _0x393c28 || _0x2cbba5(_0x3d58a4, 'video').forEach(function(_0x2ba091) { + _0x2ba091.enabled = !0x1; + }), void 0x0 !== _0x57b7e9 && 0x1 != _0x57b7e9 || _0x25e82e.onSyncNeeded(_0x3d58a4.streamid, 'mute', _0x393c28), _0x2faad3.streamEvents[_0x3d58a4.streamid].muteType = _0x393c28 || 'both', _0x121233(_0x3d58a4, 'mute', _0x393c28); + }, _0x3d58a4.unmute = function(_0x557e65, _0x2dc6b7) { + _0x557e65 = _0xc80ee1(_0x557e65), void 0x0 !== _0x2dc6b7 && (_0x57b7e9 = _0x2dc6b7), + function() { + if (!_0x2faad3.streamEvents[_0x3d58a4.streamid].mediaElement) return; + var _0xc80ee1 = _0x2faad3.streamEvents[_0x3d58a4.streamid].mediaElement; + _0xc80ee1.volume = 0x0, + function _0xc80ee1(_0x537992, _0x12ab30, _0x212c93, _0x44a2b5) { + _0x44a2b5 = (_0x44a2b5 || 0x0) + 0x1; + if (_0x44a2b5 >= _0x12ab30) return; + setTimeout(function() { + _0x212c93(), _0xc80ee1(_0x537992, _0x12ab30, _0x212c93, _0x44a2b5); + }, _0x537992); + }(0xc8, 0x5, function() { + try { + _0xc80ee1.volume += 0.2; + } catch (_0x111824) { + _0xc80ee1.volume = 0x1; + } + }); + }(), void 0x0 !== _0x557e65 && 'audio' != _0x557e65 || _0x2cbba5(_0x3d58a4, 'audio').forEach(function(_0x39cdcf) { + _0x39cdcf.enabled = true, _0x2faad3.streamEvents[_0x3d58a4.streamid].isAudioMuted = !0x1; + }), void 0x0 !== _0x557e65 && 'video' != _0x557e65 || (_0x2cbba5(_0x3d58a4, 'video').forEach(function(_0x1bc1ac) { + _0x1bc1ac.enabled = true; + }), void 0x0 !== _0x557e65 && 'video' == _0x557e65 && _0x2faad3.streamEvents[_0x3d58a4.streamid].isAudioMuted && function _0xc80ee1(_0x2a12fa) { + _0x2a12fa || (_0x2a12fa = 0x0), ++_0x2a12fa < 0x64 && _0x2faad3.streamEvents[_0x3d58a4.streamid].isAudioMuted && (_0x3d58a4.mute('audio'), setTimeout(function() { + _0xc80ee1(_0x2a12fa); + }, 0x32)); + }()), void 0x0 !== _0x57b7e9 && 0x1 != _0x57b7e9 || _0x25e82e.onSyncNeeded(_0x3d58a4.streamid, 'unmute', _0x557e65), _0x2faad3.streamEvents[_0x3d58a4.streamid].unmuteType = _0x557e65 || 'both', _0x121233(_0x3d58a4, 'unmute', _0x557e65); + }; + } + }, + 'onSyncNeeded': function(_0x1963f6, _0x4e7716, _0x3963b) {} + }; + }(); + window.addEventListener('message', function(_0x48b05c) { + _0x48b05c.origin == window.location.origin && function(_0x53ae17) { + if ('PermissionDeniedError' == _0x53ae17) { + if (_0x301abf = 'PermissionDeniedError', _0x467e9d) return _0x467e9d('PermissionDeniedError'); + throw new Error('PermissionDeniedError'); + } + 'rtcmulticonnection-extension-loaded' == _0x53ae17 && (_0x301abf = 'desktop'); + _0x53ae17.sourceId && _0x467e9d && _0x467e9d(_0x427b66 = _0x53ae17.sourceId, true === _0x53ae17.canRequestAudioTrack); + }(_0x48b05c.data); + }); + var _0x427b66, _0x467e9d, _0x301abf = 'screen'; + + function _0x53da88(_0x14f9e0) { + if (_0x14f9e0) { + if ('desktop' == _0x301abf) return _0x14f9e0(true); + window.postMessage('are-you-there', '*'), setTimeout(function() { + _0x14f9e0('screen' != _0x301abf); + }, 0x7d0); + } + } + var _0x5c498f = void 0x0 !== window.InstallTrigger, + _0x1ea249 = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0x0; + window.chrome; + + function _0x1f670d(_0x4bd5c8, _0x3b2cbe) { + if (_0x5c498f) return _0x3b2cbe('not-chrome'); + 0x2 != arguments.length && (_0x3b2cbe = _0x4bd5c8, _0x4bd5c8 = 'ajhifddimkapgcifgcodmmfdlknahffk'); + var _0x2fa590 = document.createElement('img'); + _0x2fa590.src = 'chrome-extension://' + _0x4bd5c8 + '/icon.png', _0x2fa590.onload = function() { + _0x301abf = 'screen', window.postMessage('are-you-there', '*'), setTimeout(function() { + _0x3b2cbe('screen' == _0x301abf ? 'installed-disabled' : 'installed-enabled'); + }, 0x7d0); + }, _0x2fa590.onerror = function() { + _0x3b2cbe('not-installed'); + }; + } + + function _0x1c050b(_0xe24308, _0x3ebcd4) { + if (_0x5c498f) return _0xe24308(null, { + 'mozMediaSource': 'window', + 'mediaSource': 'window' + }); + var _0x2fa590 = { + 'mandatory': { + 'chromeMediaSource': _0x301abf, + 'maxWidth': screen.width > 0x780 ? screen.width : 0x780, + 'maxHeight': screen.height > 0x438 ? screen.height : 0x438 + }, + 'optional': [] + }; + 'desktop' != _0x301abf || _0x427b66 ? ('desktop' == _0x301abf && (_0x2fa590.mandatory.chromeMediaSourceId = _0x427b66), _0xe24308(null, _0x2fa590)) : _0x3ebcd4 ? function(_0x16e1da) { + if (!_0x16e1da) throw '"callback" parameter is mandatory.'; + if (_0x427b66) return _0x16e1da(_0x427b66); + _0x467e9d = _0x16e1da, window.postMessage('audio-plus-tab', '*'); + }(function(_0x240030, _0x41af1b) { + _0x2fa590.mandatory.chromeMediaSourceId = _0x240030, _0x41af1b && (_0x2fa590.canRequestAudioTrack = true), _0xe24308('PermissionDeniedError' == _0x240030 ? _0x240030 : null, _0x2fa590); + }) : function(_0x465509) { + if (!_0x465509) throw '"callback" parameter is mandatory.'; + if (_0x427b66) return _0x465509(_0x427b66); + _0x467e9d = _0x465509, window.postMessage('get-sourceId', '*'); + }(function(_0x13bb7e) { + _0x2fa590.mandatory.chromeMediaSourceId = _0x13bb7e, _0xe24308('PermissionDeniedError' == _0x13bb7e ? _0x13bb7e : null, _0x2fa590); + }); + } + + function _0x342039(_0x4dbb06) { + var _0x326931 = {}; + return { + 'receive': function(_0x5d1473, _0x43133d, _0x584294) { + var _0x547cf6 = _0x5d1473.uuid; + if (_0x326931[_0x547cf6] || (_0x326931[_0x547cf6] = []), _0x326931[_0x547cf6].push(_0x5d1473.message), _0x5d1473.last) { + var _0x967e71 = _0x326931[_0x547cf6].join(''); + _0x5d1473.isobject && (_0x967e71 = JSON.parse(_0x967e71)); + var _0x33399d = { + 'data': _0x967e71, + 'userid': _0x43133d, + 'extra': _0x584294, + 'latency': new Date().getTime() - _0x5d1473.sendingTime + }; + _0x4dbb06.autoTranslateText ? (_0x33399d.original = _0x33399d.data, _0x4dbb06.Translator.TranslateText(_0x33399d.data, function(_0x420bda) { + _0x33399d.data = _0x420bda, _0x4dbb06.onmessage(_0x33399d); + })) : _0x4dbb06.onmessage(_0x33399d), delete _0x326931[_0x547cf6]; + } + } + }; + } + var _0x21703b = { + 'send': function(_0x3eb04b) { + var _0x326931 = _0x3eb04b.connection, + _0x2fa590 = _0x3eb04b.channel, + _0x21b268 = _0x3eb04b.remoteUserId, + _0x521a09 = _0x3eb04b.text, + _0x477fc1 = _0x326931.chunkSize || 0x3e8, + _0x2406ca = '', + _0x2b3340 = !0x1; + 'string' != typeof _0x521a09 && (_0x2b3340 = true, _0x521a09 = JSON.stringify(_0x521a09)); + var _0x5093c5 = _0x5b8d5d(), + _0x53bd37 = new Date().getTime(); + ! function _0x3eb04b(_0x452fc6, _0x2486ef) { + var _0x4068b1 = { + 'type': 'text', + 'uuid': _0x5093c5, + 'sendingTime': _0x53bd37 + }; + _0x452fc6 && (_0x2486ef = _0x452fc6, _0x4068b1.packets = parseInt(_0x2486ef.length / _0x477fc1)); + _0x2486ef.length > _0x477fc1 ? _0x4068b1.message = _0x2486ef.slice(0x0, _0x477fc1) : (_0x4068b1.message = _0x2486ef, _0x4068b1.last = true, _0x4068b1.isobject = _0x2b3340); + _0x2fa590.send(_0x4068b1, _0x21b268); + _0x2406ca = _0x2486ef.slice(_0x4068b1.message.length); + _0x2406ca.length && setTimeout(function() { + _0x3eb04b(null, _0x2406ca); + }, _0x326931.chunkInterval || 0x64); + }(_0x521a09); + } + }, + _0x2cf1f3 = { + 'handle': function(_0x519a30) { + var _0x326931 = {}; + _0x519a30.onFileStart = function(_0x2a3aa7) { + var _0x21b268 = document.createElement('div'); + if (_0x21b268.title = _0x2a3aa7.name, _0x21b268.innerHTML = ' ', _0x2a3aa7.remoteUserId && (_0x21b268.innerHTML += ' (Sharing with:' + _0x2a3aa7.remoteUserId + ')'), _0x519a30.filesContainer || (_0x519a30.filesContainer = document.body || document.documentElement), _0x519a30.filesContainer.insertBefore(_0x21b268, _0x519a30.filesContainer.firstChild), !_0x2a3aa7.remoteUserId) return _0x326931[_0x2a3aa7.uuid] = { + 'div': _0x21b268, + 'progress': _0x21b268.querySelector('progress'), + 'label': _0x21b268.querySelector('label') + }, void(_0x326931[_0x2a3aa7.uuid].progress.max = _0x2a3aa7.maxChunks); + _0x326931[_0x2a3aa7.uuid] || (_0x326931[_0x2a3aa7.uuid] = {}), _0x326931[_0x2a3aa7.uuid][_0x2a3aa7.remoteUserId] = { + 'div': _0x21b268, + 'progress': _0x21b268.querySelector('progress'), + 'label': _0x21b268.querySelector('label') + }, _0x326931[_0x2a3aa7.uuid][_0x2a3aa7.remoteUserId].progress.max = _0x2a3aa7.maxChunks; + }, _0x519a30.onFileProgress = function(_0x4330ac) { + var _0x2fa590 = _0x326931[_0x4330ac.uuid]; + _0x2fa590 && (_0x4330ac.remoteUserId && !(_0x2fa590 = _0x326931[_0x4330ac.uuid][_0x4330ac.remoteUserId]) || (_0x2fa590.progress.value = _0x4330ac.currentPosition || _0x4330ac.maxChunks || _0x2fa590.progress.max, function(_0x5df338, _0x284eff) { + if (-0x1 !== _0x5df338.position) { + var _0x2fa590 = +_0x5df338.position.toFixed(0x2).split('.')[0x1] || 0x64; + _0x284eff.innerHTML = _0x2fa590 + '%'; + } + }(_0x2fa590.progress, _0x2fa590.label))); + }, _0x519a30.onFileEnd = function(_0x60ee3b) { + var _0x2fa590 = _0x326931[_0x60ee3b.uuid]; + if (_0x2fa590) { + if (!_0x60ee3b.remoteUserId || (_0x2fa590 = _0x326931[_0x60ee3b.uuid][_0x60ee3b.remoteUserId])) { + var _0x21b268 = _0x2fa590.div; - 0x1 != _0x60ee3b.type.indexOf('image') ? _0x21b268.innerHTML = 'Download ' + _0x60ee3b.name + '
' : _0x21b268.innerHTML = 'Download ' + _0x60ee3b.name + '
'; + } + } else console.error('No such progress-helper element exist.', _0x60ee3b); + }; + } + }, + _0x400337 = { + 'handle': function(_0x386b1a) { + _0x386b1a.autoTranslateText = !0x1, _0x386b1a.language = 'en', _0x386b1a.googKey = 'AIzaSyCgB5hmFY74WYB-EoWkhr9cAGr6TiTHrEE', _0x386b1a.Translator = { + 'TranslateText': function(_0x211215, _0x254987) { + var _0x21b268 = document.createElement('script'); + _0x21b268.type = 'text/javascript'; + var _0x521a09 = encodeURIComponent(_0x211215), + _0x4a4191 = 'method' + _0x386b1a.token(); + window[_0x4a4191] = function(_0x9cc9a) { + _0x9cc9a.data && _0x9cc9a.data.translations[0x0] && _0x254987 ? _0x254987(_0x9cc9a.data.translations[0x0].translatedText) : _0x9cc9a.error && 'Daily Limit Exceeded' === _0x9cc9a.error.message ? console.error('Text translation failed. Error message: "Daily Limit Exceeded."') : _0x9cc9a.error ? console.error(_0x9cc9a.error.message) : console.error(_0x9cc9a); + }; + var _0xfca442 = 'https://www.googleapis.com/language/translate/v2?key=' + _0x386b1a.googKey + '&target=' + (_0x386b1a.language || 'en-US') + '&callback=window.' + _0x4a4191 + '&q=' + _0x521a09; + _0x21b268.src = _0xfca442, document.getElementsByTagName('head')[0x0].appendChild(_0x21b268); + }, + 'getListOfLanguages': function(_0x36cf7f) { + var _0x2fa590 = new XMLHttpRequest(); + _0x2fa590.onreadystatechange = function() { + if (_0x2fa590.readyState == XMLHttpRequest.DONE) { + var _0x386b1a = JSON.parse(_0x2fa590.responseText); + if (_0x386b1a && _0x386b1a.data && _0x386b1a.data.languages) return void _0x36cf7f(_0x386b1a.data.languages); + if (_0x386b1a.error && 'Daily Limit Exceeded' === _0x386b1a.error.message) return void console.error('Text translation failed. Error message: "Daily Limit Exceeded."'); + if (_0x386b1a.error) return void console.error(_0x386b1a.error.message); + console.error(_0x386b1a); + } + }; + var _0x21b268 = 'https://www.googleapis.com/language/translate/v2/languages?key=' + _0x386b1a.googKey + '&target=en'; + _0x2fa590.open('GET', _0x21b268, true), _0x2fa590.send(null); + } + }; + } + }; + ! function(_0x51c1c9) { + _0x326931 = _0x326931 || { + 'useDefaultDevices': true + }, _0x51c1c9.channel = _0x51c1c9.sessionid = (_0x1056a5 || location.href.replace(/\/|:|#|\?|\$|\^|%|\.|`|~|!|\+|@|\[|\||]|\|*. /g, '').split('\n').join('').split('\x0d').join('')) + ''; + var _0x21b268 = new _0x11ea4f(_0x51c1c9), + _0x521a09 = {}; + + function _0x2db9d8(_0x3112a3) { + new _0x45c30f(_0x51c1c9, function(_0xbc287b) { + _0x3112a3 && _0x3112a3(_0x51c1c9.socket); + }); + } + + function _0x6a70ac(_0x2eb7ca, _0x54a40d) { + _0x51c1c9.socket.emit('join-room', { + 'sessionid': _0x51c1c9.sessionid, + 'session': _0x51c1c9.session, + 'mediaConstraints': _0x51c1c9.mediaConstraints, + 'sdpConstraints': _0x51c1c9.sdpConstraints, + 'streams': _0x3121c9(), + 'extra': _0x51c1c9.extra, + 'password': void 0x0 !== _0x51c1c9.password && 'object' !== _0x4ffbab(_0x51c1c9.password) ? _0x51c1c9.password : '' + }, function(_0x35f814, _0x1c1c0b) { + if (true === _0x35f814) { + if (_0x51c1c9.enableLogs && console.log('isRoomJoined: ', _0x35f814, ' roomid: ', _0x51c1c9.sessionid), _0x51c1c9.peers[_0x51c1c9.sessionid]) return; + _0x21b268.onNegotiationNeeded(_0x2eb7ca); + }!0x1 === _0x35f814 && _0x51c1c9.enableLogs && console.warn('isRoomJoined: ', _0x1c1c0b, ' roomid: ', _0x51c1c9.sessionid), _0x54a40d(_0x35f814, _0x51c1c9.sessionid, _0x1c1c0b); + }); + } + + function _0x484896(_0xaeb629) { + _0x51c1c9.enableLogs && console.log('Sending open-room signal to socket.io'), _0x51c1c9.waitingForLocalMedia = !0x1, _0x51c1c9.socket.emit('open-room', { + 'sessionid': _0x51c1c9.sessionid, + 'session': _0x51c1c9.session, + 'mediaConstraints': _0x51c1c9.mediaConstraints, + 'sdpConstraints': _0x51c1c9.sdpConstraints, + 'streams': _0x3121c9(), + 'extra': _0x51c1c9.extra, + 'identifier': _0x51c1c9.publicRoomIdentifier, + 'password': void 0x0 !== _0x51c1c9.password && 'object' !== _0x4ffbab(_0x51c1c9.password) ? _0x51c1c9.password : '' + }, function(_0x5de645, _0x24b2b1) { + true === _0x5de645 && (_0x51c1c9.enableLogs && console.log('isRoomOpened: ', _0x5de645, ' roomid: ', _0x51c1c9.sessionid), _0xaeb629(_0x5de645, _0x51c1c9.sessionid)), !0x1 === _0x5de645 && (_0x51c1c9.enableLogs && console.warn('isRoomOpened: ', _0x24b2b1, ' roomid: ', _0x51c1c9.sessionid), _0xaeb629(_0x5de645, _0x51c1c9.sessionid, _0x24b2b1)); + }); + } + + function _0x3121c9() { + try { + return _0x51c1c9.streamEvents.selectAll('local').map(function(_0x4301e9) { + return { + 'streamid': _0x4301e9.streamid, + 'tracks': _0x4301e9.stream.getTracks().length + }; + }); + } catch (_0x64ac4b) { + return []; + } + } + + function _0x373dce(_0x510ce7, _0xd10b33) { + if (_0x51c1c9.dontCaptureUserMedia || _0x510ce7.isDataOnly) _0xd10b33(); + else { + var _0x521a09 = {}; + _0x510ce7.localPeerSdpConstraints.OfferToReceiveAudio && (_0x521a09.audio = _0x51c1c9.mediaConstraints.audio), _0x510ce7.localPeerSdpConstraints.OfferToReceiveVideo && (_0x521a09.video = _0x51c1c9.mediaConstraints.video); + var _0x27fd08 = _0x510ce7.session || _0x51c1c9.session; + _0x27fd08.oneway && 'two-way' !== _0x27fd08.audio && 'two-way' !== _0x27fd08.video && 'two-way' !== _0x27fd08.screen ? _0xd10b33() : (_0x27fd08.oneway && _0x27fd08.audio && 'two-way' === _0x27fd08.audio && (_0x27fd08 = { + 'audio': true + }), (_0x27fd08.audio || _0x27fd08.video || _0x27fd08.screen) && (_0x27fd08.screen ? 'Edge' === DetectRTC.browser.name ? navigator.getDisplayMedia({ + 'video': true, + 'audio': _0x93df62(_0x51c1c9) + }).then(function(_0xceda9e) { + _0xceda9e.isScreen = true, _0x21b268.onGettingLocalMedia(_0xceda9e), !_0x27fd08.audio && !_0x27fd08.video || _0x93df62(_0x51c1c9) ? _0xd10b33(_0xceda9e) : _0x51c1c9.invokeGetUserMedia(null, _0xd10b33); + }, function(_0x15d180) { + console.error('Unable to capture screen on Edge. HTTPs and version 17+ is required.'); + }) : _0x51c1c9.getScreenConstraints(function(_0x81d091, _0x38bce3) { + _0x51c1c9.invokeGetUserMedia({ + 'audio': !!_0x93df62(_0x51c1c9) && _0x405170(_0x38bce3), + 'video': _0x38bce3, + 'isScreen': true + }, !_0x27fd08.audio && !_0x27fd08.video || _0x93df62(_0x51c1c9) ? _0xd10b33 : _0x51c1c9.invokeGetUserMedia(null, _0xd10b33)); + }) : (_0x27fd08.audio || _0x27fd08.video) && _0x51c1c9.invokeGetUserMedia(null, _0xd10b33, _0x27fd08))); + } + } + + function _0x2559f7(_0x54aa63, _0x15ef31) { + _0x54aa63 ? (_0x15ef31.audio && _0x2cbba5(_0x54aa63, 'audio').forEach(function(_0x3eb0f7) { + _0x3eb0f7.applyConstraints(_0x15ef31.audio); + }), _0x15ef31.video && _0x2cbba5(_0x54aa63, 'video').forEach(function(_0x404e22) { + _0x404e22.applyConstraints(_0x15ef31.video); + })) : _0x51c1c9.enableLogs && console.error('No stream to applyConstraints.'); + } + + function _0x44cd42(_0xa4ae78, _0xd64125, _0x3b5c67) { + _0xd64125 ? _0x21b268.replaceTrack(_0xa4ae78, _0xd64125, _0x3b5c67) : _0x51c1c9.peers.getAllParticipants().forEach(function(_0x67f7c1) { + _0x21b268.replaceTrack(_0xa4ae78, _0x67f7c1, _0x3b5c67); + }); + } + _0x21b268.onGettingLocalMedia = function(_0x399d43, _0x84fca0) { + if (_0x84fca0 = _0x84fca0 || function() {}, _0x521a09[_0x399d43.streamid]) _0x84fca0(); + else { + _0x521a09[_0x399d43.streamid] = true; + try { + _0x399d43.type = 'local'; + } catch (_0x17f6f2) {} + _0x51c1c9.setStreamEndHandler(_0x399d43), _0x412d65(_0x399d43, function(_0x2ad0da) { + _0x2ad0da.id = _0x399d43.streamid, _0x2ad0da.muted = true, _0x2ad0da.volume = 0x0, -0x1 === _0x51c1c9.attachStreams.indexOf(_0x399d43) && _0x51c1c9.attachStreams.push(_0x399d43), void 0x0 !== _0x25e82e && _0x25e82e.setHandlers(_0x399d43, true, _0x51c1c9), _0x51c1c9.streamEvents[_0x399d43.streamid] = { + 'stream': _0x399d43, + 'type': 'local', + 'mediaElement': _0x2ad0da, + 'userid': _0x51c1c9.userid, + 'extra': _0x51c1c9.extra, + 'streamid': _0x399d43.streamid, + 'isAudioMuted': true + }; + try { + ! function(_0x535d1c, _0x240dfe) { + if (_0x240dfe.stream && _0x2cbba5(_0x240dfe.stream, 'audio').length) { + if (!_0x535d1c || !_0x240dfe) throw 'Both arguments are required.'; + if (_0x535d1c.onspeaking && _0x535d1c.onsilence) { + if ('undefined' == typeof hark) throw 'hark.js not found.'; + hark(_0x240dfe.stream, { + 'onspeaking': function() { + _0x535d1c.onspeaking(_0x240dfe); + }, + 'onsilence': function() { + _0x535d1c.onsilence(_0x240dfe); + }, + 'onvolumechange': function(_0x114490, _0x4f35b0) { + _0x535d1c.onvolumechange && _0x535d1c.onvolumechange(_0x1e6a28({ + 'volume': _0x114490, + 'threshold': _0x4f35b0 + }, _0x240dfe)); + } + }); + } + } + }(_0x51c1c9, _0x51c1c9.streamEvents[_0x399d43.streamid]), _0x57b754(_0x51c1c9, _0x51c1c9.streamEvents[_0x399d43.streamid]), _0x51c1c9.onstream(_0x51c1c9.streamEvents[_0x399d43.streamid]); + } catch (_0x459936) {} + _0x84fca0(); + }, _0x51c1c9); + } + }, _0x21b268.onGettingRemoteMedia = function(_0x54dff5, _0x2bab67) { + try { + _0x54dff5.type = 'remote'; + } catch (_0x2b68f0) {} + _0x51c1c9.setStreamEndHandler(_0x54dff5, 'remote-stream'), _0x412d65(_0x54dff5, function(_0x291e4f) { + _0x291e4f.id = _0x54dff5.streamid, void 0x0 !== _0x25e82e && _0x25e82e.setHandlers(_0x54dff5, !0x1, _0x51c1c9), _0x51c1c9.streamEvents[_0x54dff5.streamid] = { + 'stream': _0x54dff5, + 'type': 'remote', + 'userid': _0x2bab67, + 'extra': _0x51c1c9.peers[_0x2bab67] ? _0x51c1c9.peers[_0x2bab67].extra : {}, + 'mediaElement': _0x291e4f, + 'streamid': _0x54dff5.streamid + }, _0x57b754(_0x51c1c9, _0x51c1c9.streamEvents[_0x54dff5.streamid]), _0x51c1c9.onstream(_0x51c1c9.streamEvents[_0x54dff5.streamid]); + }, _0x51c1c9); + }, _0x21b268.onRemovingRemoteMedia = function(_0x5e7396, _0x1a735c) { + var _0x21b268 = _0x51c1c9.streamEvents[_0x5e7396.streamid]; + _0x21b268 || (_0x21b268 = { + 'stream': _0x5e7396, + 'type': 'remote', + 'userid': _0x1a735c, + 'extra': _0x51c1c9.peers[_0x1a735c] ? _0x51c1c9.peers[_0x1a735c].extra : {}, + 'streamid': _0x5e7396.streamid, + 'mediaElement': _0x51c1c9.streamEvents[_0x5e7396.streamid] ? _0x51c1c9.streamEvents[_0x5e7396.streamid].mediaElement : null + }), _0x51c1c9.peersBackup[_0x21b268.userid] && (_0x21b268.extra = _0x51c1c9.peersBackup[_0x21b268.userid].extra), _0x51c1c9.onstreamended(_0x21b268), delete _0x51c1c9.streamEvents[_0x5e7396.streamid]; + }, _0x21b268.onNegotiationNeeded = function(_0x2d936f, _0x4e2d94, _0x5d7bb5) { + _0x5d7bb5 = _0x5d7bb5 || function() {}; + var _0x521a09 = { + 'remoteUserId': _0x4e2d94 = _0x4e2d94 || _0x2d936f.remoteUserId, + 'message': _0x2d936f = _0x2d936f || '', + 'sender': _0x51c1c9.userid + }; + _0x2d936f.remoteUserId && _0x2d936f.message && _0x2d936f.sender && (_0x521a09 = _0x2d936f), _0x2db9d8(function() { + _0x51c1c9.socket.emit(_0x51c1c9.socketMessageEvent, _0x521a09, _0x5d7bb5); + }); + }, _0x21b268.onUserLeft = function(_0x76e281) { + _0x51c1c9.deletePeer(_0x76e281); + }, _0x21b268.disconnectWith = function(_0x88879c, _0x323747) { + _0x51c1c9.socket && _0x51c1c9.socket.emit('disconnect-with', _0x88879c, _0x323747 || function() {}), _0x51c1c9.deletePeer(_0x88879c); + }, _0x51c1c9.socketOptions = { + 'transport': 'polling' + }, _0x51c1c9.openOrJoin = function(_0x66fc69, _0xba3fb1) { + _0xba3fb1 = _0xba3fb1 || function() {}, _0x51c1c9.checkPresence(_0x66fc69, function(_0x1c5cec, _0x207cb3) { + if (_0x1c5cec) { + _0x51c1c9.sessionid = _0x207cb3; + var _0x521a09, _0x429662, _0x22a5af = !!_0x51c1c9.session.oneway, + _0x5851c5 = _0x5deab2(_0x51c1c9.session); + _0x429662 = { + 'OfferToReceiveAudio': _0x51c1c9.sdpConstraints.mandatory.OfferToReceiveAudio, + 'OfferToReceiveVideo': _0x51c1c9.sdpConstraints.mandatory.OfferToReceiveVideo + }, _0x521a09 = { + 'OfferToReceiveAudio': _0x22a5af ? !!_0x51c1c9.session.audio : _0x51c1c9.sdpConstraints.mandatory.OfferToReceiveAudio, + 'OfferToReceiveVideo': _0x22a5af ? !!_0x51c1c9.session.video || !!_0x51c1c9.session.screen : _0x51c1c9.sdpConstraints.mandatory.OfferToReceiveVideo + }; + var _0x3fb79d = { + 'remoteUserId': _0x51c1c9.sessionid, + 'message': { + 'newParticipationRequest': true, + 'isOneWay': _0x22a5af, + 'isDataOnly': _0x5851c5, + 'localPeerSdpConstraints': _0x521a09, + 'remotePeerSdpConstraints': _0x429662 + }, + 'sender': _0x51c1c9.userid + }; + _0x373dce(_0x3fb79d.message, function() { + _0x6a70ac(_0x3fb79d, _0xba3fb1); + }); + } else _0x51c1c9.waitingForLocalMedia = true, _0x51c1c9.isInitiator = true, _0x51c1c9.sessionid = _0x207cb3 || _0x51c1c9.sessionid, _0x5deab2(_0x51c1c9.session) ? _0x484896(_0xba3fb1) : _0x51c1c9.captureUserMedia(function() { + _0x484896(_0xba3fb1); + }); + }); + }, _0x51c1c9.waitingForLocalMedia = !0x1, _0x51c1c9.open = function(_0x572e80, _0x37b154) { + _0x37b154 = _0x37b154 || function() {}, _0x51c1c9.waitingForLocalMedia = true, _0x51c1c9.isInitiator = true, _0x51c1c9.sessionid = _0x572e80 || _0x51c1c9.sessionid, _0x2db9d8(function() { + _0x5deab2(_0x51c1c9.session) ? _0x484896(_0x37b154) : _0x51c1c9.captureUserMedia(function() { + _0x484896(_0x37b154); + }); + }); + }, _0x51c1c9.peersBackup = {}, _0x51c1c9.deletePeer = function(_0x31e4e4) { + if (_0x31e4e4 && _0x51c1c9.peers[_0x31e4e4]) { + var _0x326931 = { + 'userid': _0x31e4e4, + 'extra': _0x51c1c9.peers[_0x31e4e4] ? _0x51c1c9.peers[_0x31e4e4].extra : {} + }; + if (_0x51c1c9.peersBackup[_0x326931.userid] && (_0x326931.extra = _0x51c1c9.peersBackup[_0x326931.userid].extra), _0x51c1c9.onleave(_0x326931), _0x51c1c9.peers[_0x31e4e4]) { + _0x51c1c9.peers[_0x31e4e4].streams.forEach(function(_0x424150) { + _0x424150.stop(); + }); + var _0x21b268 = _0x51c1c9.peers[_0x31e4e4].peer; + if (_0x21b268 && 'closed' !== _0x21b268.iceConnectionState) try { + _0x21b268.close(); + } catch (_0x24b95f) {} + _0x51c1c9.peers[_0x31e4e4] && (_0x51c1c9.peers[_0x31e4e4].peer = null, delete _0x51c1c9.peers[_0x31e4e4]); + } + } + }, _0x51c1c9.rejoin = function(_0x22fd47) { + if (!_0x51c1c9.isInitiator && _0x22fd47 && Object.keys(_0x22fd47).length) { + var _0x326931 = {}; + _0x51c1c9.peers[_0x22fd47.remoteUserId] && (_0x326931 = _0x51c1c9.peers[_0x22fd47.remoteUserId].extra, _0x51c1c9.deletePeer(_0x22fd47.remoteUserId)), _0x22fd47 && _0x22fd47.remoteUserId && (_0x51c1c9.join(_0x22fd47.remoteUserId), _0x51c1c9.onReConnecting({ + 'userid': _0x22fd47.remoteUserId, + 'extra': _0x326931 + })); + } + }, _0x51c1c9.join = function(_0x4b656a, _0x35b82f) { + _0x51c1c9.sessionid = !!_0x4b656a && (_0x4b656a.sessionid || _0x4b656a.remoteUserId || _0x4b656a) || _0x51c1c9.sessionid, _0x51c1c9.sessionid += ''; + var _0x21b268 = !0x1, + _0x521a09 = !0x1, + _0x20e7ef = !0x1, + _0x4b614d = !0x1; + if (_0x4b656a && _0x4b656a.session || !_0x4b656a || 'string' == typeof _0x4b656a) { + var _0x447147 = _0x4b656a && _0x4b656a.session || _0x51c1c9.session; + _0x20e7ef = !!_0x447147.oneway, _0x4b614d = _0x5deab2(_0x447147), _0x521a09 = { + 'OfferToReceiveAudio': _0x51c1c9.sdpConstraints.mandatory.OfferToReceiveAudio, + 'OfferToReceiveVideo': _0x51c1c9.sdpConstraints.mandatory.OfferToReceiveVideo + }, _0x21b268 = { + 'OfferToReceiveAudio': _0x20e7ef ? !!_0x51c1c9.session.audio : _0x51c1c9.sdpConstraints.mandatory.OfferToReceiveAudio, + 'OfferToReceiveVideo': _0x20e7ef ? !!_0x51c1c9.session.video || !!_0x51c1c9.session.screen : _0x51c1c9.sdpConstraints.mandatory.OfferToReceiveVideo + }; + } + var _0x13518b = function() {}; + 'function' == typeof(_0x35b82f = _0x35b82f || {}) && (_0x13518b = _0x35b82f, _0x35b82f = {}), void 0x0 !== _0x35b82f.localPeerSdpConstraints && (_0x21b268 = _0x35b82f.localPeerSdpConstraints), void 0x0 !== _0x35b82f.remotePeerSdpConstraints && (_0x521a09 = _0x35b82f.remotePeerSdpConstraints), void 0x0 !== _0x35b82f.isOneWay && (_0x20e7ef = _0x35b82f.isOneWay), void 0x0 !== _0x35b82f.isDataOnly && (_0x4b614d = _0x35b82f.isDataOnly); + var _0xcceebc = { + 'remoteUserId': _0x51c1c9.sessionid, + 'message': { + 'newParticipationRequest': true, + 'isOneWay': _0x20e7ef, + 'isDataOnly': _0x4b614d, + 'localPeerSdpConstraints': _0x21b268, + 'remotePeerSdpConstraints': _0x521a09 + }, + 'sender': _0x51c1c9.userid + }; + return _0x373dce(_0xcceebc.message, function() { + _0x2db9d8(function() { + _0x6a70ac(_0xcceebc, _0x13518b); + }); + }), _0xcceebc; + }, _0x51c1c9.publicRoomIdentifier = '', _0x51c1c9.getUserMedia = _0x51c1c9.captureUserMedia = function(_0x3ae868, _0x4adbb1) { + _0x3ae868 = _0x3ae868 || function() {}; + var _0x521a09 = _0x4adbb1 || _0x51c1c9.session; + _0x51c1c9.dontCaptureUserMedia || _0x5deab2(_0x521a09) ? _0x3ae868() : (_0x521a09.audio || _0x521a09.video || _0x521a09.screen) && (_0x521a09.screen ? 'Edge' === DetectRTC.browser.name ? navigator.getDisplayMedia({ + 'video': true, + 'audio': _0x93df62(_0x51c1c9) + }).then(function(_0x31597a) { + if (_0x31597a.isScreen = true, _0x21b268.onGettingLocalMedia(_0x31597a), !_0x521a09.audio && !_0x521a09.video || _0x93df62(_0x51c1c9)) _0x3ae868(_0x31597a); + else { + var _0x76c694 = {}; + for (var _0x1bab2d in _0x521a09) 'screen' !== _0x1bab2d && (_0x76c694[_0x1bab2d] = _0x521a09[_0x1bab2d]); + _0x51c1c9.invokeGetUserMedia(_0x4adbb1, _0x3ae868, _0x76c694); + } + }, function(_0x286f92) { + console.error('Unable to capture screen on Edge. HTTPs and version 17+ is required.'); + }) : _0x51c1c9.getScreenConstraints(function(_0x33fd74, _0x4af197) { + if (_0x33fd74) throw _0x33fd74; + _0x51c1c9.invokeGetUserMedia({ + 'audio': !!_0x93df62(_0x51c1c9) && _0x405170(_0x4af197), + 'video': _0x4af197, + 'isScreen': true + }, function(_0x295451) { + if (!_0x521a09.audio && !_0x521a09.video || _0x93df62(_0x51c1c9)) _0x3ae868(_0x295451); + else { + var _0x4af197 = {}; + for (var _0x3fbf75 in _0x521a09) 'screen' !== _0x3fbf75 && (_0x4af197[_0x3fbf75] = _0x521a09[_0x3fbf75]); + _0x51c1c9.invokeGetUserMedia(_0x4adbb1, _0x3ae868, _0x4af197); + } + }); + }) : (_0x521a09.audio || _0x521a09.video) && _0x51c1c9.invokeGetUserMedia(_0x4adbb1, _0x3ae868, _0x521a09)); + }, _0x51c1c9.onbeforeunload = function(_0x403853, _0xcfe5cf) { + _0x51c1c9.closeBeforeUnload && (_0x51c1c9.peers.getAllParticipants().forEach(function(_0x135225) { + _0x21b268.onNegotiationNeeded({ + 'userLeft': true + }, _0x135225), _0x51c1c9.peers[_0x135225] && _0x51c1c9.peers[_0x135225].peer && _0x51c1c9.peers[_0x135225].peer.close(), delete _0x51c1c9.peers[_0x135225]; + }), _0xcfe5cf || _0x51c1c9.closeSocket(), _0x51c1c9.isInitiator = !0x1); + }, window.ignoreBeforeUnload ? _0x51c1c9.closeBeforeUnload = !0x1 : (_0x51c1c9.closeBeforeUnload = true, window.addEventListener('beforeunload', _0x51c1c9.onbeforeunload, !0x1)), _0x51c1c9.userid = _0x5b8d5d(), _0x51c1c9.changeUserId = function(_0x305ce9, _0x4c71e8) { + _0x4c71e8 = _0x4c71e8 || function() {}, _0x51c1c9.userid = _0x305ce9 || _0x5b8d5d(), _0x51c1c9.socket.emit('changed-uuid', _0x51c1c9.userid, _0x4c71e8); + }, _0x51c1c9.extra = {}, _0x51c1c9.attachStreams = [], _0x51c1c9.session = { + 'audio': true, + 'video': true + }, _0x51c1c9.enableFileSharing = !0x1, _0x51c1c9.bandwidth = { + 'screen': !0x1, + 'audio': !0x1, + 'video': !0x1 + }, _0x51c1c9.codecs = { + 'audio': 'opus', + 'video': 'VP9' + }, _0x51c1c9.processSdp = function(_0xec5090) { + return _0x5407aa() ? _0xec5090 : 'Safari' === DetectRTC.browser.name ? _0xec5090 : ('VP8' === _0x51c1c9.codecs.video.toUpperCase() && (_0xec5090 = _0x42fdaa.preferCodec(_0xec5090, 'vp8')), 'VP9' === _0x51c1c9.codecs.video.toUpperCase() && (_0xec5090 = _0x42fdaa.preferCodec(_0xec5090, 'vp9')), 'H264' === _0x51c1c9.codecs.video.toUpperCase() && (_0xec5090 = _0x42fdaa.preferCodec(_0xec5090, 'h264')), 'G722' === _0x51c1c9.codecs.audio && (_0xec5090 = _0x42fdaa.removeNonG722(_0xec5090)), 'Firefox' === DetectRTC.browser.name ? _0xec5090 : ((_0x51c1c9.bandwidth.video || _0x51c1c9.bandwidth.screen) && (_0xec5090 = _0x42fdaa.setApplicationSpecificBandwidth(_0xec5090, _0x51c1c9.bandwidth, !!_0x51c1c9.session.screen)), _0x51c1c9.bandwidth.video && (_0xec5090 = _0x42fdaa.setVideoBitrates(_0xec5090, { + 'min': 0x8 * _0x51c1c9.bandwidth.video * 0x400, + 'max': 0x8 * _0x51c1c9.bandwidth.video * 0x400 + })), _0x51c1c9.bandwidth.audio && (_0xec5090 = _0x42fdaa.setOpusAttributes(_0xec5090, { + 'maxaveragebitrate': 0x8 * _0x51c1c9.bandwidth.audio * 0x400, + 'maxplaybackrate': 0x8 * _0x51c1c9.bandwidth.audio * 0x400, + 'stereo': 0x1, + 'maxptime': 0x3 + })), _0xec5090)); + }, void 0x0 !== _0x42fdaa && (_0x51c1c9.BandwidthHandler = _0x51c1c9.CodecsHandler = _0x42fdaa), _0x51c1c9.mediaConstraints = { + 'audio': { + 'mandatory': {}, + 'optional': _0x51c1c9.bandwidth.audio ? [{ + 'bandwidth': 0x8 * _0x51c1c9.bandwidth.audio * 0x400 || 0x100000 + }] : [] + }, + 'video': { + 'mandatory': {}, + 'optional': _0x51c1c9.bandwidth.video ? [{ + 'bandwidth': 0x8 * _0x51c1c9.bandwidth.video * 0x400 || 0x100000 + }, { + 'facingMode': 'user' + }] : [{ + 'facingMode': 'user' + }] + } + }, 'Firefox' === DetectRTC.browser.name && (_0x51c1c9.mediaConstraints = { + 'audio': true, + 'video': true + }), _0x326931.useDefaultDevices || DetectRTC.isMobileDevice || DetectRTC.load(function() { + var _0x1056a5, _0x326931; + if (DetectRTC.MediaDevices.forEach(function(_0x1e1549) { + 'audioinput' === _0x1e1549.kind && !0x1 !== _0x51c1c9.mediaConstraints.audio && (_0x1056a5 = _0x1e1549), 'videoinput' === _0x1e1549.kind && !0x1 !== _0x51c1c9.mediaConstraints.video && (_0x326931 = _0x1e1549); + }), _0x1056a5) { + if ('Firefox' === DetectRTC.browser.name) return void(true !== _0x51c1c9.mediaConstraints.audio ? _0x51c1c9.mediaConstraints.audio.deviceId = _0x1056a5.id : _0x51c1c9.mediaConstraints.audio = { + 'deviceId': _0x1056a5.id + }); + 0x1 == _0x51c1c9.mediaConstraints.audio && (_0x51c1c9.mediaConstraints.audio = { + 'mandatory': {}, + 'optional': [] + }), _0x51c1c9.mediaConstraints.audio.optional || (_0x51c1c9.mediaConstraints.audio.optional = []); + var _0x21b268 = [{ + 'sourceId': _0x1056a5.id + }]; + _0x51c1c9.mediaConstraints.audio.optional = _0x21b268.concat(_0x51c1c9.mediaConstraints.audio.optional); + } + if (_0x326931) { + if ('Firefox' === DetectRTC.browser.name) return void(true !== _0x51c1c9.mediaConstraints.video ? _0x51c1c9.mediaConstraints.video.deviceId = _0x326931.id : _0x51c1c9.mediaConstraints.video = { + 'deviceId': _0x326931.id + }); + 0x1 == _0x51c1c9.mediaConstraints.video && (_0x51c1c9.mediaConstraints.video = { + 'mandatory': {}, + 'optional': [] + }), _0x51c1c9.mediaConstraints.video.optional || (_0x51c1c9.mediaConstraints.video.optional = []); + _0x21b268 = [{ + 'sourceId': _0x326931.id + }]; + _0x51c1c9.mediaConstraints.video.optional = _0x21b268.concat(_0x51c1c9.mediaConstraints.video.optional); + } + }), _0x51c1c9.sdpConstraints = { + 'mandatory': { + 'OfferToReceiveAudio': true, + 'OfferToReceiveVideo': true + }, + 'optional': [{ + 'VoiceActivityDetection': !0x1 + }] + }, _0x51c1c9.sdpSemantics = null, _0x51c1c9.iceCandidatePoolSize = null, _0x51c1c9.bundlePolicy = null, _0x51c1c9.rtcpMuxPolicy = null, _0x51c1c9.iceTransportPolicy = null, _0x51c1c9.optionalArgument = { + 'optional': [{ + 'DtlsSrtpKeyAgreement': true + }, { + 'googImprovedWifiBwe': true + }, { + 'googScreencastMinBitrate': 0x12c + }, { + 'googIPv6': true + }, { + 'googDscp': true + }, { + 'googCpuUnderuseThreshold': 0x37 + }, { + 'googCpuOveruseThreshold': 0x55 + }, { + 'googSuspendBelowMinBitrate': true + }, { + 'googCpuOveruseDetection': true + }], + 'mandatory': {} + }, _0x51c1c9.iceServers = _0x3b9609.getIceServers(_0x51c1c9), _0x51c1c9.candidates = { + 'host': true, + 'stun': true, + 'turn': true + }, _0x51c1c9.iceProtocols = { + 'tcp': true, + 'udp': true + }, _0x51c1c9.onopen = function(_0x44d923) { + _0x51c1c9.enableLogs && console.info('Data connection has been opened between you & ', _0x44d923.userid); + }, _0x51c1c9.onclose = function(_0x4bc33b) { + _0x51c1c9.enableLogs && console.warn('Data connection has been closed between you & ', _0x4bc33b.userid); + }, _0x51c1c9.onerror = function(_0x119131) { + _0x51c1c9.enableLogs && console.error(_0x119131.userid, 'data-error', _0x119131); + }, _0x51c1c9.onmessage = function(_0x377929) { + _0x51c1c9.enableLogs && console.debug('data-message', _0x377929.userid, _0x377929.data); + }, _0x51c1c9.send = function(_0x21e29b, _0x2e0c9a) { + _0x51c1c9.peers.send(_0x21e29b, _0x2e0c9a); + }, _0x51c1c9.close = _0x51c1c9.disconnect = _0x51c1c9.leave = function() { + _0x51c1c9.onbeforeunload(!0x1, true); + }, _0x51c1c9.closeEntireSession = function(_0x5971f7) { + _0x5971f7 = _0x5971f7 || function() {}, _0x51c1c9.socket.emit('close-entire-session', function _0x326931() { + _0x51c1c9.getAllParticipants().length ? setTimeout(_0x326931, 0x64) : (_0x51c1c9.onEntireSessionClosed({ + 'sessionid': _0x51c1c9.sessionid, + 'userid': _0x51c1c9.userid, + 'extra': _0x51c1c9.extra + }), _0x51c1c9.changeUserId(null, function() { + _0x51c1c9.close(), _0x5971f7(); + })); + }); + }, _0x51c1c9.onEntireSessionClosed = function(_0x308fc8) { + _0x51c1c9.enableLogs && console.info('Entire session is closed: ', _0x308fc8.sessionid, _0x308fc8.extra); + }, _0x51c1c9.onstream = function(_0x2795c9) { + var _0x326931 = _0x51c1c9.videosContainer; + _0x326931.insertBefore(_0x2795c9.mediaElement, _0x326931.firstChild); + var _0x21b268 = _0x2795c9.mediaElement.play(); + void 0x0 === _0x21b268 ? setTimeout(function() { + _0x2795c9.mediaElement.play(); + }, 0x7d0) : _0x21b268.catch(function() {}).then(function() { + setTimeout(function() { + _0x2795c9.mediaElement.play(); + }, 0x7d0); + }); + }, _0x51c1c9.onstreamended = function(_0x22b684) { + _0x22b684.mediaElement || (_0x22b684.mediaElement = document.getElementById(_0x22b684.streamid)), _0x22b684.mediaElement && _0x22b684.mediaElement.parentNode && _0x22b684.mediaElement.parentNode.removeChild(_0x22b684.mediaElement); + }, _0x51c1c9.direction = 'many-to-many', _0x51c1c9.removeStream = function(_0x5af7be, _0x17537a) { + var _0x21b268; + _0x51c1c9.attachStreams.forEach(function(_0xc4fbb0) { + _0xc4fbb0.id === _0x5af7be && (_0x21b268 = _0xc4fbb0); + }), _0x21b268 ? (_0x51c1c9.peers.getAllParticipants().forEach(function(_0x2bd479) { + if (!_0x17537a || _0x2bd479 === _0x17537a) { + var _0x521a09 = _0x51c1c9.peers[_0x2bd479]; + try { + _0x521a09.peer.removeStream(_0x21b268); + } catch (_0x159ea4) {} + } + }), _0x51c1c9.renegotiate()) : console.warn('No such stream exist.', _0x5af7be); + }, _0x51c1c9.addStream = function(_0x44d589, _0x5d1f28) { + if (_0x44d589.getTracks) return -0x1 === _0x51c1c9.attachStreams.indexOf(_0x44d589) && (_0x44d589.streamid || (_0x44d589.streamid = _0x44d589.id), _0x51c1c9.attachStreams.push(_0x44d589)), void _0x51c1c9.renegotiate(_0x5d1f28); + + function _0x5a47df(_0x4cd18b) { + _0x44d589.streamCallback && _0x44d589.streamCallback(_0x4cd18b), _0x51c1c9.renegotiate(_0x5d1f28); + } + _0x5deab2(_0x44d589) ? _0x51c1c9.renegotiate(_0x5d1f28) : (_0x44d589.audio || _0x44d589.video || _0x44d589.screen) && (_0x44d589.screen ? 'Edge' === DetectRTC.browser.name ? navigator.getDisplayMedia({ + 'video': true, + 'audio': _0x93df62(_0x51c1c9) + }).then(function(_0x3bef4d) { + _0x3bef4d.isScreen = true, _0x21b268.onGettingLocalMedia(_0x3bef4d), !_0x44d589.audio && !_0x44d589.video || _0x93df62(_0x51c1c9) ? _0x5a47df(_0x3bef4d) : _0x51c1c9.invokeGetUserMedia(null, function(_0x108d5e) { + _0x5a47df(_0x108d5e); + }); + }, function(_0x107d05) { + console.error('Unable to capture screen on Edge. HTTPs and version 17+ is required.'); + }) : _0x51c1c9.getScreenConstraints(function(_0x247e33, _0x20dba5) { + if (_0x247e33) return 'PermissionDeniedError' === _0x247e33 ? (_0x44d589.streamCallback && _0x44d589.streamCallback(null), void(_0x51c1c9.enableLogs && console.error('User rejected to share his screen.'))) : alert(_0x247e33); + _0x51c1c9.invokeGetUserMedia({ + 'audio': !!_0x93df62(_0x51c1c9) && _0x405170(_0x20dba5), + 'video': _0x20dba5, + 'isScreen': true + }, function(_0x3558fb) { + !_0x44d589.audio && !_0x44d589.video || _0x93df62(_0x51c1c9) ? _0x5a47df(_0x3558fb) : _0x51c1c9.invokeGetUserMedia(null, function(_0x301cff) { + _0x5a47df(_0x301cff); + }); + }); + }) : (_0x44d589.audio || _0x44d589.video) && _0x51c1c9.invokeGetUserMedia(null, _0x5a47df)); + }, _0x51c1c9.invokeGetUserMedia = function(_0x39db84, _0x4c2007, _0x587a84) { + _0x587a84 || (_0x587a84 = _0x51c1c9.session), _0x39db84 || (_0x39db84 = _0x51c1c9.mediaConstraints), _0x5adfda({ + 'onGettingLocalMedia': function(_0x4608af) { + var _0x587a84 = _0x39db84.video; + _0x587a84 && (_0x587a84.mediaSource || _0x587a84.mozMediaSource ? _0x4608af.isScreen = true : _0x587a84.mandatory && _0x587a84.mandatory.chromeMediaSource && (_0x4608af.isScreen = true)), _0x4608af.isScreen || (_0x4608af.isVideo = !!_0x2cbba5(_0x4608af, 'video').length, _0x4608af.isAudio = !_0x4608af.isVideo && _0x2cbba5(_0x4608af, 'audio').length), _0x21b268.onGettingLocalMedia(_0x4608af, function() { + 'function' == typeof _0x4c2007 && _0x4c2007(_0x4608af); + }); + }, + 'onLocalMediaError': function(_0x290ef1, _0x3a75f5) { + _0x21b268.onLocalMediaError(_0x290ef1, _0x3a75f5); + }, + 'localMediaConstraints': _0x39db84 || { + 'audio': !!_0x587a84.audio && _0x39db84.audio, + 'video': !!_0x587a84.video && _0x39db84.video + } + }); + }, _0x51c1c9.applyConstraints = function(_0x314dfa, _0x295b4a) { + if (_0x1d01b4 && _0x1d01b4.prototype.applyConstraints) { + var _0x21b268; + if (_0x295b4a) return _0x51c1c9.streamEvents[_0x295b4a] && (_0x21b268 = _0x51c1c9.streamEvents[_0x295b4a].stream), void _0x2559f7(_0x21b268, _0x314dfa); + _0x51c1c9.attachStreams.forEach(function(_0x4e7a56) { + _0x2559f7(_0x4e7a56, _0x314dfa); + }); + } else alert('track.applyConstraints is NOT supported in your browser.'); + }, _0x51c1c9.replaceTrack = function(_0x3642cb, _0xd04c26, _0x485038) { + if (_0x3642cb = _0x3642cb || {}, _0x2a4be1.prototype.getSenders) + if (_0x3642cb instanceof _0x1d01b4) _0x44cd42(_0x3642cb, _0xd04c26, _0x485038); + else { + if (_0x3642cb instanceof _0x1d809b) return _0x2cbba5(_0x3642cb, 'video').length && _0x44cd42(_0x2cbba5(_0x3642cb, 'video')[0x0], _0xd04c26, true), void(_0x2cbba5(_0x3642cb, 'audio').length && _0x44cd42(_0x2cbba5(_0x3642cb, 'audio')[0x0], _0xd04c26, !0x1)); + if (_0x5deab2(_0x3642cb)) throw 'connection.replaceTrack requires audio and/or video and/or screen.'; + (_0x3642cb.audio || _0x3642cb.video || _0x3642cb.screen) && (_0x3642cb.screen ? 'Edge' === DetectRTC.browser.name ? navigator.getDisplayMedia({ + 'video': true, + 'audio': _0x93df62(_0x51c1c9) + }).then(function(_0x675faf) { + _0x675faf.isScreen = true, _0x21b268.onGettingLocalMedia(_0x675faf), !_0x3642cb.audio && !_0x3642cb.video || _0x93df62(_0x51c1c9) ? _0x564a08(_0x675faf) : _0x51c1c9.invokeGetUserMedia(null, _0x564a08); + }, function(_0x4219c9) { + console.error('Unable to capture screen on Edge. HTTPs and version 17+ is required.'); + }) : _0x51c1c9.getScreenConstraints(function(_0x38cb24, _0x2fa66e) { + if (_0x38cb24) return alert(_0x38cb24); + _0x51c1c9.invokeGetUserMedia({ + 'audio': !!_0x93df62(_0x51c1c9) && _0x405170(_0x2fa66e), + 'video': _0x2fa66e, + 'isScreen': true + }, !_0x3642cb.audio && !_0x3642cb.video || _0x93df62(_0x51c1c9) ? _0x564a08 : _0x51c1c9.invokeGetUserMedia(null, _0x564a08)); + }) : (_0x3642cb.audio || _0x3642cb.video) && _0x51c1c9.invokeGetUserMedia(null, _0x564a08)); + } + else _0x51c1c9.addStream(_0x3642cb); + + function _0x564a08(_0x547ff0) { + _0x51c1c9.replaceTrack(_0x547ff0, _0xd04c26, _0x485038 || _0x3642cb.video || _0x3642cb.screen); + } + }, _0x51c1c9.resetTrack = function(_0x1215de, _0x3d0c09) { + _0x1215de || (_0x1215de = _0x51c1c9.getAllParticipants()), 'string' == typeof _0x1215de && (_0x1215de = [_0x1215de]), _0x1215de.forEach(function(_0x17e765) { + var _0x21b268 = _0x51c1c9.peers[_0x17e765].peer; + void 0x0 !== _0x3d0c09 && true !== _0x3d0c09 || !_0x21b268.lastVideoTrack || _0x51c1c9.replaceTrack(_0x21b268.lastVideoTrack, _0x17e765, true), void 0x0 !== _0x3d0c09 && !0x1 !== _0x3d0c09 || !_0x21b268.lastAudioTrack || _0x51c1c9.replaceTrack(_0x21b268.lastAudioTrack, _0x17e765, !0x1); + }); + }, _0x51c1c9.renegotiate = function(_0x2ea770) { + _0x2ea770 ? _0x21b268.renegotiatePeer(_0x2ea770) : _0x51c1c9.peers.getAllParticipants().forEach(function(_0x428915) { + _0x21b268.renegotiatePeer(_0x428915); + }); + }, _0x51c1c9.setStreamEndHandler = function(_0x46fab4, _0x3cea1b) { + if (_0x46fab4 && _0x46fab4.addEventListener && (_0x3cea1b = !!_0x3cea1b, !_0x46fab4.alreadySetEndHandler)) { + _0x46fab4.alreadySetEndHandler = true; + var _0x21b268 = 'ended'; + 'oninactive' in _0x46fab4 && (_0x21b268 = 'inactive'), _0x46fab4.addEventListener(_0x21b268, function() { + if (_0x46fab4.idInstance && currentUserMediaRequest.remove(_0x46fab4.idInstance), !_0x3cea1b) { + var _0x21b268 = []; + _0x51c1c9.attachStreams.forEach(function(_0x35d5da) { + _0x35d5da.id != _0x46fab4.id && _0x21b268.push(_0x35d5da); + }), _0x51c1c9.attachStreams = _0x21b268; + } + var _0x521a09 = _0x51c1c9.streamEvents[_0x46fab4.streamid]; + if (_0x521a09 || (_0x521a09 = { + 'stream': _0x46fab4, + 'streamid': _0x46fab4.streamid, + 'type': _0x3cea1b ? 'remote' : 'local', + 'userid': _0x51c1c9.userid, + 'extra': _0x51c1c9.extra, + 'mediaElement': _0x51c1c9.streamEvents[_0x46fab4.streamid] ? _0x51c1c9.streamEvents[_0x46fab4.streamid].mediaElement : null + }), _0x3cea1b && _0x51c1c9.peers[_0x521a09.userid]) { + var _0x38a800 = _0x51c1c9.peers[_0x521a09.userid].peer; + _0x21b268 = []; + _0x38a800.getRemoteStreams().forEach(function(_0x59d565) { + _0x59d565.id != _0x46fab4.id && _0x21b268.push(_0x59d565); + }), _0x51c1c9.peers[_0x521a09.userid].streams = _0x21b268; + } + _0x521a09.userid === _0x51c1c9.userid && 'remote' === _0x521a09.type || (_0x51c1c9.peersBackup[_0x521a09.userid] && (_0x521a09.extra = _0x51c1c9.peersBackup[_0x521a09.userid].extra), _0x51c1c9.onstreamended(_0x521a09), delete _0x51c1c9.streamEvents[_0x46fab4.streamid]); + }, !0x1); + } + }, _0x51c1c9.onMediaError = function(_0x77c67c, _0x3533b2) { + _0x51c1c9.enableLogs && console.error(_0x77c67c, _0x3533b2); + }, _0x51c1c9.autoCloseEntireSession = !0x1, _0x51c1c9.filesContainer = _0x51c1c9.videosContainer = document.body || document.documentElement, _0x51c1c9.isInitiator = !0x1, _0x51c1c9.shareFile = _0x21b268.shareFile, void 0x0 !== _0x2cf1f3 && _0x2cf1f3.handle(_0x51c1c9), void 0x0 !== _0x400337 && _0x400337.handle(_0x51c1c9), _0x51c1c9.token = _0x5b8d5d, _0x51c1c9.onNewParticipant = function(_0xeb9f65, _0xbff370) { + _0x51c1c9.acceptParticipationRequest(_0xeb9f65, _0xbff370); + }, _0x51c1c9.acceptParticipationRequest = function(_0xdc5fa8, _0x444726) { + _0x444726.successCallback && (_0x444726.successCallback(), delete _0x444726.successCallback), _0x21b268.createNewPeer(_0xdc5fa8, _0x444726); + }, void 0x0 !== _0x25e82e && (_0x51c1c9.StreamsHandler = _0x25e82e), _0x51c1c9.onleave = function(_0x256c0a) {}, _0x51c1c9.invokeSelectFileDialog = function(_0x54e1d5) { + var _0x326931 = new _0x2e28ea(); + _0x326931.accept = '*.*', _0x326931.selectSingleFile(_0x54e1d5); + }, _0x51c1c9.onmute = function(_0x4cea9f) { + if (_0x4cea9f && _0x4cea9f.mediaElement) + if ('both' === _0x4cea9f.muteType || 'video' === _0x4cea9f.muteType) { + _0x4cea9f.mediaElement.src = null; + var _0x326931 = _0x4cea9f.mediaElement.pause(); + void 0x0 !== _0x326931 ? _0x326931.then(function() { + _0x4cea9f.mediaElement.poster = _0x4cea9f.snapshot || 'https://cdn.webrtc-experiment.com/images/muted.png'; + }) : _0x4cea9f.mediaElement.poster = _0x4cea9f.snapshot || 'https://cdn.webrtc-experiment.com/images/muted.png'; + } else 'audio' === _0x4cea9f.muteType && (_0x4cea9f.mediaElement.muted = true); + }, _0x51c1c9.onunmute = function(_0x59c1a4) { + _0x59c1a4 && _0x59c1a4.mediaElement && _0x59c1a4.stream && ('both' === _0x59c1a4.unmuteType || 'video' === _0x59c1a4.unmuteType ? (_0x59c1a4.mediaElement.poster = null, _0x59c1a4.mediaElement.srcObject = _0x59c1a4.stream, _0x59c1a4.mediaElement.play()) : 'audio' === _0x59c1a4.unmuteType && (_0x59c1a4.mediaElement.muted = !0x1)); + }, _0x51c1c9.onExtraDataUpdated = function(_0x429b15) { + _0x429b15.status = 'online', _0x51c1c9.onUserStatusChanged(_0x429b15, true); + }, _0x51c1c9.getAllParticipants = function(_0x57626c) { + return _0x51c1c9.peers.getAllParticipants(_0x57626c); + }, void 0x0 !== _0x25e82e && (_0x25e82e.onSyncNeeded = function(_0x45be06, _0x6b0c44, _0xe6bdb1) { + _0x51c1c9.peers.getAllParticipants().forEach(function(_0x26b256) { + _0x21b268.onNegotiationNeeded({ + 'streamid': _0x45be06, + 'action': _0x6b0c44, + 'streamSyncNeeded': true, + 'type': _0xe6bdb1 || 'both' + }, _0x26b256); + }); + }), _0x51c1c9.connectSocket = function(_0x5d44b4) { + _0x2db9d8(_0x5d44b4); + }, _0x51c1c9.closeSocket = function() { + try { + _0x31267b.a.sockets = {}; + } catch (_0x3aa9a3) {} + _0x51c1c9.socket && ('function' == typeof _0x51c1c9.socket.disconnect && _0x51c1c9.socket.disconnect(), 'function' == typeof _0x51c1c9.socket.resetProps && _0x51c1c9.socket.resetProps(), _0x51c1c9.socket = null); + }, _0x51c1c9.getSocket = function(_0x456c98) { + return !_0x456c98 && _0x51c1c9.enableLogs && console.warn('getSocket.callback paramter is required.'), _0x456c98 = _0x456c98 || function() {}, _0x51c1c9.socket ? _0x456c98(_0x51c1c9.socket) : _0x2db9d8(function() { + _0x456c98(_0x51c1c9.socket); + }), _0x51c1c9.socket; + }, _0x51c1c9.getRemoteStreams = _0x21b268.getRemoteStreams; + var _0x521c36 = ['selectFirst', 'selectAll', 'forEach']; + if (_0x51c1c9.streamEvents = { + 'selectFirst': function(_0x38ce07) { + return _0x51c1c9.streamEvents.selectAll(_0x38ce07)[0x0]; + }, + 'selectAll': function(_0x4b13fa) { + _0x4b13fa || (_0x4b13fa = { + 'local': true, + 'remote': true, + 'isScreen': true, + 'isAudio': true, + 'isVideo': true + }), 'local' == _0x4b13fa && (_0x4b13fa = { + 'local': true + }), 'remote' == _0x4b13fa && (_0x4b13fa = { + 'remote': true + }), 'screen' == _0x4b13fa && (_0x4b13fa = { + 'isScreen': true + }), 'audio' == _0x4b13fa && (_0x4b13fa = { + 'isAudio': true + }), 'video' == _0x4b13fa && (_0x4b13fa = { + 'isVideo': true + }); + var _0x326931 = []; + return Object.keys(_0x51c1c9.streamEvents).forEach(function(_0x59aced) { + var _0x521a09 = _0x51c1c9.streamEvents[_0x59aced]; + if (-0x1 === _0x521c36.indexOf(_0x59aced)) { + var _0x293b8c = true; + _0x4b13fa.local && 'local' === _0x521a09.type && (_0x293b8c = !0x1), _0x4b13fa.remote && 'remote' === _0x521a09.type && (_0x293b8c = !0x1), _0x4b13fa.isScreen && _0x521a09.stream.isScreen && (_0x293b8c = !0x1), _0x4b13fa.isVideo && _0x521a09.stream.isVideo && (_0x293b8c = !0x1), _0x4b13fa.isAudio && _0x521a09.stream.isAudio && (_0x293b8c = !0x1), _0x4b13fa.userid && _0x521a09.userid === _0x4b13fa.userid && (_0x293b8c = !0x1), !0x1 === _0x293b8c && _0x326931.push(_0x521a09); + } + }), _0x326931; + } + }, _0x51c1c9.socketURL = '/', _0x51c1c9.socketMessageEvent = 'RTCMultiConnection-Message', _0x51c1c9.socketCustomEvent = 'RTCMultiConnection-Custom-Message', _0x51c1c9.DetectRTC = DetectRTC, _0x51c1c9.setCustomSocketEvent = function(_0x1a650b) { + _0x1a650b && (_0x51c1c9.socketCustomEvent = _0x1a650b), _0x51c1c9.socket && _0x51c1c9.socket.emit('set-custom-socket-event-listener', _0x51c1c9.socketCustomEvent); + }, _0x51c1c9.getNumberOfBroadcastViewers = function(_0x2acdba, _0x377d0c) { + _0x51c1c9.socket && _0x2acdba && _0x377d0c && _0x51c1c9.socket.emit('get-number-of-users-in-specific-broadcast', _0x2acdba, _0x377d0c); + }, _0x51c1c9.onNumberOfBroadcastViewersUpdated = function(_0x617e81) { + _0x51c1c9.enableLogs && _0x51c1c9.isInitiator && console.info('Number of broadcast (', _0x617e81.broadcastId, ') viewers', _0x617e81.numberOfBroadcastViewers); + }, _0x51c1c9.onUserStatusChanged = function(_0x49e25f, _0x405028) { + _0x51c1c9.enableLogs && !_0x405028 && console.info(_0x49e25f.userid, _0x49e25f.status); + }, _0x51c1c9.getUserMediaHandler = _0x5adfda, _0x51c1c9.multiPeersHandler = _0x21b268, _0x51c1c9.enableLogs = true, _0x51c1c9.setCustomSocketHandler = function(_0x5840b1) { + void 0x0 !== _0x45c30f && (_0x45c30f = _0x5840b1); + }, _0x51c1c9.chunkSize = 0x9c40, _0x51c1c9.maxParticipantsAllowed = 0x3e8, _0x51c1c9.disconnectWith = _0x21b268.disconnectWith, _0x51c1c9.checkPresence = function(_0x2c66c1, _0xdf4545) { + _0x2c66c1 = _0x2c66c1 || _0x51c1c9.sessionid, 'SSEConnection' !== _0x45c30f.name ? _0x51c1c9.socket ? _0x51c1c9.socket.emit('check-presence', _0x2c66c1 + '', function(_0x4d585b, _0xfb6315, _0x414b29) { + _0x51c1c9.enableLogs && console.log('checkPresence.isRoomExist: ', _0x4d585b, ' roomid: ', _0xfb6315), _0xdf4545(_0x4d585b, _0xfb6315, _0x414b29); + }) : _0x51c1c9.connectSocket(function() { + _0x51c1c9.checkPresence(_0x2c66c1, _0xdf4545); + }) : SSEConnection.checkPresence(_0x2c66c1, function(_0x2d2553, _0x169410, _0x48e686) { + if (!_0x51c1c9.socket) return _0x2d2553 || (_0x51c1c9.userid = _0x169410), void _0x51c1c9.connectSocket(function() { + _0xdf4545(_0x2d2553, _0x169410, _0x48e686); + }); + _0xdf4545(_0x2d2553, _0x169410); + }); + }, _0x51c1c9.onReadyForOffer = function(_0x3f207b, _0x32ccc2) { + _0x51c1c9.multiPeersHandler.createNewPeer(_0x3f207b, _0x32ccc2); + }, _0x51c1c9.setUserPreferences = function(_0x371937) { + return _0x51c1c9.dontAttachStream && (_0x371937.dontAttachLocalStream = true), _0x51c1c9.dontGetRemoteStream && (_0x371937.dontGetRemoteStream = true), _0x371937; + }, _0x51c1c9.updateExtraData = function() { + _0x51c1c9.socket.emit('extra-data-updated', _0x51c1c9.extra); + }, _0x51c1c9.enableScalableBroadcast = !0x1, _0x51c1c9.maxRelayLimitPerUser = 0x3, _0x51c1c9.dontCaptureUserMedia = !0x1, _0x51c1c9.dontAttachStream = !0x1, _0x51c1c9.dontGetRemoteStream = !0x1, _0x51c1c9.onReConnecting = function(_0x4ffc93) { + _0x51c1c9.enableLogs && console.info('ReConnecting with', _0x4ffc93.userid, '...'); + }, _0x51c1c9.beforeAddingStream = function(_0xdd57a4) { + return _0xdd57a4; + }, _0x51c1c9.beforeRemovingStream = function(_0x191d70) { + return _0x191d70; + }, _0x51c1c9.checkIfChromeExtensionAvailable = _0x53da88, 'undefined' != typeof isFirefoxExtensionAvailable && (_0x51c1c9.checkIfChromeExtensionAvailable = isFirefoxExtensionAvailable), _0x51c1c9.getChromeExtensionStatus = _0x1f670d, _0x51c1c9.getScreenConstraints = function(_0x3b0f5e, _0x32535a) { + _0x93df62(_0x51c1c9, _0x32535a) && (_0x32535a = true), _0x1c050b(function(_0x19ad7c, _0x5c7f16) { + _0x19ad7c || (_0x5c7f16 = _0x51c1c9.modifyScreenConstraints(_0x5c7f16), _0x3b0f5e(_0x19ad7c, _0x5c7f16)); + }, _0x32535a); + }, _0x51c1c9.modifyScreenConstraints = function(_0x13a10e) { + return _0x13a10e; + }, _0x51c1c9.onPeerStateChanged = function(_0x5d030a) { + _0x51c1c9.enableLogs && -0x1 !== _0x5d030a.iceConnectionState.search(/closed|failed/gi) && console.error('Peer connection is closed between you & ', _0x5d030a.userid, _0x5d030a.extra, 'state:', _0x5d030a.iceConnectionState); + }, _0x51c1c9.isOnline = true, _0x1cbceb('online', function() { + _0x51c1c9.isOnline = true; + }), _0x1cbceb('offline', function() { + _0x51c1c9.isOnline = !0x1; + }), _0x51c1c9.isLowBandwidth = !0x1, navigator && navigator.connection && navigator.connection.type && (_0x51c1c9.isLowBandwidth = -0x1 !== navigator.connection.type.toString().toLowerCase().search(/wifi|cell/g), _0x51c1c9.isLowBandwidth)) { + if (_0x51c1c9.bandwidth = { + 'audio': !0x1, + 'video': !0x1, + 'screen': !0x1 + }, _0x51c1c9.mediaConstraints.audio && _0x51c1c9.mediaConstraints.audio.optional && _0x51c1c9.mediaConstraints.audio.optional.length) { + var _0x4c7586 = []; + _0x51c1c9.mediaConstraints.audio.optional.forEach(function(_0x330c5b) { + void 0x0 === _0x330c5b.bandwidth && _0x4c7586.push(_0x330c5b); + }), _0x51c1c9.mediaConstraints.audio.optional = _0x4c7586; + } + if (_0x51c1c9.mediaConstraints.video && _0x51c1c9.mediaConstraints.video.optional && _0x51c1c9.mediaConstraints.video.optional.length) { + _0x4c7586 = []; + _0x51c1c9.mediaConstraints.video.optional.forEach(function(_0x427f57) { + void 0x0 === _0x427f57.bandwidth && _0x4c7586.push(_0x427f57); + }), _0x51c1c9.mediaConstraints.video.optional = _0x4c7586; + } + } + _0x51c1c9.getExtraData = function(_0xeb7d85, _0x11bbdf) { + if (!_0xeb7d85) throw 'remoteUserId is required.'; + if (!_0x11bbdf) return _0x51c1c9.peers[_0xeb7d85] ? _0x51c1c9.peers[_0xeb7d85].extra : _0x51c1c9.peersBackup[_0xeb7d85] ? _0x51c1c9.peersBackup[_0xeb7d85].extra : {}; + _0x51c1c9.socket.emit('get-remote-user-extra-data', _0xeb7d85, function(_0x2b3ef8, _0x272a14, _0x50b4c5) { + _0x11bbdf(_0x2b3ef8, _0x272a14, _0x50b4c5); + }); + }, _0x326931.autoOpenOrJoin && _0x51c1c9.openOrJoin(_0x51c1c9.sessionid), _0x51c1c9.onUserIdAlreadyTaken = function(_0x375333, _0x594a1c) { + _0x51c1c9.close(), _0x51c1c9.closeSocket(), _0x51c1c9.isInitiator = !0x1, _0x51c1c9.userid = _0x51c1c9.token(), _0x51c1c9.join(_0x51c1c9.sessionid), _0x51c1c9.enableLogs && console.warn('Userid already taken.', _0x375333, 'Your new userid:', _0x51c1c9.userid); + }, _0x51c1c9.trickleIce = true, _0x51c1c9.version = '3.6.5', _0x51c1c9.onSettingLocalDescription = function(_0x5cd808) { + _0x51c1c9.enableLogs && console.info('Set local description for remote user', _0x5cd808.userid); + }, _0x51c1c9.resetScreen = function() { + _0x427b66 = null, DetectRTC && DetectRTC.screen && delete DetectRTC.screen.sourceId, currentUserMediaRequest = { + 'streams': [], + 'mutex': !0x1, + 'queueRequests': [] + }; + }, _0x51c1c9.autoCreateMediaElement = true, _0x51c1c9.password = null, _0x51c1c9.setPassword = function(_0x3fec38, _0x196913) { + _0x196913 = _0x196913 || function() {}, _0x51c1c9.socket ? _0x51c1c9.socket.emit('set-password', _0x3fec38, _0x196913) : (_0x51c1c9.password = _0x3fec38, _0x196913(true, _0x51c1c9.sessionid, null)); + }, _0x51c1c9.errors = { + 'ROOM_NOT_AVAILABLE': 'Room not available', + 'INVALID_PASSWORD': 'Invalid password', + 'USERID_NOT_AVAILABLE': 'User ID does not exist', + 'ROOM_PERMISSION_DENIED': 'Room permission denied', + 'ROOM_FULL': 'Room full', + 'DID_NOT_JOIN_ANY_ROOM': 'Did not join any room yet', + 'INVALID_SOCKET': 'Invalid socket', + 'PUBLIC_IDENTIFIER_MISSING': 'publicRoomIdentifier is required', + 'INVALID_ADMIN_CREDENTIAL': 'Invalid username or password attempted' + }; + }(this); + }; + }.call(this, _0x2fa590(0x49).Buffer, _0x2fa590(0x1f), _0x2fa590(0x31))); +}, window.EJS_main]).default; diff --git a/data/emulator.min.js b/data/emulator.min.js index bfee5f1..c40b7b1 100644 --- a/data/emulator.min.js +++ b/data/emulator.min.js @@ -1 +1 @@ -var EJS=function(o){window.EJS_MODULES=o;var n={},a=[];function i(e){if(n[e])return n[e].exports;a.push(e);var t=n[e]={i:e,l:!1,exports:{}};return o[e].call(t.exports,t,t.exports,i),t.l=!0,t.exports}return window.getUsedModules=function(){return a.sort(function(e,t){return t'+n.localization("CORS Error")+"":t.innerHTML=''+n.localization("Network Error")+""}},null,null,null,null,null,function(e){function t(){if(!(navigator.getGamepads||navigator.webkitGetGamepads))throw new Error("get gamepads not found!");if(this.rAF=window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.requestAnimationFrame,!this.rAF)throw new Error("request animation frame was not found!");this.loop()}t.prototype={gamepads:[],rAF:null,getGamepads:function(){return navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads?navigator.webkitGetGamepads():[]},loop:async function(){this.updateGamepadState(),this.rAF.call(null,this.loop.bind(this))},updateGamepadState:function(){for(var n=this.getGamepads(),o=0;othis.options.threshold){var l={};for(r in this.direction)this.direction.hasOwnProperty(r)&&(l[r]=this.direction[r]);var r,c={};for(r in this.direction={x:n,y:o,angle:t},e.direction=this.direction,l)l[r]===this.direction[r]&&(c[r]=!0);if(c.x&&c.y&&c.angle)return e;c.x&&c.y||this.trigger("plain",e),c.x||this.trigger("plain:"+n,e),c.y||this.trigger("plain:"+o,e),c.angle||this.trigger("dir dir:"+t,e)}return e},o.prototype=new e,(o.constructor=o).id=0,o.prototype.prepareNipples=function(){var e=this,o=e.nipples;o.on=e.on.bind(e),o.off=e.off.bind(e),o.options=e.options,o.destroy=e.destroy.bind(e),o.ids=e.ids,o.id=e.id,o.processOnMove=e.processOnMove.bind(e),o.processOnEnd=e.processOnEnd.bind(e),o.get=function(e){if(void 0===e)return o[0];for(var t=0,n=o.length;t