sokoban
-rw-r--r--(16)04B_30__.TTFbin30728 -> 0 bytes
-rw-r--r--.gitattributes4
-rw-r--r--.github/FUNDING.yml12
-rw-r--r--.github/workflows/export.yml80
-rw-r--r--.gitignore8
-rw-r--r--.gitmodules3
-rw-r--r--04B_19__.TTFbin6632 -> 0 bytes
-rw-r--r--Back.tscn12
-rw-r--r--Box.gd65
-rw-r--r--ButtonHoverStylebox.pngbin94 -> 0 bytes
-rw-r--r--ButtonHoverStylebox.png.import35
-rw-r--r--ButtonHoverStylebox.tres11
-rw-r--r--ButtonStylebox.pngbin103 -> 0 bytes
-rw-r--r--ButtonStylebox.png.import35
-rw-r--r--ButtonStylebox.tres11
-rw-r--r--Check.pngbin215 -> 0 bytes
-rw-r--r--Check.png.import35
-rw-r--r--Crate.tscn76
-rw-r--r--ExplosionEffect.tscn58
-rw-r--r--GameoverScreen.gd25
-rw-r--r--GameoverScreen.tscn72
-rw-r--r--HUD.tscn99
-rw-r--r--LICENSE21
-rw-r--r--Label.gd21
-rw-r--r--Label.tscn27
-rw-r--r--Level.gd304
-rw-r--r--Level.tscn197
-rw-r--r--Levels/1.sokolvl12
-rw-r--r--Levels/10.sokolvl21
-rw-r--r--Levels/11.sokolvl23
-rw-r--r--Levels/12.sokolvl18
-rw-r--r--Levels/13.sokolvl19
-rw-r--r--Levels/14.sokolvl16
-rw-r--r--Levels/15.sokolvl16
-rw-r--r--Levels/16.sokolvl20
-rw-r--r--Levels/17.sokolvl18
-rw-r--r--Levels/18.sokolvl19
-rw-r--r--Levels/19.sokolvl16
-rw-r--r--Levels/2.sokolvl14
-rw-r--r--Levels/20.sokolvl23
-rw-r--r--Levels/21.sokolvl23
-rw-r--r--Levels/22.sokolvl17
-rw-r--r--Levels/23.sokolvl23
-rw-r--r--Levels/24.sokolvl17
-rw-r--r--Levels/25.sokolvl22
-rw-r--r--Levels/26.sokolvl20
-rw-r--r--Levels/27.sokolvl18
-rw-r--r--Levels/28.sokolvl16
-rw-r--r--Levels/29.sokolvl20
-rw-r--r--Levels/3.sokolvl13
-rw-r--r--Levels/30.sokolvl14
-rw-r--r--Levels/31.sokolvl23
-rw-r--r--Levels/32.sokolvl15
-rw-r--r--Levels/33.sokolvl19
-rw-r--r--Levels/34.sokolvl18
-rw-r--r--Levels/35.sokolvl18
-rw-r--r--Levels/36.sokolvl19
-rw-r--r--Levels/37.sokolvl22
-rw-r--r--Levels/38.sokolvl18
-rw-r--r--Levels/39.sokolvl18
-rw-r--r--Levels/4.sokolvl13
-rw-r--r--Levels/40.sokolvl21
-rw-r--r--Levels/41.sokolvl14
-rw-r--r--Levels/42.sokolvl18
-rw-r--r--Levels/43.sokolvl21
-rw-r--r--Levels/44.sokolvl19
-rw-r--r--Levels/45.sokolvl22
-rw-r--r--Levels/46.sokolvl14
-rw-r--r--Levels/47.sokolvl20
-rw-r--r--Levels/48.sokolvl18
-rw-r--r--Levels/49.sokolvl18
-rw-r--r--Levels/5.sokolvl16
-rw-r--r--Levels/50.sokolvl19
-rw-r--r--Levels/51.sokolvl19
-rw-r--r--Levels/52.sokolvl17
-rw-r--r--Levels/53.sokolvl17
-rw-r--r--Levels/54.sokolvl22
-rw-r--r--Levels/55.sokolvl23
-rw-r--r--Levels/56.sokolvl18
-rw-r--r--Levels/57.sokolvl19
-rw-r--r--Levels/58.sokolvl14
-rw-r--r--Levels/59.sokolvl23
-rw-r--r--Levels/6.sokolvl16
-rw-r--r--Levels/60.sokolvl23
-rw-r--r--Levels/7.sokolvl14
-rw-r--r--Levels/8.sokolvl15
-rw-r--r--Levels/9.sokolvl20
-rw-r--r--Levels/levels.py52
-rw-r--r--LoadingScreen.gd77
-rw-r--r--LoadingScreen.tscn333
-rw-r--r--Main.tscn3
-rw-r--r--MainInstances.gd5
-rw-r--r--MobileInputs.tscn56
-rw-r--r--Music.gd82
-rw-r--r--Music.tscn21
-rw-r--r--Others.tscn363
-rw-r--r--Pause.tscn106
-rw-r--r--PauseMenu.gd35
-rw-r--r--PauseMenu.tscn87
-rw-r--r--Player.gd159
-rw-r--r--Player.tscn312
-rw-r--r--PlayerSprite.gd35
-rw-r--r--PlayerWalk.tscn59
-rw-r--r--README.md3
-rw-r--r--Save_Load.gd41
-rw-r--r--Settings.gd122
-rw-r--r--SettingsMenu.tscn114
-rw-r--r--SoundFX.gd30
-rw-r--r--SoundFX.tscn17
-rw-r--r--StartScreen.gd50
-rw-r--r--StartScreen.tscn141
-rw-r--r--StopWatch.gd39
-rw-r--r--Target.gd28
-rw-r--r--Target.pngbin132 -> 0 bytes
-rw-r--r--Target.png.import35
-rw-r--r--Target.tscn88
-rw-r--r--Utils.gd55
-rw-r--r--WinScreen.gd21
-rw-r--r--WinScreen.tscn71
-rw-r--r--World.gd136
-rw-r--r--World.tscn29
l---------addons/gdcli1
-rw-r--r--arrow.pngbin133 -> 0 bytes
-rw-r--r--arrow.png.import35
-rw-r--r--autoloads/CLI.gd11
-rw-r--r--box.pngbin283 -> 0 bytes
-rw-r--r--box.png.import35
-rw-r--r--box_normal.pngbin284 -> 0 bytes
-rw-r--r--box_normal.png.import35
-rw-r--r--checked_box.pngbin155 -> 0 bytes
-rw-r--r--checked_box.png.import35
-rw-r--r--circle.pngbin182 -> 0 bytes
-rw-r--r--circle.png.import35
-rw-r--r--clean_import.py63
-rw-r--r--console.gd32
-rw-r--r--console.tscn29
-rw-r--r--cube_normal.pngbin590 -> 0 bytes
-rw-r--r--cube_normal.png.import35
-rw-r--r--cuberot.pngbin493 -> 0 bytes
-rw-r--r--cuberot.png.import35
-rw-r--r--decoration.pngbin2128 -> 0 bytes
-rw-r--r--decoration.png.import35
-rw-r--r--default_env.tres7
-rw-r--r--explode.pngbin498 -> 0 bytes
-rw-r--r--explode.png.import35
-rw-r--r--export_presets.cfg382
-rw-r--r--focus_box.tres15
-rw-r--r--focused.pngbin126 -> 0 bytes
-rw-r--r--focused.png.import35
-rw-r--r--font.tres7
-rw-r--r--gameover.wavbin418360 -> 0 bytes
-rw-r--r--gameover.wav.import21
-rw-r--r--globalsettings.gd8
-rw-r--r--html/.gdignore0
-rw-r--r--icon.icobin136435 -> 0 bytes
-rw-r--r--icon.pngbin591 -> 0 bytes
-rw-r--r--icon.png.import35
-rw-r--r--index.apple-touch-icon.pngbin0 -> 1412 bytes
-rw-r--r--index.audio.worklet.js211
-rw-r--r--index.html (renamed from html/custom.html)11
-rw-r--r--index.icon.pngbin0 -> 1355 bytes
-rw-r--r--index.js796
-rw-r--r--index.pck (renamed from lite_music.wav)bin26606524 -> 35307008 bytes
-rw-r--r--index.pngbin0 -> 1355 bytes
-rw-r--r--index.wasmbin0 -> 11303167 bytes
-rw-r--r--index.worker.js1
-rw-r--r--light.pngbin159897 -> 0 bytes
-rw-r--r--light.png.import35
-rw-r--r--light2.pngbin130161 -> 0 bytes
-rw-r--r--light2.png.import35
-rw-r--r--lite_music.wav.import21
-rw-r--r--motion_box.wavbin15148 -> 0 bytes
-rw-r--r--motion_box.wav.import21
-rw-r--r--pause.pngbin115 -> 0 bytes
-rw-r--r--pause.png.import35
-rw-r--r--project.godot172
-rw-r--r--settings.pngbin205 -> 0 bytes
-rw-r--r--settings.png.import35
-rw-r--r--settingshover.pngbin187 -> 0 bytes
-rw-r--r--settingshover.png.import35
-rw-r--r--smallfont.tres7
-rw-r--r--sokobanner.pngbin470 -> 0 bytes
-rw-r--r--sokobanner.png.import35
-rw-r--r--sound.wavbin5676480 -> 0 bytes
-rw-r--r--sound.wav.import21
-rw-r--r--spot.pngbin1795 -> 0 bytes
-rw-r--r--spot.png.import35
-rw-r--r--submodules/.gdignore0
m---------submodules/gdcli0
-rw-r--r--swayshader.tres58
-rw-r--r--theme.tres71
-rw-r--r--tilemap.pngbin1244 -> 0 bytes
-rw-r--r--tilemap.png.import35
-rw-r--r--tilemap.tres490
-rw-r--r--tilemap_normal.pngbin1960 -> 0 bytes
-rw-r--r--tilemap_normal.png.import35
-rw-r--r--tileset.pngbin620 -> 0 bytes
-rw-r--r--tileset.png.import35
-rw-r--r--transparency.pngbin81 -> 0 bytes
-rw-r--r--transparency.png.import35
-rw-r--r--tree.pngbin527 -> 0 bytes
-rw-r--r--tree.png.import35
-rw-r--r--unchecked_box.pngbin155 -> 0 bytes
-rw-r--r--unchecked_box.png.import35
-rw-r--r--victory.wavbin1852934 -> 0 bytes
-rw-r--r--victory.wav.import21
-rw-r--r--walk.wavbin54900 -> 0 bytes
-rw-r--r--walk.wav.import21
-rw-r--r--wall.pngbin213 -> 0 bytes
-rw-r--r--wall.png.import35
210 files changed, 1015 insertions, 7475 deletions
diff --git a/(16)04B_30__.TTF b/(16)04B_30__.TTF
deleted file mode 100644
index 9c2323b..0000000
--- a/(16)04B_30__.TTF
+++ /dev/null
Binary files differ
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index a05dc57..0000000
--- a/.gitattributes
+++ /dev/null
@@ -1,4 +0,0 @@
-*.png filter=lfs diff=lfs merge=lfs -text
-*.ogg filter=lfs diff=lfs merge=lfs -text
-*.ttf filter=lfs diff=lfs merge=lfs -text
-*.svg filter=lfs diff=lfs merge=lfs -text
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index 16fe0d4..0000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# These are supported funding model platforms
-
-github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
-patreon: # Replace with a single Patreon username
-open_collective: # Replace with a single Open Collective username
-ko_fi: bendn
-tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
-community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
-liberapay: # Replace with a single Liberapay username
-issuehunt: # Replace with a single IssueHunt username
-otechie: # Replace with a single Otechie username
-custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/.github/workflows/export.yml b/.github/workflows/export.yml
deleted file mode 100644
index 80bc4ec..0000000
--- a/.github/workflows/export.yml
+++ /dev/null
@@ -1,80 +0,0 @@
-name: "export"
-on:
- workflow_dispatch:
- push:
- paths:
- - "**.gd"
- - "**.tscn"
- - "**.import"
- - "**.tres"
- - "**.ttf"
- - "**.yml"
- branches:
- - main
-
-env:
- GODOT_VERSION: 3.5
- NAME: ${{ github.event.repository.name }}
-
-jobs:
- export:
- runs-on: ubuntu-latest
- container:
- image: ghcr.io/bend-n/godot-2d:3.5
- name: ${{ matrix.name }}
- strategy:
- matrix:
- include:
- - name: Windows export
- platform: windows
-
- - name: Linux export
- platform: linux
-
- - name: Mac export
- platform: mac
-
- - name: Web export
- platform: web
-
- - name: Android export
- platform: android
-
- steps:
- - name: Build (Windows)
- if: matrix.platform == 'windows'
- uses: bend-n/godot-actions/.github/actions/export-windows@main
-
- - name: Build (Linux)
- if: matrix.platform == 'linux'
- uses: bend-n/godot-actions/.github/actions/export-linux@main
-
- - name: Build (Mac)
- if: matrix.platform == 'mac'
- uses: bend-n/godot-actions/.github/actions/export-mac@main
-
- - name: Build (Web)
- if: matrix.platform == 'web'
- uses: bend-n/godot-actions/.github/actions/export-web@main
-
- - name: Build (Android)
- if: matrix.platform == 'android'
- uses: bend-n/godot-actions/.github/actions/export-android@main
- with:
- android-keystore-base64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
- android-password: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
-
- push-itch:
- needs: [export]
- name: Push to itch.io
- runs-on: ubuntu-20.04
- steps:
- - name: Check for api key
- id: secret
- run: echo '::set-output name=secret::${{ secrets.BUTLER_CREDENTIALS }}'
-
- - name: Push
- if: steps.secret.outputs.secret
- uses: bend-n/godot-actions/.github/actions/itch-push@main
- with:
- api-key: ${{ secrets.BUTLER_CREDENTIALS }}
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 5bbe921..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.import/
-logs/
-*.sh
-*.py
-*.pgn
-.vscode/
-exports/
-*.x86_64
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 68b663d..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "gdcli"]
- path = submodules/gdcli
- url = https://github.com/bend-n/gdcli
diff --git a/04B_19__.TTF b/04B_19__.TTF
deleted file mode 100644
index 6338c19..0000000
--- a/04B_19__.TTF
+++ /dev/null
Binary files differ
diff --git a/Back.tscn b/Back.tscn
deleted file mode 100644
index 3622d69..0000000
--- a/Back.tscn
+++ /dev/null
@@ -1,12 +0,0 @@
-[gd_scene load_steps=2 format=2]
-
-[ext_resource path="res://theme.tres" type="Theme" id=1]
-
-[node name="Back" type="ColorRect"]
-anchor_right = 1.0
-anchor_bottom = 1.0
-theme = ExtResource( 1 )
-color = Color( 0.333333, 0.490196, 0.333333, 1 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
diff --git a/Box.gd b/Box.gd
deleted file mode 100644
index 0a4957b..0000000
--- a/Box.gd
+++ /dev/null
@@ -1,65 +0,0 @@
-extends Node2D
-
-var main
-var target_count = 0
-var game_over = false
-
-signal target_updated
-signal game_over_detected
-
-
-func push(offset: Vector2) -> bool:
- $RayCast.cast_to = offset
- $RayCast.force_raycast_update()
-
- if $RayCast.is_colliding():
- return false
-
- $Tween.interpolate_property(
- self,
- "position",
- self.position,
- self.position + offset,
- 0.35,
- Tween.TRANS_LINEAR,
- Tween.EASE_IN_OUT
- )
- $Tween.start()
- SoundFx.play("motion_box", -17, rand_range(.5, 1))
- return true
-
-
-func _is_stuck_in_a_corner() -> bool:
- var left_or_right_blocked = (
- $WallChecks/LR/Left.is_colliding()
- or $WallChecks/LR/Right.is_colliding()
- )
- var up_or_down_blocked = $WallChecks/DU/Up.is_colliding() or $WallChecks/DU/Down.is_colliding()
-
- return left_or_right_blocked and up_or_down_blocked
-
-
-func entered_target(_target):
- target_count += 1
- _update_check_mark()
- emit_signal("target_updated")
-
-
-func left_target(_target):
- target_count -= 1
- _update_check_mark()
- emit_signal("target_updated")
-
-
-func _update_check_mark():
- $CheckSprite.visible = target_count > 0
-
-
-func check_over():
- yield(get_tree().create_timer(0.2), "timeout")
- if target_count == 0 and not main.game_over and _is_stuck_in_a_corner():
- emit_signal("game_over_detected")
-
-
-func _on_Tween_tween_all_completed():
- check_over()
diff --git a/ButtonHoverStylebox.png b/ButtonHoverStylebox.png
deleted file mode 100644
index 5ef08bc..0000000
--- a/ButtonHoverStylebox.png
+++ /dev/null
Binary files differ
diff --git a/ButtonHoverStylebox.png.import b/ButtonHoverStylebox.png.import
deleted file mode 100644
index a5f8455..0000000
--- a/ButtonHoverStylebox.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/ButtonHoverStylebox.png-3ec7162d68e6c0071f8ea095e3dcb14c.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://ButtonHoverStylebox.png"
-dest_files=[ "res://.import/ButtonHoverStylebox.png-3ec7162d68e6c0071f8ea095e3dcb14c.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/ButtonHoverStylebox.tres b/ButtonHoverStylebox.tres
deleted file mode 100644
index e7d244b..0000000
--- a/ButtonHoverStylebox.tres
+++ /dev/null
@@ -1,11 +0,0 @@
-[gd_resource type="StyleBoxTexture" load_steps=2 format=2]
-
-[ext_resource path="res://ButtonHoverStylebox.png" type="Texture" id=1]
-
-[resource]
-texture = ExtResource( 1 )
-region_rect = Rect2( 0, 0, 6, 6 )
-margin_left = 2.0
-margin_right = 2.0
-margin_top = 2.0
-margin_bottom = 2.0
diff --git a/ButtonStylebox.png b/ButtonStylebox.png
deleted file mode 100644
index bd9e409..0000000
--- a/ButtonStylebox.png
+++ /dev/null
Binary files differ
diff --git a/ButtonStylebox.png.import b/ButtonStylebox.png.import
deleted file mode 100644
index b33b5bf..0000000
--- a/ButtonStylebox.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/ButtonStylebox.png-d06ae3d69719dbddb35ca9cdb48963f9.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://ButtonStylebox.png"
-dest_files=[ "res://.import/ButtonStylebox.png-d06ae3d69719dbddb35ca9cdb48963f9.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/ButtonStylebox.tres b/ButtonStylebox.tres
deleted file mode 100644
index 2f75e2e..0000000
--- a/ButtonStylebox.tres
+++ /dev/null
@@ -1,11 +0,0 @@
-[gd_resource type="StyleBoxTexture" load_steps=2 format=2]
-
-[ext_resource path="res://ButtonStylebox.png" type="Texture" id=1]
-
-[resource]
-texture = ExtResource( 1 )
-region_rect = Rect2( 0, 0, 6, 6 )
-margin_left = 2.0
-margin_right = 2.0
-margin_top = 2.0
-margin_bottom = 2.0
diff --git a/Check.png b/Check.png
deleted file mode 100644
index 5180d39..0000000
--- a/Check.png
+++ /dev/null
Binary files differ
diff --git a/Check.png.import b/Check.png.import
deleted file mode 100644
index 7abf11c..0000000
--- a/Check.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/Check.png-e6d621bff9435dcfb300e0bec422577a.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://Check.png"
-dest_files=[ "res://.import/Check.png-e6d621bff9435dcfb300e0bec422577a.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/Crate.tscn b/Crate.tscn
deleted file mode 100644
index 077fc88..0000000
--- a/Crate.tscn
+++ /dev/null
@@ -1,76 +0,0 @@
-[gd_scene load_steps=7 format=2]
-
-[ext_resource path="res://box.png" type="Texture" id=1]
-[ext_resource path="res://Box.gd" type="Script" id=2]
-[ext_resource path="res://Check.png" type="Texture" id=3]
-[ext_resource path="res://box_normal.png" type="Texture" id=4]
-
-[sub_resource type="RectangleShape2D" id=1]
-extents = Vector2( 8.5, 8.5 )
-
-[sub_resource type="OccluderPolygon2D" id=2]
-polygon = PoolVector2Array( 0, 0, 0, 16, 16, 16, 16, 0 )
-
-[node name="Crate" type="KinematicBody2D" groups=["crates"]]
-script = ExtResource( 2 )
-
-[node name="Crate" type="Sprite" parent="."]
-light_mask = 3
-texture = ExtResource( 1 )
-normal_map = ExtResource( 4 )
-centered = false
-
-[node name="CheckSprite" type="Sprite" parent="."]
-visible = false
-light_mask = 0
-position = Vector2( 8, 8 )
-texture = ExtResource( 3 )
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
-visible = false
-light_mask = 0
-position = Vector2( 8, 8 )
-shape = SubResource( 1 )
-
-[node name="RayCast" type="RayCast2D" parent="."]
-visible = false
-position = Vector2( 8, 8 )
-
-[node name="Tween" type="Tween" parent="."]
-
-[node name="LightOccluder2D" type="LightOccluder2D" parent="."]
-visible = false
-occluder = SubResource( 2 )
-
-[node name="WallChecks" type="Node2D" parent="."]
-visible = false
-
-[node name="LR" type="Node2D" parent="WallChecks"]
-
-[node name="Left" type="RayCast2D" parent="WallChecks/LR"]
-position = Vector2( 8, 8 )
-enabled = true
-cast_to = Vector2( -10, 0 )
-collision_mask = 2
-
-[node name="Right" type="RayCast2D" parent="WallChecks/LR"]
-position = Vector2( 8, 8 )
-enabled = true
-cast_to = Vector2( 10, 0 )
-collision_mask = 2
-
-[node name="DU" type="Node2D" parent="WallChecks"]
-
-[node name="Down" type="RayCast2D" parent="WallChecks/DU"]
-position = Vector2( 8, 8 )
-enabled = true
-cast_to = Vector2( 0, 10 )
-collision_mask = 2
-
-[node name="Up" type="RayCast2D" parent="WallChecks/DU"]
-position = Vector2( 8, 8 )
-enabled = true
-cast_to = Vector2( 0, -10 )
-collision_mask = 2
-
-[connection signal="tween_all_completed" from="Tween" to="." method="_on_Tween_tween_all_completed"]
diff --git a/ExplosionEffect.tscn b/ExplosionEffect.tscn
deleted file mode 100644
index c2c54c4..0000000
--- a/ExplosionEffect.tscn
+++ /dev/null
@@ -1,58 +0,0 @@
-[gd_scene load_steps=4 format=2]
-
-[ext_resource path="res://explode.png" type="Texture" id=1]
-
-[sub_resource type="Animation" id=1]
-resource_name = "Animate"
-length = 0.9
-tracks/0/type = "value"
-tracks/0/path = NodePath(".:frame")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8 ),
-"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1 ),
-"update": 1,
-"values": [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]
-}
-tracks/1/type = "method"
-tracks/1/path = NodePath(".")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0.9 ),
-"transitions": PoolRealArray( 1 ),
-"values": [ {
-"args": [ ],
-"method": "queue_free"
-} ]
-}
-
-[sub_resource type="Animation" id=2]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/path = NodePath(".:frame")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ 1 ]
-}
-
-[node name="ExplosionEffect" type="Sprite"]
-texture = ExtResource( 1 )
-hframes = 9
-frame = 1
-
-[node name="AnimatedSprite" type="AnimationPlayer" parent="."]
-autoplay = "Animate"
-anims/Animate = SubResource( 1 )
-anims/RESET = SubResource( 2 )
diff --git a/GameoverScreen.gd b/GameoverScreen.gd
deleted file mode 100644
index 9c83b09..0000000
--- a/GameoverScreen.gd
+++ /dev/null
@@ -1,25 +0,0 @@
-extends CanvasLayer
-
-var player: KinematicBody2D
-var shown = false
-
-
-func _ready():
- $Container.hide()
-
-
-func _show(integer):
- shown = true
- $Container/AnimationPlayer.play("Animate")
- $Container.visible = true
- $Container/Label._dialogue("LEVEL %s FAILED PRESS enter TO RETRY!" % integer)
- SoundFx.play("defeat")
-
-
-func hide(backwards = true):
- if backwards:
- $Container/Label._erase()
- $Container/AnimationPlayer.play_backwards("Animate")
- yield($Container/AnimationPlayer, "animation_finished")
- shown = false
- $Container.hide()
diff --git a/GameoverScreen.tscn b/GameoverScreen.tscn
deleted file mode 100644
index eca8102..0000000
--- a/GameoverScreen.tscn
+++ /dev/null
@@ -1,72 +0,0 @@
-[gd_scene load_steps=5 format=2]
-
-[ext_resource path="res://Label.tscn" type="PackedScene" id=1]
-[ext_resource path="res://GameoverScreen.gd" type="Script" id=3]
-
-[sub_resource type="Animation" id=1]
-resource_name = "Animate"
-length = 2.0
-tracks/0/type = "value"
-tracks/0/path = NodePath("Panel:color")
-tracks/0/interp = 2
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 2 ),
-"transitions": PoolRealArray( -2, -2 ),
-"update": 0,
-"values": [ Color( 0, 0, 0, 0 ), Color( 0, 0, 0, 0.784314 ) ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Label:rect_scale")
-tracks/1/interp = 2
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0, 2 ),
-"transitions": PoolRealArray( -2, -2 ),
-"update": 0,
-"values": [ Vector2( 1e-05, 1e-05 ), Vector2( 1, 1 ) ]
-}
-
-[sub_resource type="Animation" id=2]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/path = NodePath("Panel:color")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ Color( 0, 0, 0, 0 ) ]
-}
-
-[node name="GameoverScreen" type="CanvasLayer"]
-script = ExtResource( 3 )
-
-[node name="Container" type="Control" parent="."]
-visible = false
-anchor_right = 1.0
-anchor_bottom = 1.0
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Panel" type="ColorRect" parent="Container"]
-anchor_right = 1.0
-anchor_bottom = 1.0
-color = Color( 0, 0, 0, 0 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="AnimationPlayer" type="AnimationPlayer" parent="Container"]
-anims/Animate = SubResource( 1 )
-anims/RESET = SubResource( 2 )
-
-[node name="Label" parent="Container" instance=ExtResource( 1 )]
diff --git a/HUD.tscn b/HUD.tscn
deleted file mode 100644
index b55341b..0000000
--- a/HUD.tscn
+++ /dev/null
@@ -1,99 +0,0 @@
-[gd_scene load_steps=7 format=2]
-
-[ext_resource path="res://04B_19__.TTF" type="DynamicFontData" id=2]
-[ext_resource path="res://StopWatch.gd" type="Script" id=3]
-[ext_resource path="res://theme.tres" type="Theme" id=4]
-
-[sub_resource type="DynamicFont" id=2]
-size = 9
-font_data = ExtResource( 2 )
-
-[sub_resource type="DynamicFont" id=3]
-size = 9
-font_data = ExtResource( 2 )
-
-[sub_resource type="DynamicFont" id=1]
-size = 38
-outline_size = 1
-outline_color = Color( 0, 0, 0, 1 )
-font_data = ExtResource( 2 )
-
-[node name="HUD" type="Control"]
-pause_mode = 2
-anchor_right = 1.0
-anchor_bottom = 1.0
-mouse_filter = 2
-theme = ExtResource( 4 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="MovesLabel" type="Label" parent="."]
-anchor_left = 1.0
-anchor_right = 1.0
-margin_left = -104.0
-margin_top = 8.0
-margin_right = -8.0
-margin_bottom = 28.0
-text = "Moves: 0"
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Hint" type="Label" parent="."]
-visible = false
-anchor_top = 1.0
-anchor_bottom = 1.0
-margin_left = 8.0
-margin_top = -24.0
-margin_right = 170.0
-margin_bottom = -8.0
-custom_fonts/font = SubResource( 2 )
-text = "press q to screenshot"
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Hint2" type="Label" parent="."]
-visible = false
-anchor_top = 1.0
-anchor_bottom = 1.0
-margin_left = 8.0
-margin_top = -48.0
-margin_right = 170.0
-margin_bottom = -25.0
-custom_fonts/font = SubResource( 3 )
-text = "esc to restart
-tab to pause"
-valign = 1
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="LevelLabel" type="Label" parent="."]
-anchor_left = 1.0
-anchor_top = 1.0
-anchor_right = 1.0
-anchor_bottom = 1.0
-margin_left = -176.0
-margin_top = -48.0
-margin_right = -24.0
-margin_bottom = -9.0
-custom_fonts/font = SubResource( 1 )
-text = "Level = "
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="StopWatch" type="Label" parent="."]
-pause_mode = 1
-visible = false
-margin_left = 8.0
-margin_top = 8.0
-margin_right = 116.0
-margin_bottom = 36.0
-text = "1:0:2"
-script = ExtResource( 3 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 9a9763e..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2022 bendn
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/Label.gd b/Label.gd
deleted file mode 100644
index c288b00..0000000
--- a/Label.gd
+++ /dev/null
@@ -1,21 +0,0 @@
-extends Label
-
-onready var Timer = $Timer
-
-
-func _ready():
- Timer.set_wait_time(.1) # time between letters
-
-
-func _dialogue(string):
- for letter in string:
- Timer.start()
- text += letter
- yield(Timer, "timeout")
-
-
-func _erase():
- for letter in text:
- Timer.start()
- text = text.substr(0, len(text) - 1)
- yield(Timer, "timeout")
diff --git a/Label.tscn b/Label.tscn
deleted file mode 100644
index 1932293..0000000
--- a/Label.tscn
+++ /dev/null
@@ -1,27 +0,0 @@
-[gd_scene load_steps=3 format=2]
-
-[ext_resource path="res://font.tres" type="DynamicFont" id=1]
-[ext_resource path="res://Label.gd" type="Script" id=2]
-
-[node name="Label" type="Label"]
-anchor_left = 0.5
-anchor_top = 0.5
-anchor_right = 0.5
-anchor_bottom = 0.5
-margin_left = -80.0
-margin_top = -8.0
-margin_right = 80.0
-margin_bottom = 40.0
-rect_scale = Vector2( 1e-05, 1e-05 )
-rect_pivot_offset = Vector2( 80, 8 )
-custom_colors/font_color = Color( 0.996078, 1, 0.6, 1 )
-custom_fonts/font = ExtResource( 1 )
-align = 1
-autowrap = true
-script = ExtResource( 2 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Timer" type="Timer" parent="."]
-wait_time = 0.1
diff --git a/Level.gd b/Level.gd
deleted file mode 100644
index df597f8..0000000
--- a/Level.gd
+++ /dev/null
@@ -1,304 +0,0 @@
-extends Node2D
-
-const GRID_SIZE = 16
-const grassDecorationIds = [0, 1, 2, 3, 4, 5, 6, 7]
-const treeDecorationIds = [8, 9, 10, 11]
-const stoneDecorationIds = [12, 13, 14, 15, 16]
-const mushroomDecorationIds = [17, 18, 19, 20, 21, 22, 23, 24]
-var explosionEffect = preload("res://ExplosionEffect.tscn")
-
-var thread: Thread
-var wall_positions: PoolVector2Array = []
-var crate_prefab = preload("res://Crate.tscn")
-var target_prefab = preload("res://Target.tscn")
-
-var game_over := false
-
-onready var crates = $LevelContainer/Crates
-onready var player = $LevelContainer/Player
-onready var targets = $LevelContainer/Targets
-onready var walls = $LevelContainer/Walls
-onready var floors = $LevelContainer/Floors
-onready var timer = $Timer
-onready var others = $LevelContainer/Others
-onready var cam = $LevelContainer/Player/Camera2D
-var consol
-
-var current_level := ""
-onready var tilemaps = [walls, others, floors]
-var just_started = true
-
-var level_size = Vector2(0, 0)
-
-signal game_over
-signal level_completed(completed)
-signal level_reset
-signal level_made
-
-
-func _ready():
- player.connect("level_reset_requested", self, "_on_Player_level_reset_requested")
- thread = Thread.new()
- reset_time()
-
-
-func reset_time():
- MainInstances.stopwatch.reset()
- player.started = false
-
-
-func start_stopwatch():
- MainInstances.stopwatch.start()
-
-
-func load_level(level: String, decorate = true):
- $LevelContainer/Walls.modulate = Color.white
- $LevelContainer/Player/RayCast2D.set_collision_mask_bit(0, true)
- if thread.is_alive():
- return
- if thread.is_active():
- thread.wait_to_finish()
- reset_time()
- consol = MainInstances.console
- if decorate:
- consol.Log("Generating level " + level, .5, .5)
- SaveLoad.files.level.data.current_level = level
- SaveLoad.save("level")
- thread.start(self, "level_load", [level, decorate])
-
-
-func level_load(level: Array):
- just_started = true
- player.set_moves(0)
- current_level = level[0]
- call_deferred("_reset_level", level[1])
-
-
-func _exit_tree():
- if thread.is_active():
- thread.wait_to_finish()
-
-
-func _reset_level(decorate):
- game_over = false
- player.initialize()
- delete_children(crates)
- if decorate:
- walls.clear()
- others.clear()
- delete_children(floors)
- delete_children(targets)
-
- if current_level == "":
- return
-
- var file = File.new()
- file.open("res://Levels/%s.sokolvl" % current_level, File.READ)
-
- var version = 0
- var row = 0
- var player_pos
- level_size = Vector2(0, 0)
-
- while !file.eof_reached():
- var line = file.get_line()
- if line.begins_with(";"):
- var meta = line.split(": ", false, 1)
- if meta[0] == ";version":
- version = int(meta[1])
- elif line != "":
- if version != 1:
- push_error("Not supported .sokolvl version: " + str(version))
- return
- var col = 0
-
- for x in line:
- var tile_pos = Vector2(col, row) * GRID_SIZE
-
- if x == "#":
- if decorate:
- add_wall(tile_pos)
- if x in [".", "X", "O", "@", "%", "A"]:
- if decorate:
- add_floor(tile_pos)
- if x in ["@", "A"]:
- player_pos = tile_pos
- if x in ["X", "%"]:
- add_crate(tile_pos)
- if x in ["O", "%", "A"]:
- if decorate:
- add_target(tile_pos)
-
- col += 1
- row += 1
- level_size.y += 1
- level_size.x = max(level_size.x, col)
-
- file.close()
-
- $CanvasLayer/HUD/LevelLabel.text = "Level = %s" % current_level
-
- var new_zoom = .5
- new_zoom = clamp(new_zoom, get_parent().min_zoom, get_parent().max_zoom)
- new_zoom = Vector2(new_zoom, new_zoom)
- var level_int
- if level_size.x > level_size.y:
- level_int = level_size.x
- else:
- level_int = level_size.y
-
- new_zoom += Vector2(level_int / 45, level_int / 45)
- $Tween.interpolate_property(
- cam, "zoom", cam.zoom, new_zoom, 2, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
- )
- $Tween.start()
- timer.start(2)
- if decorate:
- decorate(-50, 50)
- initialize_player(player_pos)
- Utils.unload_loading_screen()
- yield(timer, "timeout")
- just_started = false
- emit_signal("level_made")
- return
-
-
-static func delete_children(node):
- for n in node.get_children():
- node.remove_child(n)
- n.queue_free()
-
-
-func decorate(x, y):
- for tile in check_for_empty_tile(Vector2(x, y)):
- match randi() % 101:
- 1:
- add_mushroom(tile)
- 2:
- add_rock(tile)
- 3:
- add_tree(tile)
-
-
-func _on_Crate_target_updated():
- var crates_in_place = 0
-
- for crate in crates.get_children():
- if crate.target_count > 0:
- crates_in_place += 1
-
- if crates_in_place == crates.get_child_count():
- emit_signal("level_completed")
-
-
-func _on_Player_level_reset_requested():
- if player.tween.is_active():
- yield(player.tween, "tween_all_completed")
- load_level(current_level, false)
- emit_signal("level_reset")
-
-
-func _on_Crate_game_over():
- if not game_over:
- game_over = true
- emit_signal("game_over")
-
-
-func add_target(tile_pos):
- var target = target_prefab.instance()
- target.main = self
- target.position = tile_pos
- targets.add_child(target)
-
-
-func add_crate(tile_pos):
- var crate = crate_prefab.instance()
- crate.position = tile_pos
- crate.main = get_parent()
- crate.connect("target_updated", self, "_on_Crate_target_updated")
- crate.connect("game_over_detected", self, "_on_Crate_game_over")
- crates.add_child(crate)
-
-
-func initialize_player(tile_pos):
- player.position = tile_pos
- player.world = get_parent()
-
-
-func add_floor(tile_pos):
- floors.set_cellv(tile_pos / 16, 0)
- randomize()
- if randi() % 5 == 2:
- others.set_cellv(tile_pos / 16, grassDecorationIds[randi() % grassDecorationIds.size()])
-
-
-func add_wall(tile_pos):
- wall_positions.append(tile_pos)
- walls.set_cellv(tile_pos / 16, 1)
- walls.update_bitmask_area(tile_pos / 16)
-
-
-func check_for_empty_tile(size: Vector2 = Vector2(-75, 75)):
- var empty_tiles: PoolVector2Array = []
- for x in range(size.x, size.y):
- for y in range(size.x, size.y):
- var tile_pos = Vector2(x, y)
- var lower_tile_pos = tile_pos
- var left_tile_pos = tile_pos
- var right_tile_pos = tile_pos
- var up_tile_pos = tile_pos
- var down_right_tile_pos = tile_pos
- var down_left_tile_pos = tile_pos
- down_right_tile_pos += Vector2.DOWN + Vector2.RIGHT
- down_left_tile_pos += Vector2.DOWN + Vector2.LEFT
- lower_tile_pos += Vector2.DOWN
- left_tile_pos += Vector2.LEFT
- right_tile_pos += Vector2.RIGHT
- up_tile_pos += Vector2.UP
- var tile_positions = [
- down_left_tile_pos,
- down_right_tile_pos,
- lower_tile_pos,
- left_tile_pos,
- right_tile_pos,
- up_tile_pos,
- tile_pos
- ]
- var count2 := 0
- for tile in tile_positions:
- var count := 0
- for tilemap in tilemaps:
- if empty(tilemap, tile):
- count += 1
- if count == tilemaps.size():
- count2 += 1
- if count2 == tile_positions.size():
- empty_tiles.append(tile_pos)
- return empty_tiles
-
-
-func empty(tilemap, tile) -> bool:
- if tilemap.get_cellv(tile) != -1:
- return false
- return true
-
-
-func add_tree(tile):
- others.set_cellv(tile, treeDecorationIds[randi() % treeDecorationIds.size()])
-
-
-func add_rock(tile):
- others.set_cellv(tile, stoneDecorationIds[randi() % stoneDecorationIds.size()])
-
-
-func add_mushroom(tile):
- others.set_cellv(tile, mushroomDecorationIds[randi() % mushroomDecorationIds.size()])
-
-
-func explode_walls():
- for positions in wall_positions:
- Utils.instance_scene_on_main(positions, explosionEffect)
-
-
-func _on_Player_won():
- emit_signal("level_completed", true)
diff --git a/Level.tscn b/Level.tscn
deleted file mode 100644
index 702e479..0000000
--- a/Level.tscn
+++ /dev/null
@@ -1,197 +0,0 @@
-[gd_scene load_steps=12 format=2]
-
-[ext_resource path="res://Player.tscn" type="PackedScene" id=1]
-[ext_resource path="res://HUD.tscn" type="PackedScene" id=2]
-[ext_resource path="res://Level.gd" type="Script" id=3]
-[ext_resource path="res://tilemap.tres" type="TileSet" id=4]
-[ext_resource path="res://Back.tscn" type="PackedScene" id=5]
-[ext_resource path="res://Others.tscn" type="PackedScene" id=6]
-[ext_resource path="res://tilemap.png" type="Texture" id=8]
-
-[sub_resource type="TileSet" id=2]
-1/name = "tilemap.png 1"
-1/texture = ExtResource( 8 )
-1/tex_offset = Vector2( 0, 0 )
-1/modulate = Color( 1, 1, 1, 1 )
-1/region = Rect2( 16, 16, 16, 16 )
-1/tile_mode = 0
-1/occluder_offset = Vector2( 0, 0 )
-1/navigation_offset = Vector2( 0, 0 )
-1/shape_offset = Vector2( 0, 0 )
-1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-1/shape_one_way = false
-1/shape_one_way_margin = 0.0
-1/shapes = [ ]
-1/z_index = 0
-
-[sub_resource type="AnimationNodeStateMachinePlayback" id=5]
-
-[sub_resource type="Animation" id=3]
-resource_name = "Animate"
-tracks/0/type = "value"
-tracks/0/path = NodePath("Walls:modulate")
-tracks/0/interp = 2
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 1 ),
-"transitions": PoolRealArray( -2, -2 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
-}
-tracks/1/type = "method"
-tracks/1/path = NodePath("..")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0.6 ),
-"transitions": PoolRealArray( 1 ),
-"values": [ {
-"args": [ ],
-"method": "explode_walls"
-} ]
-}
-tracks/2/type = "value"
-tracks/2/path = NodePath("Player/RayCast2D:collision_mask")
-tracks/2/interp = 1
-tracks/2/loop_wrap = true
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/keys = {
-"times": PoolRealArray( 0, 0.6 ),
-"transitions": PoolRealArray( 1, 1 ),
-"update": 1,
-"values": [ 1, 0 ]
-}
-tracks/3/type = "method"
-tracks/3/path = NodePath("Player")
-tracks/3/interp = 1
-tracks/3/loop_wrap = true
-tracks/3/imported = false
-tracks/3/enabled = true
-tracks/3/keys = {
-"times": PoolRealArray( 0.6 ),
-"transitions": PoolRealArray( 1 ),
-"values": [ {
-"args": [ ],
-"method": "_over"
-} ]
-}
-
-[sub_resource type="Animation" id=4]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/path = NodePath("Walls:modulate")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 1 ) ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Player:collision_layer")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ 1 ]
-}
-tracks/2/type = "value"
-tracks/2/path = NodePath("Player:collision_mask")
-tracks/2/interp = 1
-tracks/2/loop_wrap = true
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ 1 ]
-}
-tracks/3/type = "value"
-tracks/3/path = NodePath("Player/RayCast2D:collision_mask")
-tracks/3/interp = 1
-tracks/3/loop_wrap = true
-tracks/3/imported = false
-tracks/3/enabled = true
-tracks/3/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ 1 ]
-}
-
-[node name="Level" type="Node2D"]
-script = ExtResource( 3 )
-
-[node name="LevelContainer" type="Control" parent="."]
-margin_left = -8.0
-margin_right = 336.0
-margin_bottom = 320.0
-mouse_filter = 2
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Back" parent="LevelContainer" instance=ExtResource( 5 )]
-margin_left = -992.0
-margin_top = -688.0
-margin_right = 1232.0
-margin_bottom = 1048.0
-
-[node name="Floors" type="TileMap" parent="LevelContainer"]
-tile_set = SubResource( 2 )
-cell_size = Vector2( 16, 16 )
-format = 1
-
-[node name="Others" parent="LevelContainer" instance=ExtResource( 6 )]
-tile_data = PoolIntArray( 196622, 15, 0 )
-
-[node name="Targets" type="Node2D" parent="LevelContainer"]
-
-[node name="Player" parent="LevelContainer" instance=ExtResource( 1 )]
-position = Vector2( 168, 80 )
-collision_layer = 1
-collision_mask = 1
-
-[node name="AnimationTree" parent="LevelContainer/Player" index="9"]
-parameters/playback = SubResource( 5 )
-
-[node name="Crates" type="Node2D" parent="LevelContainer"]
-
-[node name="Walls" type="TileMap" parent="LevelContainer"]
-tile_set = ExtResource( 4 )
-cell_size = Vector2( 16, 16 )
-collision_layer = 3
-collision_mask = 3
-format = 1
-tile_data = PoolIntArray( 458766, 1, 3, 524302, 1, 327687, 524303, 1, 196610 )
-
-[node name="LevelComplete" type="AnimationPlayer" parent="LevelContainer"]
-anims/Animate = SubResource( 3 )
-anims/RESET = SubResource( 4 )
-
-[node name="CanvasLayer" type="CanvasLayer" parent="."]
-
-[node name="HUD" parent="CanvasLayer" instance=ExtResource( 2 )]
-visible = false
-
-[node name="Timer" type="Timer" parent="."]
-one_shot = true
-
-[node name="Tween" type="Tween" parent="."]
-
-[connection signal="won" from="LevelContainer/Player" to="." method="_on_Player_won"]
-
-[editable path="LevelContainer/Player"]
diff --git a/Levels/1.sokolvl b/Levels/1.sokolvl
deleted file mode 100644
index 90acecc..0000000
--- a/Levels/1.sokolvl
+++ /dev/null
@@ -1,12 +0,0 @@
-;version: 1
-;name: 01
-
- #####
-###...#
-#O@X..#
-###.XO#
-#O##X.#
-#.#.O.##
-#X.%XXO#
-#...O..#
-########
diff --git a/Levels/10.sokolvl b/Levels/10.sokolvl
deleted file mode 100644
index 9ea185b..0000000
--- a/Levels/10.sokolvl
+++ /dev/null
@@ -1,21 +0,0 @@
-;version: 1
-;name: 10
-
- #######
- #..OOO#
- #####..OOO#
- #......OOO#
- #..##..OOO#
- ##.##..OOO#
- ###.########
- #.XXX.##
- #####..X.X.#####
-##...#X.X...#...#
-#@.X..X....X..X.#
-######.XX.X.#####
- #.X....#
- ####.###
- #..#
- #..#
- #..#
- ####
diff --git a/Levels/11.sokolvl b/Levels/11.sokolvl
deleted file mode 100644
index 333f91a..0000000
--- a/Levels/11.sokolvl
+++ /dev/null
@@ -1,23 +0,0 @@
-;version: 1
-;name: 11
-
- ####
- ######..#
- #.......#
- #..####.###
- ### #####.###....#
-##@####...XXX.#....#
-#.XX...XX.X...#OOOO##
-#..XXX#....X..#OOOOO#
-#.X...#.XX.XX.#OOOOO#
-###...#..X....#OOOOO#
- #...#.X.X.X.#OOOOO#
- #.#######.###OOOOO#
- #...#..X.X..#OOOOO#
- ###.#.XX.X.X#######
- #.#..X......#
- #.#.XXX.XXX.#
- #.#.......#.#
- #.#########.#
- #...........#
- #############
diff --git a/Levels/12.sokolvl b/Levels/12.sokolvl
deleted file mode 100644
index ec7bfd1..0000000
--- a/Levels/12.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 12
-
- ####
- #### #..#
- ###..###X.#
- ##..X.XX##.##
- #..#X##.....#
- #.#.X.XX.#.###
- #...X.#..#.X.#####
-####....#..XX.#...#
-####.##.X.........#
-#O....###..########
-#OO.OO# ####
-#OOO#O#
-#OOOOO#
-#######
diff --git a/Levels/13.sokolvl b/Levels/13.sokolvl
deleted file mode 100644
index 868770b..0000000
--- a/Levels/13.sokolvl
+++ /dev/null
@@ -1,19 +0,0 @@
-;version: 1
-;name: 13
-
- #########
- #%O%#%O%#
- #O%O%O%O#
- #%O%O%O%#
- #O%O%O%O#
- #%O%O%O%#
- ###...###
- #...#
-######.######
-#...........#
-#.X.X.X.X.X.#
-##.X.X.X.X.##
- #X.X.X.X.X#
- #...X@X...#
- #..#####..#
- #### ####
diff --git a/Levels/14.sokolvl b/Levels/14.sokolvl
deleted file mode 100644
index f0d7bf3..0000000
--- a/Levels/14.sokolvl
+++ /dev/null
@@ -1,16 +0,0 @@
-;version: 1
-;name: 14
-
- #########
- ###...##..#####
-###......#..#...####
-#..XX.#X.#..#..OOO.#
-#.#..X#@X##.#.#O#O.#
-#..##.#X..#....OOO.#
-#.X#....X.#.#.#O#O.#
-#....##..##X.X.OOO.#
-#.X.##...#..#X#O#O.#
-##.XX..X...X..XOOO.#
- #X..######....##..#
- #...# ##########
- #####
diff --git a/Levels/15.sokolvl b/Levels/15.sokolvl
deleted file mode 100644
index ae82754..0000000
--- a/Levels/15.sokolvl
+++ /dev/null
@@ -1,16 +0,0 @@
-;version: 1
-;name: 15
-
-################
-#..............#
-#.#.######.....#
-#.#..X.X.X.X#..#
-#.#...X@X...##.##
-#.#.#X.X.X###OOO#
-#.#...X.X..##OOO#
-#.###XXX.X.##OOO#
-#.....#.##.##OOO#
-#####...##.##OOO#
- #####.....###
- #.....#
- #######
diff --git a/Levels/16.sokolvl b/Levels/16.sokolvl
deleted file mode 100644
index 909cfe6..0000000
--- a/Levels/16.sokolvl
+++ /dev/null
@@ -1,20 +0,0 @@
-;version: 1
-;name: 16
-
- ####
- ####..#
- ##..#..#
- #..X.X.#
- ###.#X...####
- #..X..##X...#
- #..#[email protected].#.X#
- #..#......X.####
- ##.####X##.....#
- #.X#OOOOO#.#...#
- #..XOOO%O.X#.###
-##..#OOOOO#...#
-#...###.#######
-#.XX..#..#
-#..#.....#
-######...#
- #####
diff --git a/Levels/17.sokolvl b/Levels/17.sokolvl
deleted file mode 100644
index 931d8bb..0000000
--- a/Levels/17.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 17
-
-#####
-#...##
-#....# ####
-#.X..####..#
-#..XX.X...X#
-###@.#X....##
- #..##..X.X.##
- #.X..##.##.O#
- #..#X##X..#O#
- ###...XOO##O#
- #....#O%OOO#
- #.XX.#OOOOO#
- #..#########
- #..#
- ####
diff --git a/Levels/18.sokolvl b/Levels/18.sokolvl
deleted file mode 100644
index a6aac2d..0000000
--- a/Levels/18.sokolvl
+++ /dev/null
@@ -1,19 +0,0 @@
-;version: 1
-;name: 18
-
- #######
- #######.....#
- #.....#.X@X.#
- #XX.#...#########
- #.###OOOOOO##...#
- #...XOOOOOO##.#.#
- #.###OOOOOO.....#
-##...####.###.#X##
-#..#X...#..X..#.#
-#..X.XXX..#.X##.#
-#...X.X.###XX.#.#
-#####.....X...#.#
- ###.###...#.#
- #.....#...#
- ########..#
- ####
diff --git a/Levels/19.sokolvl b/Levels/19.sokolvl
deleted file mode 100644
index 35c8163..0000000
--- a/Levels/19.sokolvl
+++ /dev/null
@@ -1,16 +0,0 @@
-;version: 1
-;name: 19
-
- ############
- #..O..##...#
- #.#O.....@.#
- ######.##OOO#.####
-##..##OOO####.....####
-#.X.##OOO....X.#..X..#
-#.....OO.##.#.##.##..#
-####X###X#.X..#...#.##
- ###..#....##X.XX.#.#
- #...XX.#.#.X.#.X##.#
- #..................#
- #################..#
- ####
diff --git a/Levels/2.sokolvl b/Levels/2.sokolvl
deleted file mode 100644
index 9cdeca2..0000000
--- a/Levels/2.sokolvl
+++ /dev/null
@@ -1,14 +0,0 @@
-;version: 1
-;name: 02
-
- #####
- #...#
- #X..#
- ###..X###
- #..X..X.#
-###.#.###.# ######
-#...#.###.#######..OO#
-#.X..X.............OO#
-#####.####.#@####..OO#
- #......### ######
- ########
diff --git a/Levels/20.sokolvl b/Levels/20.sokolvl
deleted file mode 100644
index 60df746..0000000
--- a/Levels/20.sokolvl
+++ /dev/null
@@ -1,23 +0,0 @@
-;version: 1
-;name: 20
-
- ######
- #...@####
- #####.X...#
- #...##....####
- #.X##..##....#
- #...#..#####.#
- #.#XX.X....#.#
- #..X.X.###.#.#
- #.#...X..#.#.#
- #.#..#X#...#.#
- ##.####...#.#.#
- #..X..#####.#.# ####
- ##....X.....X..###..####
-#####..###.X.X#.X.#...OOOOO#
-#.....##......#..##..#OOOOO#
-#.XXXX....######X##...#O##O#
-##....##..............#OOOO#
- ##..###############...OOOO#
- #..# #####..##
- #### ####
diff --git a/Levels/21.sokolvl b/Levels/21.sokolvl
deleted file mode 100644
index 8d09253..0000000
--- a/Levels/21.sokolvl
+++ /dev/null
@@ -1,23 +0,0 @@
-;version: 1
-;name: 21
-
- ############
- #OOOOOOOOOO#
- ###O#O#O#O#OO#
- #...OOOOOOOOO#
- #@.X.X.X.%O%O#
- #######.#######
- ####...#....##..#
-##....X.#....#.X.##
-#..#X#.###.###X...##
-#.X..X.X...#.X.X.X.#
-#..#.X.##.......#X.#
-#...X####X####X##..#
-####..##...#....#..#
- #X.##...#.#.XX..#
- #...#.X.#..X....#
- ###.#.XX.#..X.###
- #.#....#.X.##
- #.########.#
- #..........#
- ############
diff --git a/Levels/22.sokolvl b/Levels/22.sokolvl
deleted file mode 100644
index 8e092ba..0000000
--- a/Levels/22.sokolvl
+++ /dev/null
@@ -1,17 +0,0 @@
-;version: 1
-;name: 22
-
- ##########
- #OO..#...#
- #OO......#
- #OO..#..####
- #######..#..##
- #............#
- #..#..##..#..#
-####.##..####.##
-#..X..#####.#..#
-#.#.X..X..#.X..#
-####.##.#######
- #....#
- ######
diff --git a/Levels/23.sokolvl b/Levels/23.sokolvl
deleted file mode 100644
index 9efc772..0000000
--- a/Levels/23.sokolvl
+++ /dev/null
@@ -1,23 +0,0 @@
-;version: 1
-;name: 23
-
- ####
- ############..#####
- #....#..#..X..#...##
- #.X.X.X..X.#.X.X...#
- ##X.X...#.@#.X...X.#
-###...############.##
-#..X.X#..#OOOOOO#.X#
-#.#...#..#OOOOOO##.#
-#..##.##.#.OOOOO#..#
-#.#......XOOOOOO.X.#
-#.#.X.##.#OOOOOO#..#
-#..X.X#..#OOOOOO#.X#
-#.X...#..##X#####..#
-#.X.X.####.X.X..X.X#
-##.#.....X.X.X.X...###
- #..######.X....X....#
- #.........#.#######.#
- #######.#X..........#
- #...###########
- #####
diff --git a/Levels/24.sokolvl b/Levels/24.sokolvl
deleted file mode 100644
index a73988c..0000000
--- a/Levels/24.sokolvl
+++ /dev/null
@@ -1,17 +0,0 @@
-;version: 1
-;name: 24
-
- #######
- #..#..####
- #.X#X.#..##
-########..#..#...########
-#OOOO..#.X#X.#..X#..#...#
-#OOOO#.#.....#X..#......#
-#OO#O....X#..#.X....#X..#
-#OOO.@##..#X.#X..#..#...#
-#OOOO.##.X#.....X########
-########..#XX#X..#
- #.X#..#..X#
- #..#..#...#
- ####..#####
- ####
diff --git a/Levels/25.sokolvl b/Levels/25.sokolvl
deleted file mode 100644
index aea578d..0000000
--- a/Levels/25.sokolvl
+++ /dev/null
@@ -1,22 +0,0 @@
-;version: 1
-;name: 25
-
- ##########
- #OOOOOOOO####
- #O#O#OOOO#..#
- #OOOOOOOOXX.#
- #.....O###..####
- #########..X.#...#
- #.....X...X.X..X.#
- #..#....#..X.X#..#
- ##.#####...#..#..#
- #.X.....#...####.#
-##..X#...#.##..#..#
-#....##X###....#..##
-#.X....X.#..#..#...#
-#####....#.##.#.##.##
- #X#.#..X..X.X...#
- #@#..X#XXX..#...#
- ###..X......#####
- ##..#..#..#
- ##########
diff --git a/Levels/26.sokolvl b/Levels/26.sokolvl
deleted file mode 100644
index 534b0e1..0000000
--- a/Levels/26.sokolvl
+++ /dev/null
@@ -1,20 +0,0 @@
-;version: 1
-;name: 26
-
- ####
- ######..#####
- #######.......#...#
- #......X.X.##.#.#.#
- #..####.X..#.....O#
- #......X.#.#.##O#O#
- ##X####X.X.X.##O#O#
- #.....#....####O###
- #.X...######..#O#O#
-######XXX##......@#O#O#
-#......#....#X#X###O.O#
-#.####.#XXXXX....#.OOO#
-#.#....X.....#...#.OOO#
-#.#...##.##.....###OOO#
-#.######X######..######
-#........# #..#
-########## ####
diff --git a/Levels/27.sokolvl b/Levels/27.sokolvl
deleted file mode 100644
index a84c364..0000000
--- a/Levels/27.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 27
-
-#########
-#.......#
-#.......####
-##.####.#..#
-##.#@##....#
-#.XXX.X..XX#
-#..#.##.X..#
-#..#.##..X.####
-####..XXX.X#..#
- #...##...OOOO#
- #.#...#.#OO.O#
- #...#.#.##OOO#
- #####.X..#OOO#
- ##...#####
- #####
diff --git a/Levels/28.sokolvl b/Levels/28.sokolvl
deleted file mode 100644
index 1e08ed4..0000000
--- a/Levels/28.sokolvl
+++ /dev/null
@@ -1,16 +0,0 @@
-;version: 1
-;name: 28
-
- #################
- #OOO...#....#...###
-##OOOOO..X##.#.#.X.#
-#OOOOOO#..X..#..X..#
-#OOOOOO#..#..#.#.#.##
-#########.X..X.#.#..###
- #.....#X##X.##.##...#
- ##...X....#.X..X...#.#
- #..##.###.#..#####X#.#
- #.X.XX.....X...X.....#
- #.X....X##X.########.#
- #######..@.## ###
- ######
diff --git a/Levels/29.sokolvl b/Levels/29.sokolvl
deleted file mode 100644
index b1f4b20..0000000
--- a/Levels/29.sokolvl
+++ /dev/null
@@ -1,20 +0,0 @@
-;version: 1
-;name: 29
-
- #######
- #@.#..#
- #.X...#
- ###.##.#
- ####.X..#.##
- #.......#..##
- #.X.X####.X.#
- #.XX.#..#..X#
- #X..X...#X..#
-##..XX#...XX.##
-#.XX..#..#..X.#
-#.....####.X..#
-#..#X##OO##...#
-###.O#OOOO#####
- #.OOOOOOO##
- #OOOO...OO#
- ###########
diff --git a/Levels/3.sokolvl b/Levels/3.sokolvl
deleted file mode 100644
index 859b3ea..0000000
--- a/Levels/3.sokolvl
+++ /dev/null
@@ -1,13 +0,0 @@
-;version: 1
-;name: 03
-
-############
-#OO..#.....###
-#OO..#.X..X..#
-#OO..#X####..#
-#OO....@.##..#
-#OO..#.#..X.##
-######.##X.X.#
- #.X..X.X.X.#
- #....#.....#
- ############
diff --git a/Levels/30.sokolvl b/Levels/30.sokolvl
deleted file mode 100644
index 0f7538f..0000000
--- a/Levels/30.sokolvl
+++ /dev/null
@@ -1,14 +0,0 @@
-;version: 1
-;name: 30
-
- #####
- ###### ###...####
- #####....###.X.X..X.#
-####..##.#X.X....X.#...#
-#OOOO...XX.X.X..X...#X##
-#OO.#.##.#...###X##.#..#
-#OOOO....#.###....#....#
-#OOOO....#.##..X..###X.#
-#OO######..X..#..####.##
-#### #...###....@..#
- ###############
diff --git a/Levels/31.sokolvl b/Levels/31.sokolvl
deleted file mode 100644
index d463d78..0000000
--- a/Levels/31.sokolvl
+++ /dev/null
@@ -1,23 +0,0 @@
-;version: 1
-;name: 31
-
- #####
- #...#######
- #.X.###...#
- #.X....XX.#
- ##.####...#
-###.#..#.###
-#...#..#@##
-#.XX....X.#
-#...#.#.X.####
-#####.#...#..#
- #...X####...#
- #..X.....X..#
- ##...#####.##
- ##########..#
-##OOOO#.X..X.#
-#OOOOO#.XX#..#
-#OO.OO#.X..X.#
-#OOOOOX...#..#
-##..##########
- ####
diff --git a/Levels/32.sokolvl b/Levels/32.sokolvl
deleted file mode 100644
index 49824c2..0000000
--- a/Levels/32.sokolvl
+++ /dev/null
@@ -1,15 +0,0 @@
-;version: 1
-;name: 32
-
- #######
- #..#..#####
-##..#..#OOO###
-#..X#..#OOO..#
-#.X.#XX.OOO..#
-#..X#..#OOO.O#
-#...#.X########
-##X.......X.X.#
-##..#..XX.#...#
- ######..##XX@#
- #......##
- ########
diff --git a/Levels/33.sokolvl b/Levels/33.sokolvl
deleted file mode 100644
index 4328d01..0000000
--- a/Levels/33.sokolvl
+++ /dev/null
@@ -1,19 +0,0 @@
-;version: 1
-;name: 33
-
- ####
- #..#########
- ##..##.@#...#
- #..X#.X.X...####
- #X..X..#.X.X#..##
-##..X##.#X.X.....#
-#..#..#.#...XXX..#
-#.X....X..X##.####
-#.X.X.#X#..#..#
-##..###..###X.#
- #..#OOOO.....#
- ####OOOOOO####
- #OOOO####
- #OOO##
- #OOO#
- #####
diff --git a/Levels/34.sokolvl b/Levels/34.sokolvl
deleted file mode 100644
index b3663d0..0000000
--- a/Levels/34.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 34
-
- ####
- #####..#
- ##.....X#
-##.X..##.###
-#@X.X.#.X..#
-####.##...X#
- #OOOO#X.X.#
- #OOOO#...X#
- #OOOO..XX.##
- #OOO.#.X...#
- ######X.X..#
- #...###
- #X.###
- #..#
- ####
diff --git a/Levels/35.sokolvl b/Levels/35.sokolvl
deleted file mode 100644
index 3a4307b..0000000
--- a/Levels/35.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 35
-
-############
-##.....##..#
-##...X...X.#
-####.##.XX.#
-#...X.#....#
-#.XXX.#.####
-#...#.#.X.##
-#..#..#..X.#
-#.X#.X#....#
-#...OO#.####
-####OO.X.#@#
-#OOOOO#.X#.#
-##OOOO#..X.#
-###OO##....#
-############
diff --git a/Levels/36.sokolvl b/Levels/36.sokolvl
deleted file mode 100644
index a0e5f3f..0000000
--- a/Levels/36.sokolvl
+++ /dev/null
@@ -1,19 +0,0 @@
-;version: 1
-;name: 36
-
-############ ######
-#...#....#@####OOOO#
-#...XX#.......OOOOO#
-#...#.###...##.OOOO#
-##.##.###..#...OOOO#
- #.X.X.....#.##.####
- #..X.X##..#.......#
-####.#..####.##.##.#
-#..#.#X...##.##....#
-#.X..X..#.##.#######
-#.#.X.X....#.#
-#..X.##.##.#.#
-#.XX.....XX..#
-##.##.###.X..#
- #....# #....#
- ###### ######
diff --git a/Levels/37.sokolvl b/Levels/37.sokolvl
deleted file mode 100644
index 8f14e87..0000000
--- a/Levels/37.sokolvl
+++ /dev/null
@@ -1,22 +0,0 @@
-;version: 1
-;name: 37
-
- ####
- ###..##
-####..X..#
-#...X.X..####
-#.X...#.X...# ####
-#..#..#...X.# #OO#
-##X#X.####X####OO#
- #...#####.##.OOO#
- #X#.##@##.##..OO#
- #.#....X.....OOO#
- #...####.###..OO#
- ###.##.#..##.OOO#
- ##X.####X.###OO#
- #...##....# #OO#
- ##.XX##..X.# ####
- #.....XXXX.#
- #.X.###....#
- #...# ######
- #####
diff --git a/Levels/38.sokolvl b/Levels/38.sokolvl
deleted file mode 100644
index ad3d177..0000000
--- a/Levels/38.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 38
-
-###########
-#OOOOOO...#########
-#OOOOOO...#..##...#
-#OO###.X....X.....#
-#OOO.X.X.#..###...#
-#OOO#X#####....#..#
-###....#...#X..#.X###
- #..XX.X.X..X##..X.#
- #..X...#X#..##....#
- ###.##.#..X.#######
- #..X.X.##.##
- #....X..X..#
- ##...#.#...#
- #####@#####
- ###
diff --git a/Levels/39.sokolvl b/Levels/39.sokolvl
deleted file mode 100644
index 1d73a29..0000000
--- a/Levels/39.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 39
-
- #########
- #OOOO...##
- #O#O#..X.##
-##OOOO#.#.@##
-#.OOOO#..#..##
-#.....#X.##X.#
-##.###..X....#
- #X..X.X.X#..#
- #.#..X.X.##.#
- #..###..##..#
- #....##.##.##
- #..X.#..X..#
- ###X.X...###
- #..#####
- ####
diff --git a/Levels/4.sokolvl b/Levels/4.sokolvl
deleted file mode 100644
index 4906f57..0000000
--- a/Levels/4.sokolvl
+++ /dev/null
@@ -1,13 +0,0 @@
-;version: 1
-;name: 04
-
- ########
- #.....@#
- #.X#X.##
- #.X..X#
- ##X.X.#
-#########.X.#.###
-#OOOO..##.X..X..#
-##OOO....X..X...#
-#OOOO..##########
-########
diff --git a/Levels/40.sokolvl b/Levels/40.sokolvl
deleted file mode 100644
index f91dfbe..0000000
--- a/Levels/40.sokolvl
+++ /dev/null
@@ -1,21 +0,0 @@
-;version: 1
-;name: 40
-
- ###
- ##O###
- #OOOO#
- #############OOOO#
-##...##.....##OOOO#####
-#..XX##..X.@##OOOO....#
-#......XX.X#..OOOO#...#
-#..X.##.XX.#.#OOOO#..##
-#..X.##.X..#.##.###..#
-##.#####.###.........#
-##...X..X.#####.###..#
-#.X###..#.#####.# ####
-#...X...#.......#
-#..X.#X.X.X###..#
-#.XXX#.X...# ####
-#....#..XX.#
-######...###
- #####
diff --git a/Levels/41.sokolvl b/Levels/41.sokolvl
deleted file mode 100644
index ff7301c..0000000
--- a/Levels/41.sokolvl
+++ /dev/null
@@ -1,14 +0,0 @@
-;version: 1
-;name: 41
-
- ####
-#######.@#
-#.....X..#
-#...X##.X#
-##X#OOO#.#
- #.XOOO..#
- #.#O.O#.##
- #...#.#X.#
- #X..X....#
- #..#######
- ####
diff --git a/Levels/42.sokolvl b/Levels/42.sokolvl
deleted file mode 100644
index 86c9317..0000000
--- a/Levels/42.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 42
-
- #####
- ##...##
- ##.....#
- ##..XX..#
- ##.XX..X.#
- #.X....X.#
-#### #...XX.#####
-#..########.##....#
-#OO...........XXX@#
-#O#.#######.##...##
-#O#.#######O.#X.X###
-#OOOOOOOOOOO.#...X.#
-##############..X..#
- ##..###
- ####
diff --git a/Levels/43.sokolvl b/Levels/43.sokolvl
deleted file mode 100644
index 65efd25..0000000
--- a/Levels/43.sokolvl
+++ /dev/null
@@ -1,21 +0,0 @@
-;version: 1
-;name: 43
-
- ########
- #@##...####
- #.X...X...#
- #..X.X.XXX#
- #.XX#.#...#
-##X....X...#
-#..X..XXXXX##
-#.X####.#...#
-#..XOOOO#...#
-#.##OOOO#XX.#
-#.##OOOO...##
-#...OOOO#..#
-##.#OOOO#XX#
- #.#OOOO#..#
- #.........#
- ####.##X###
- #....#
- ######
diff --git a/Levels/44.sokolvl b/Levels/44.sokolvl
deleted file mode 100644
index 447b92c..0000000
--- a/Levels/44.sokolvl
+++ /dev/null
@@ -1,19 +0,0 @@
-;version: 1
-;name: 44
-
- ############
- #..........##
- #..#.#XX.X..#
- #X.#X#..##.@#
- ##.##.#.X.#.##
- #...X.#X..#.#
- #...#.X...#.#
- ##.X.X...##.#
- #..#..##..X.#
- #....##.XX#.#
-######XX...#...#
-#OOOO#..########
-#O#OOO.##
-#OOOO...#
-#OOOO...#
-#########
diff --git a/Levels/45.sokolvl b/Levels/45.sokolvl
deleted file mode 100644
index 8196ccd..0000000
--- a/Levels/45.sokolvl
+++ /dev/null
@@ -1,22 +0,0 @@
-;version: 1
-;name: 45
-
- ######
- #####...#
- #...#.#.#####
- #.X.#..X....######
- ##X..###.##.......#
-###..XX.X.X.#..##...#####
-#.......X...######.##...#
-#..########.#@...#.#..#.#
-##.###......####.#X#.#..#
- #.###.####.##OO.#...X.##
- #..X..X..#X##OO.#X##..##
- #..#.#.#.....OO##.##.X.#
- ####...#.##.#OO#....X..#
- #####....#OO#.#.#..##
- ######OO#...#.##
- #OO#####..#
- #OO.......#
- ##..###..##
- #########
diff --git a/Levels/46.sokolvl b/Levels/46.sokolvl
deleted file mode 100644
index e662e7e..0000000
--- a/Levels/46.sokolvl
+++ /dev/null
@@ -1,14 +0,0 @@
-;version: 1
-;name: 46
-
- #######
- #####..#..####
- #...#...X....#
- ####.#XX.##.##..#
-##......#.#..##.###
-#..###.X#X..X..X..#
-#OOO....#.##..#...#
-#OOO#....@.#.###.##
-#OOO#..###..X..X..#
-######## ##...#...#
- #########
diff --git a/Levels/47.sokolvl b/Levels/47.sokolvl
deleted file mode 100644
index 369ce7f..0000000
--- a/Levels/47.sokolvl
+++ /dev/null
@@ -1,20 +0,0 @@
-;version: 1
-;name: 47
-
- ######### ####
- #...##..####..#
- #...X...#..X..#
- #..#.##.#.....####
- ##.X...X.XX#.#...#
- ####..#..#.X.X...#
-#####..####....###OOO#
-#...#X.#..#.####OOOOO#
-#......#..#.#.##OOOOO#
-######.#..#X...###OOO#
- #...##.#.X#...#OOO#
- ##.......X..X#.#####
- ##.XXX##..#.X...#
- #...#..#.###..###
- #...X..#X.@####
- #####..#...#
- ########
diff --git a/Levels/48.sokolvl b/Levels/48.sokolvl
deleted file mode 100644
index cbf36f4..0000000
--- a/Levels/48.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 48
-
- #####
- #...#
- #.#.######
- #......X@######
- #.X.##X.###...#
- #.####.X....X.#
- #.#####.#..#X.####
-##..####.##X......#
-#..X#..X..#.##.##.#
-#.........#.#OOO#.#
-######..###..OOO..#
- #### #.#OOO#.#
- #.###.#.#
- #.......#
- #########
diff --git a/Levels/49.sokolvl b/Levels/49.sokolvl
deleted file mode 100644
index ace7079..0000000
--- a/Levels/49.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 49
-
- ####
- #..##
- #...##
- #.XX.##
- ###X..X.##
- ####....X...#
-###..#.#####..#
-#....#.#OOOOX.#
-#.#...X.OOOO#.#
-#..X.#.#O%OO#.#
-###..####.###.#
- ####.@X..##X##
- ###.X.....#
- #..##...#
- #########
diff --git a/Levels/5.sokolvl b/Levels/5.sokolvl
deleted file mode 100644
index 9a0b469..0000000
--- a/Levels/5.sokolvl
+++ /dev/null
@@ -1,16 +0,0 @@
-;version: 1
-;name: 05
-
- ########
- #..OOOO#
- ############..OOOO#
- #....#..X.X...OOOO#
- #.XXX#X..X.#..OOOO#
- #..X.....X.#..OOOO#
- #.XX.#X.X.X########
-####..X.#.....#
-#...#.#########
-#....X..##
-#.XX#XX.@#
-#...#...##
-#########
diff --git a/Levels/50.sokolvl b/Levels/50.sokolvl
deleted file mode 100644
index f87a302..0000000
--- a/Levels/50.sokolvl
+++ /dev/null
@@ -1,19 +0,0 @@
-;version: 1
-;name: 50
-
- ############
- ##OO....#...#
- ##OO%.X....X.#
- ##OO%O#.#.#X.##
- #OO%O#.#.#.X..#
-####OOO#..#....#.#
-#..##.#..........#
-#[email protected].###..#.#.##
-#.X...X...#.#...#
-###XX...#.#.#.#.#
- #...X...#.#.#####
- #.X#.#####......#
- #X...# #...#..#
- #..### ##.....#
- #..# #....##
- #### ######
diff --git a/Levels/51.sokolvl b/Levels/51.sokolvl
deleted file mode 100644
index 65b69e4..0000000
--- a/Levels/51.sokolvl
+++ /dev/null
@@ -1,19 +0,0 @@
-;version: 1
-;name: 51
-
- #############
- #....###....#
- #.....X.X..####
- ####.#...X.X....#
- ##.X..#X####.X.X.#
-###...#.#...###..X.#
-#.X..X..#..X..#.####
-#.##X####.#X#..X..###
-#.##..###.#.#.#..X..#
-#[email protected]...#.X.#.#
-#####..#..##..#.X#..#
- #OOO.#####X..#..#.#
- #OOOOOOO#.XX.#X.#.#
- #OOOOOOO#.........#
- #OOOOOOO#######..##
- ######### ####
diff --git a/Levels/52.sokolvl b/Levels/52.sokolvl
deleted file mode 100644
index 25feb75..0000000
--- a/Levels/52.sokolvl
+++ /dev/null
@@ -1,17 +0,0 @@
-;version: 1
-;name: 52
-
-##### ####
-#OOO# #..####
-#OOO###..X..#
-#OOOO##.X..X###
-##OOOO##...X..#
-###OOO.##.X.X.#
-#.##....#..X..#
-#..##.#.###.####
-#.X.#.#X..X....#
-#...#.X.XX.X.###
-#..######..###
-#.## ####
-###
diff --git a/Levels/53.sokolvl b/Levels/53.sokolvl
deleted file mode 100644
index cdca43e..0000000
--- a/Levels/53.sokolvl
+++ /dev/null
@@ -1,17 +0,0 @@
-;version: 1
-;name: 53
-
- ####
-##..#####
-#.......# #####
-#.X###..###...#
-#OO#..X#.#..#.#
-#OO#......XX#.###
-#O%#.#..#X.X....#####
-#OO#..##.....##X#...#
-#O%X..X.#.##..X.....#
-#OO##..X...#...######
-#O%##X##...#####
-#OO..X.#####
-#..#.@.#
-########
diff --git a/Levels/54.sokolvl b/Levels/54.sokolvl
deleted file mode 100644
index 1585776..0000000
--- a/Levels/54.sokolvl
+++ /dev/null
@@ -1,22 +0,0 @@
-;version: 1
-;name: 54
-
- ##########
- #..###...#
- #.X...X..#
- #..####X##
- ##.#..#..#
- ##..#O%...#
- #..##OO#..#
- #.@.#O%#.##
- #.#X#OO#X.#
- #.X.#OO#..#
- #.#.#%%#..#
- #.X.#OO#X##
- #....O%#..#
- ###..#..#..#
-##....####..#
-#..#######X##
-#.X......X..#
-#..##...#...#
-#############
diff --git a/Levels/55.sokolvl b/Levels/55.sokolvl
deleted file mode 100644
index 27e07bc..0000000
--- a/Levels/55.sokolvl
+++ /dev/null
@@ -1,23 +0,0 @@
-;version: 1
-;name: 55
-
- #####################
- #...##..#...#...#...#
- #.X.....X...X...X...##
-#####.#..#...###.##X###
-#...#.##X######...#...#
-#.X...#.OOOOOO#...#.X.#
-##.#..#.OOOOOO#####...#
-##.#########OO#...#.###
-#..........#OO#.X...#
-#.##.###.###OO##.#..###
-#.#...#...##OO##.###..#
-#.#...#...##..#...##..#
-#####.##############.##
-#..........#...#....X.#
-#.X..#.X.X.X...#.#....#
-#.#X##.X#..##.##....#.#
-#..X.XX.####.X..X.#.#.#
-#..........#...#......#
-#######################
diff --git a/Levels/56.sokolvl b/Levels/56.sokolvl
deleted file mode 100644
index c1be432..0000000
--- a/Levels/56.sokolvl
+++ /dev/null
@@ -1,18 +0,0 @@
-;version: 1
-;name: 56
-
- #####################
-##...................#
-#....X.#......##.#...#
-#..######.###..#X##.##
-##X#...##X#OOOO...#.#
-#..#....X.#OOOO##.#.#
-#.X.#.#.#.#OOOO##...#
-#.X.#XX...#OOOO##X#.#
-#.#.X@X##X#OOOO##...#
-#...XXX...#OOOO#....#
-#..X#...#.######.X###
-##..#.###XX..X...X.#
-##.....#.X..X.##...#
- #####...#...#######
- #########
diff --git a/Levels/57.sokolvl b/Levels/57.sokolvl
deleted file mode 100644
index 545e170..0000000
--- a/Levels/57.sokolvl
+++ /dev/null
@@ -1,19 +0,0 @@
-;version: 1
-;name: 57
-
-##########
-#........####
-#.######.#..##
-#.#.X.X.X..X.#
-#.......#X...#
-###X..XX#..###
- #..##.#.X##
- ##X#...X.@#
- #..X.X.###
- #.#...X..#
- #.##...#.#
- ##..#####.#
- #.........#
- #OOOOOOO###
- #OOOOOOO#
- #########
diff --git a/Levels/58.sokolvl b/Levels/58.sokolvl
deleted file mode 100644
index 2a8ba3e..0000000
--- a/Levels/58.sokolvl
+++ /dev/null
@@ -1,14 +0,0 @@
-;version: 1
-;name: 58
-
- ####
- #########..##
-##..X......X.#####
-#...##.##...##OOO#
-#.#XX.X.XX#X##OOO#
-#.#....@..#...OOO#
-#..X#.###XX...OOO#
-#.X..XX..X.##OOOO#
-###X.......#######
- #..#######
- ####
diff --git a/Levels/59.sokolvl b/Levels/59.sokolvl
deleted file mode 100644
index ec608c0..0000000
--- a/Levels/59.sokolvl
+++ /dev/null
@@ -1,23 +0,0 @@
-;version: 1
-;name: 59
-
- ######
- #####....#
- #..##.#..#####
- #...%O#OO#...#
- ##### ####.X#O#OOO....#
- #...###..##.#%OOOO##.##
- #.X......##.#OO#OO##.#
-######.#...#.#%O#####.#
-#...#.X#X#.#.#OO#####.#
-#.X..X.....#.#%O....#.#
-##.##..X.###.#..##..#.#
- #..X..X.###.#####.##.#
- ###X###X###..####.##.#
-####.#.........###..#.#
-#..X.#..X####..###XX#@#####
-#......X.# #..####..#X#...#
-####.#..X# #..............#
- #..X..# ##..##..########
- ##..### ########
- ####
diff --git a/Levels/6.sokolvl b/Levels/6.sokolvl
deleted file mode 100644
index cfbf101..0000000
--- a/Levels/6.sokolvl
+++ /dev/null
@@ -1,16 +0,0 @@
-;version: 1
-;name: 06
-
- #####
- #...#####
- #.#X##..#
- #.....X.#
-#########.###...#
-#OOOO..##.X..X###
-#OOOO....X.XX.##
-#OOOO..##X..X.@#
-#########..X..##
- #.X.X..#
- ###.##.#
- #....#
- ######
diff --git a/Levels/60.sokolvl b/Levels/60.sokolvl
deleted file mode 100644
index 19f2fb6..0000000
--- a/Levels/60.sokolvl
+++ /dev/null
@@ -1,23 +0,0 @@
-;version: 1
-;name: 60
-
- ####
- #..#
- #..########
- #######..#......#
- #...#.#.#.#.#...##
- #.X.....X..##..X.#
- ###.X#.#..#.#.....#########
- #..X..#..X#.#.XX.#...#.#..#
- ##.#...#.....###....X.#.#..#
- #..#X...#.###..#..#.XX#.#..#
- #....X##.X..#...##.X..#.#.##
-####X.X.#....##..#...X....OO#
-#..#....###.#.X.X.###..###O%#
-#.....##[email protected].....##OOOO#
-#..##..##...X..#X#..##OOOO%O#
-##.#..X..#.#.X##..##OOOO%O###
-##.##..X..#.X.#..#OOOO%O###
-#....X.####...#.OOOO%O###
-#...#..# #..#..OO%O###
-######## ###########
diff --git a/Levels/7.sokolvl b/Levels/7.sokolvl
deleted file mode 100644
index ffcc960..0000000
--- a/Levels/7.sokolvl
+++ /dev/null
@@ -1,14 +0,0 @@
-;version: 1
-;name: 07
-
-###### ###
-#OO..# ##@##
-#OO..###...#
-#OO.....XX.#
-#OO..#.#.X.#
-#OO###.#.X.#
-####.X.#X..#
- #..X#.X.#
- #.X..X..#
- #..##...#
- #########
diff --git a/Levels/8.sokolvl b/Levels/8.sokolvl
deleted file mode 100644
index ba64172..0000000
--- a/Levels/8.sokolvl
+++ /dev/null
@@ -1,15 +0,0 @@
-;version: 1
-;name: 08
-
- #####
- #######...##
-##.#.@##.XX.#
-#....X......#
-#..X..###...#
-###.#####X###
-#.X..###.OO#
-#.X.X.X.OOO#
-#....###OOO#
-#.XX.# #OOO#
-#..### #####
-####
diff --git a/Levels/9.sokolvl b/Levels/9.sokolvl
deleted file mode 100644
index 62eeb72..0000000
--- a/Levels/9.sokolvl
+++ /dev/null
@@ -1,20 +0,0 @@
-;version: 1
-;name: 09
-
- ####
- #..###########
- #....X...X.X.#
- #.X#.X.#..X..#
- #..X.X..#....#
-###.X#.#..####.#
-#@#X.X.X..##...#
-#....X.#X#...#.#
-##..X....X.X.X.#
- ####..#########
- ###..###
- #......#
- #......#
- #OOOOOO#
- #OOOOOO#
- #OOOOOO#
- ########
diff --git a/Levels/levels.py b/Levels/levels.py
deleted file mode 100644
index e6fc841..0000000
--- a/Levels/levels.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Level data stolen from: https://www.mathsisfun.com/games/sokoban.html
-# (https://www.mathsisfun.com/games/a/sokoban/js/maps.js)
-maps=[[[0,0,1,1,1,1,1,0],[1,1,1,2,2,2,1,0],[1,3,6,4,2,2,1,0],[1,1,1,2,4,3,1,0],[1,3,1,1,4,2,1,0],[1,2,1,2,3,2,1,1],[1,4,2,5,4,4,3,1],[1,2,2,2,3,2,2,1],[1,1,1,1,1,1,1,1]],[[2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,1,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,1,4,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,1,1,1,2,2,4,1,1,1,2,2,2,2,2,2,2,2,2,2,2],[2,2,1,2,2,4,2,2,4,2,1,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,2,1,2,1,1,1,2,1,2,2,2,2,2,1,1,1,1,1,1],[1,2,2,2,1,2,1,1,1,2,1,1,1,1,1,1,1,2,2,3,3,1],[1,2,4,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,1],[1,1,1,1,1,2,1,1,1,1,2,1,6,1,1,1,1,2,2,3,3,1],[2,2,2,2,1,2,2,2,2,2,2,1,1,1,2,2,1,1,1,1,1,1],[2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]],[[1,1,1,1,1,1,1,1,1,1,1,1,2,2],[1,3,3,2,2,1,2,2,2,2,2,1,1,1],[1,3,3,2,2,1,2,4,2,2,4,2,2,1],[1,3,3,2,2,1,4,1,1,1,1,2,2,1],[1,3,3,2,2,2,2,6,2,1,1,2,2,1],[1,3,3,2,2,1,2,1,2,2,4,2,1,1],[1,1,1,1,1,1,2,1,1,4,2,4,2,1],[2,2,1,2,4,2,2,4,2,4,2,4,2,1],[2,2,1,2,2,2,2,1,2,2,2,2,2,1],[2,2,1,1,1,1,1,1,1,1,1,1,1,1]],[[2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,2],[2,2,2,2,2,2,2,2,1,2,2,2,2,2,6,1,2],[2,2,2,2,2,2,2,2,1,2,4,1,4,2,1,1,2],[2,2,2,2,2,2,2,2,1,2,4,2,2,4,1,2,2],[2,2,2,2,2,2,2,2,1,1,4,2,4,2,1,2,2],[1,1,1,1,1,1,1,1,1,2,4,2,1,2,1,1,1],[1,3,3,3,3,2,2,1,1,2,4,2,2,4,2,2,1],[1,1,3,3,3,2,2,2,2,4,2,2,4,2,2,2,1],[1,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,3,3,3,3,1],[2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,1],[2,2,2,1,2,2,2,2,1,2,2,4,2,4,2,2,2,3,3,3,3,1],[2,2,2,1,2,4,4,4,1,4,2,2,4,2,1,2,2,3,3,3,3,1],[2,2,2,1,2,2,4,2,2,2,2,2,4,2,1,2,2,3,3,3,3,1],[2,2,2,1,2,4,4,2,1,4,2,4,2,4,1,1,1,1,1,1,1,1],[1,1,1,1,2,2,4,2,1,2,2,2,2,2,1,2,2,2,2,2,2,2],[1,2,2,2,1,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2],[1,2,2,2,2,4,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,2,4,4,1,4,4,2,6,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,2,1,1,1,1,1],[2,2,2,2,2,2,2,2,1,2,1,4,1,1,2,2,1],[2,2,2,2,2,2,2,2,1,2,2,2,2,2,4,2,1],[1,1,1,1,1,1,1,1,1,2,1,1,1,2,2,2,1],[1,3,3,3,3,2,2,1,1,2,4,2,2,4,1,1,1],[1,3,3,3,3,2,2,2,2,4,2,4,4,2,1,1,2],[1,3,3,3,3,2,2,1,1,4,2,2,4,2,6,1,2],[1,1,1,1,1,1,1,1,1,2,2,4,2,2,1,1,2],[2,2,2,2,2,2,2,2,1,2,4,2,4,2,2,1,2],[2,2,2,2,2,2,2,2,1,1,1,2,1,1,2,1,2],[2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2]],[[1,1,1,1,1,1,2,2,1,1,1,2],[1,3,3,2,2,1,2,1,1,6,1,1],[1,3,3,2,2,1,1,1,2,2,2,1],[1,3,3,2,2,2,2,2,4,4,2,1],[1,3,3,2,2,1,2,1,2,4,2,1],[1,3,3,1,1,1,2,1,2,4,2,1],[1,1,1,1,2,4,2,1,4,2,2,1],[2,2,2,1,2,2,4,1,2,4,2,1],[2,2,2,1,2,4,2,2,4,2,2,1],[2,2,2,1,2,2,1,1,2,2,2,1],[2,2,2,1,1,1,1,1,1,1,1,1]],[[2,2,2,2,2,2,2,1,1,1,1,1,2],[2,1,1,1,1,1,1,1,2,2,2,1,1],[1,1,2,1,2,6,1,1,2,4,4,2,1],[1,2,2,2,2,4,2,2,2,2,2,2,1],[1,2,2,4,2,2,1,1,1,2,2,2,1],[1,1,1,2,1,1,1,1,1,4,1,1,1],[1,2,4,2,2,1,1,1,2,3,3,1,2],[1,2,4,2,4,2,4,2,3,3,3,1,2],[1,2,2,2,2,1,1,1,3,3,3,1,2],[1,2,4,4,2,1,2,1,3,3,3,1,2],[1,2,2,1,1,1,2,1,1,1,1,1,2],[1,1,1,1,2,2,2,2,2,2,2,2,2]],[[2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2],[2,2,1,2,2,1,1,1,1,1,1,1,1,1,1,1],[2,2,1,2,2,2,2,4,2,2,2,4,2,4,2,1],[2,2,1,2,4,1,2,4,2,1,2,2,4,2,2,1],[2,2,1,2,2,4,2,4,2,2,1,2,2,2,2,1],[1,1,1,2,4,1,2,1,2,2,1,1,1,1,2,1],[1,6,1,4,2,4,2,4,2,2,1,1,2,2,2,1],[1,2,2,2,2,4,2,1,4,1,2,2,2,1,2,1],[1,1,2,2,4,2,2,2,2,4,2,4,2,4,2,1],[2,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1],[2,2,1,1,1,2,2,1,1,1,2,2,2,2,2,2],[2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2],[2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2],[2,2,1,3,3,3,3,3,3,1,2,2,2,2,2,2],[2,2,1,3,3,3,3,3,3,1,2,2,2,2,2,2],[2,2,1,3,3,3,3,3,3,1,2,2,2,2,2,2],[2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1],[2,2,2,2,2,2,2,2,2,2,1,2,2,3,3,3,1],[2,2,2,2,2,2,1,1,1,1,1,2,2,3,3,3,1],[2,2,2,2,2,2,1,2,2,2,2,2,2,3,3,3,1],[2,2,2,2,2,2,1,2,2,1,1,2,2,3,3,3,1],[2,2,2,2,2,2,1,1,2,1,1,2,2,3,3,3,1],[2,2,2,2,2,1,1,1,2,1,1,1,1,1,1,1,1],[2,2,2,2,2,1,2,4,4,4,2,1,1,2,2,2,2],[2,1,1,1,1,1,2,2,4,2,4,2,1,1,1,1,1],[1,1,2,2,2,1,4,2,4,2,2,2,1,2,2,2,1],[1,6,2,4,2,2,4,2,2,2,2,4,2,2,4,2,1],[1,1,1,1,1,1,2,4,4,2,4,2,1,1,1,1,1],[2,2,2,2,2,1,2,4,2,2,2,2,1,2,2,2,2],[2,2,2,2,2,1,1,1,1,2,1,1,1,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2],[2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,1,2,2,2],[2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2],[2,2,2,2,2,2,2,2,2,1,2,2,1,1,1,1,2,1,1,1,2],[2,1,1,1,2,2,1,1,1,1,1,2,1,1,1,2,2,2,2,1,2],[1,1,6,1,1,1,1,2,2,2,4,4,4,2,1,2,2,2,2,1,2],[1,2,4,4,2,2,2,4,4,2,4,2,2,2,1,3,3,3,3,1,1],[1,2,2,4,4,4,1,2,2,2,2,4,2,2,1,3,3,3,3,3,1],[1,2,4,2,2,2,1,2,4,4,2,4,4,2,1,3,3,3,3,3,1],[1,1,1,2,2,2,1,2,2,4,2,2,2,2,1,3,3,3,3,3,1],[2,2,1,2,2,2,1,2,4,2,4,2,4,2,1,3,3,3,3,3,1],[2,2,1,2,1,1,1,1,1,1,1,2,1,1,1,3,3,3,3,3,1],[2,2,1,2,2,2,1,2,2,4,2,4,2,2,1,3,3,3,3,3,1],[2,2,1,1,1,2,1,2,4,4,2,4,2,4,1,1,1,1,1,1,1],[2,2,2,2,1,2,1,2,2,4,2,2,2,2,2,2,1,2,2,2,2],[2,2,2,2,1,2,1,2,4,4,4,2,4,4,4,2,1,2,2,2,2],[2,2,2,2,1,2,1,2,2,2,2,2,2,2,1,2,1,2,2,2,2],[2,2,2,2,1,2,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2],[2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2],[2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2],[2,2,2,2,2,1,1,1,1,2,1,2,2,1,2,2,2,2,2],[2,2,2,1,1,1,2,2,1,1,1,4,2,1,2,2,2,2,2],[2,2,1,1,2,2,2,6,2,2,4,2,2,1,2,2,2,2,2],[2,1,1,2,2,4,2,4,4,1,1,2,1,1,2,2,2,2,2],[2,1,2,2,1,4,1,1,2,2,2,2,2,1,2,2,2,2,2],[2,1,2,1,2,4,2,4,4,2,1,2,1,1,1,2,2,2,2],[2,1,2,2,2,4,2,1,2,2,1,2,4,2,1,1,1,1,1],[1,1,1,1,2,2,2,2,1,2,2,4,4,2,1,2,2,2,1],[1,1,1,1,2,1,1,2,4,2,2,2,2,2,2,2,2,2,1],[1,3,2,2,2,2,1,1,1,2,2,1,1,1,1,1,1,1,1],[1,3,3,2,3,3,1,2,1,1,1,1,2,2,2,2,2,2,2],[1,3,3,3,1,3,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,3,3,3,3,3,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,1,1,1,1,1,1,1,1,1,2,2],[2,2,1,5,3,5,1,5,3,5,1,2,2],[2,2,1,3,5,3,5,3,5,3,1,2,2],[2,2,1,5,3,5,3,5,3,5,1,2,2],[2,2,1,3,5,3,5,3,5,3,1,2,2],[2,2,1,5,3,5,3,5,3,5,1,2,2],[2,2,1,1,1,2,2,2,1,1,1,2,2],[2,2,2,2,1,2,2,2,1,2,2,2,2],[1,1,1,1,1,1,2,1,1,1,1,1,1],[1,2,2,2,2,2,2,2,2,2,2,2,1],[1,2,4,2,4,2,4,2,4,2,4,2,1],[1,1,2,4,2,4,2,4,2,4,2,1,1],[2,1,4,2,4,2,4,2,4,2,4,1,2],[2,1,2,2,2,4,6,4,2,2,2,1,2],[2,1,2,2,1,1,1,1,1,2,2,1,2],[2,1,1,1,1,2,2,2,1,1,1,1,2]],[[2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2],[2,2,1,1,1,2,2,2,1,1,2,2,1,1,1,1,1,2,2,2],[1,1,1,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,1],[1,2,2,4,4,2,1,4,2,1,2,2,1,2,2,3,3,3,2,1],[1,2,1,2,2,4,1,6,4,1,1,2,1,2,1,3,1,3,2,1],[1,2,2,1,1,2,1,4,2,2,1,2,2,2,2,3,3,3,2,1],[1,2,4,1,2,2,2,2,4,2,1,2,1,2,1,3,1,3,2,1],[1,2,2,2,2,1,1,2,2,1,1,4,2,4,2,3,3,3,2,1],[1,2,4,2,1,1,2,2,2,1,2,2,1,4,1,3,1,3,2,1],[1,1,2,4,4,2,2,4,2,2,2,4,2,2,4,3,3,3,2,1],[2,1,4,2,2,1,1,1,1,1,1,2,2,2,2,1,1,2,2,1],[2,1,2,2,2,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1],[2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2],[1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2],[1,2,1,2,1,1,1,1,1,1,2,2,2,2,2,1,2],[1,2,1,2,2,4,2,4,2,4,2,4,1,2,2,1,2],[1,2,1,2,2,2,4,6,4,2,2,2,1,1,2,1,1],[1,2,1,2,1,4,2,4,2,4,1,1,1,3,3,3,1],[1,2,1,2,2,2,4,2,4,2,2,1,1,3,3,3,1],[1,2,1,1,1,4,4,4,2,4,2,1,1,3,3,3,1],[1,2,2,2,2,2,1,2,1,1,2,1,1,3,3,3,1],[1,1,1,1,1,2,2,2,1,1,2,1,1,3,3,3,1],[2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,1],[2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,2],[2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2]],[[2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2],[2,2,2,2,1,1,1,1,2,2,1,2,2,2,2,2,2],[2,2,2,1,1,2,2,1,2,2,1,2,2,2,2,2,2],[2,2,2,1,2,2,4,2,4,2,1,2,2,2,2,2,2],[2,1,1,1,2,1,4,2,2,2,1,1,1,1,2,2,2],[2,1,2,2,4,2,2,1,1,4,2,2,2,1,2,2,2],[2,1,2,2,1,2,6,2,4,2,1,2,4,1,2,2,2],[2,1,2,2,1,2,2,2,2,2,2,4,2,1,1,1,1],[2,1,1,2,1,1,1,1,4,1,1,2,2,2,2,2,1],[2,1,2,4,1,3,3,3,3,3,1,2,1,2,2,2,1],[2,1,2,2,4,3,3,3,5,3,2,4,1,2,1,1,1],[1,1,2,2,1,3,3,3,3,3,1,2,2,2,1,2,2],[1,2,2,2,1,1,1,2,1,1,1,1,1,1,1,2,2],[1,2,4,4,2,2,1,2,2,1,2,2,2,2,2,2,2],[1,2,2,1,2,2,2,2,2,1,2,2,2,2,2,2,2],[1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,2,2],[2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2]],[[1,1,1,1,1,2,2,2,2,2,2,2,2,2],[1,2,2,2,1,1,2,2,2,2,2,2,2,2],[1,2,2,2,2,1,2,2,1,1,1,1,2,2],[1,2,4,2,2,1,1,1,1,2,2,1,2,2],[1,2,2,4,4,2,4,2,2,2,4,1,2,2],[1,1,1,6,2,1,4,2,2,2,2,1,1,2],[2,1,2,2,1,1,2,2,4,2,4,2,1,1],[2,1,2,4,2,2,1,1,2,1,1,2,3,1],[2,1,2,2,1,4,1,1,4,2,2,1,3,1],[2,1,1,1,2,2,2,4,3,3,1,1,3,1],[2,2,1,2,2,2,2,1,3,5,3,3,3,1],[2,2,1,2,4,4,2,1,3,3,3,3,3,1],[2,2,1,2,2,1,1,1,1,1,1,1,1,1],[2,2,1,2,2,1,2,2,2,2,2,2,2,2],[2,2,1,1,1,1,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2],[2,1,1,1,1,1,1,1,2,2,2,2,2,1,2,2,2,2],[2,1,2,2,2,2,2,1,2,4,6,4,2,1,2,2,2,2],[2,1,4,4,2,1,2,2,2,1,1,1,1,1,1,1,1,1],[2,1,2,1,1,1,3,3,3,3,3,3,1,1,2,2,2,1],[2,1,2,2,2,4,3,3,3,3,3,3,1,1,2,1,2,1],[2,1,2,1,1,1,3,3,3,3,3,3,2,2,2,2,2,1],[1,1,2,2,2,1,1,1,1,2,1,1,1,2,1,4,1,1],[1,2,2,1,4,2,2,2,1,2,2,4,2,2,1,2,1,2],[1,2,2,4,2,4,4,4,2,2,1,2,4,1,1,2,1,2],[1,2,2,2,4,2,4,2,1,1,1,4,4,2,1,2,1,2],[1,1,1,1,1,2,2,2,2,2,4,2,2,2,1,2,1,2],[2,2,2,2,1,1,1,2,1,1,1,2,2,2,1,2,1,2],[2,2,2,2,2,2,1,2,2,2,2,2,1,2,2,2,1,2],[2,2,2,2,2,2,1,1,1,1,1,1,1,1,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2]],[[2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2],[2,2,2,2,2,2,1,2,2,3,2,2,1,1,2,2,2,1,2,2,2,2],[2,2,2,2,2,2,1,2,1,3,2,2,2,2,2,6,2,1,2,2,2,2],[2,1,1,1,1,1,1,2,1,1,3,3,3,1,2,1,1,1,1,2,2,2],[1,1,2,2,1,1,3,3,3,1,1,1,1,2,2,2,2,2,1,1,1,1],[1,2,4,2,1,1,3,3,3,2,2,2,2,4,2,1,2,2,4,2,2,1],[1,2,2,2,2,2,3,3,2,1,1,2,1,2,1,1,2,1,1,2,2,1],[1,1,1,1,4,1,1,1,4,1,2,4,2,2,1,2,2,2,1,2,1,1],[2,1,1,1,2,2,1,2,2,2,2,1,1,4,2,4,4,2,1,2,1,2],[2,1,2,2,2,4,4,2,1,2,1,2,4,2,1,2,4,1,1,2,1,2],[2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2],[2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2]],[[2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,2,6,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,1,1,1,1,2,4,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,4,1,1,2,2,1,1,2,2,2,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,2,2,1,2,2,1,1,1,1,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,1,4,4,2,4,2,2,2,2,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,2,4,2,4,2,1,1,1,2,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,1,2,2,2,4,2,2,1,2,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,1,2,2,1,4,1,2,2,2,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,1,1,2,1,1,1,1,2,2,2,1,2,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,1,2,2,4,2,2,1,1,1,1,1,2,1,2,1,2,1,1,1,1,2,2,2],[2,2,2,2,1,1,2,2,2,2,4,2,2,2,2,2,4,2,2,1,1,1,2,2,1,1,1,1],[1,1,1,1,1,2,2,1,1,1,2,4,2,4,1,2,4,2,1,2,2,2,3,3,3,3,3,1],[1,2,2,2,2,2,1,1,2,2,2,2,2,2,1,2,2,1,1,2,2,1,3,3,3,3,3,1],[1,2,4,4,4,4,2,2,2,2,1,1,1,1,1,1,4,1,1,2,2,2,1,3,1,1,3,1],[1,1,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,3,3,3,3,1],[2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,1],[2,2,1,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,1,1],[2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2]],[[2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2],[2,2,2,2,2,2,2,1,3,3,3,3,3,3,3,3,3,3,1,2],[2,2,2,2,2,1,1,1,3,1,3,1,3,1,3,1,3,3,1,2],[2,2,2,2,2,1,2,2,2,3,3,3,3,3,3,3,3,3,1,2],[2,2,2,2,2,1,6,2,4,2,4,2,4,2,5,3,5,3,1,2],[2,2,2,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2],[2,1,1,1,1,2,2,2,1,2,2,2,2,1,1,2,2,1,2,2],[1,1,2,2,2,2,4,2,1,2,2,2,2,1,2,4,2,1,1,2],[1,2,2,1,4,1,2,1,1,1,2,1,1,1,4,2,2,2,1,1],[1,2,4,2,2,4,2,4,2,2,2,1,2,4,2,4,2,4,2,1],[1,2,2,1,2,4,2,1,1,2,2,2,2,2,2,2,1,4,2,1],[1,2,2,2,4,1,1,1,1,4,1,1,1,1,4,1,1,2,2,1],[1,1,1,1,2,2,1,1,2,2,2,1,2,2,2,2,1,2,2,1],[2,2,2,1,4,2,1,1,2,2,2,1,2,1,2,4,4,2,2,1],[2,2,2,1,2,2,2,1,2,4,2,1,2,2,4,2,2,2,2,1],[2,2,2,1,1,1,2,1,2,4,4,2,1,2,2,4,2,1,1,1],[2,2,2,2,2,1,2,1,2,2,2,2,1,2,4,2,1,1,2,2],[2,2,2,2,2,1,2,1,1,1,1,1,1,1,1,2,1,2,2,2],[2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,1,2,2,2],[2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2]],[[2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2],[2,2,2,1,3,3,2,2,1,2,2,2,1,2,2,2],[2,2,2,1,3,3,2,2,2,2,2,2,1,2,2,2],[2,2,2,1,3,3,2,2,1,2,2,1,1,1,1,2],[2,2,1,1,1,1,1,1,1,2,2,1,2,2,1,1],[2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,1],[2,2,1,2,2,1,2,2,1,1,2,2,1,2,2,1],[1,1,1,1,2,1,1,2,2,1,1,1,1,2,1,1],[1,2,2,4,2,2,1,1,1,1,1,2,1,2,2,1],[1,2,1,2,4,2,2,4,2,2,1,2,4,2,2,1],[1,2,6,4,2,2,4,2,2,2,1,2,2,2,1,1],[1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2],[2,2,2,1,2,2,2,2,1,2,2,2,2,2,2,2],[2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2],[2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,2,2],[2,1,2,2,2,2,1,2,2,1,2,2,4,2,2,1,2,2,2,1,1,2],[2,1,2,4,2,4,2,4,2,2,4,2,1,2,4,2,4,2,2,2,1,2],[2,1,1,4,2,4,2,2,2,1,2,6,1,2,4,2,2,2,4,2,1,2],[1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2],[1,2,2,4,2,4,1,2,2,1,3,3,3,3,3,3,1,2,4,1,2,2],[1,2,1,2,2,2,1,2,2,1,3,3,3,3,3,3,1,1,2,1,2,2],[1,2,2,1,1,2,1,1,2,1,2,3,3,3,3,3,1,2,2,1,2,2],[1,2,1,2,2,2,2,2,2,4,3,3,3,3,3,3,2,4,2,1,2,2],[1,2,1,2,4,2,1,1,2,1,3,3,3,3,3,3,1,2,2,1,2,2],[1,2,2,4,2,4,1,2,2,1,3,3,3,3,3,3,1,2,4,1,2,2],[1,2,4,2,2,2,1,2,2,1,1,4,1,1,1,1,1,2,2,1,2,2],[1,2,4,2,4,2,1,1,1,1,2,4,2,4,2,2,4,2,4,1,2,2],[1,1,2,1,2,2,2,2,2,4,2,4,2,4,2,4,2,2,2,1,1,1],[2,1,2,2,1,1,1,1,1,1,2,4,2,2,2,2,4,2,2,2,2,1],[2,1,2,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,2,1],[2,1,1,1,1,1,1,1,2,1,4,2,2,2,2,2,2,2,2,2,2,1],[2,2,2,2,2,2,2,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1],[2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,1,2,4,1,4,2,1,2,2,1,1,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,2,2,1,2,2,1,2,2,2,1,1,1,1,1,1,1,1],[1,3,3,3,3,2,2,1,2,4,1,4,2,1,2,2,4,1,2,2,1,2,2,2,1],[1,3,3,3,3,1,2,1,2,2,2,2,2,1,4,2,2,1,2,2,2,2,2,2,1],[1,3,3,1,3,2,2,2,2,4,1,2,2,1,2,4,2,2,2,2,1,4,2,2,1],[1,3,3,3,2,6,1,1,2,2,1,4,2,1,4,2,2,1,2,2,1,2,2,2,1],[1,3,3,3,3,2,1,1,2,4,1,2,2,2,2,2,4,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,2,2,1,4,4,1,4,2,2,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,1,2,4,1,2,2,1,2,2,4,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,1,2,2,1,2,2,1,2,2,2,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,1,1,1,1,2,2,1,1,1,1,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2],[2,2,2,1,3,3,3,3,3,3,3,3,1,1,1,1,2,2,2,2,2],[2,2,2,1,3,1,3,1,3,3,3,3,1,2,2,1,2,2,2,2,2],[2,2,2,1,3,3,3,3,3,3,3,3,4,4,2,1,2,2,2,2,2],[2,2,2,1,2,2,2,2,2,3,1,1,1,2,2,1,1,1,1,2,2],[2,1,1,1,1,1,1,1,1,1,2,2,4,2,1,2,2,2,1,2,2],[2,1,2,2,2,2,2,4,2,2,2,4,2,4,2,2,4,2,1,2,2],[2,1,2,2,1,2,2,2,2,1,2,2,4,2,4,1,2,2,1,2,2],[2,1,1,2,1,1,1,1,1,2,2,2,1,2,2,1,2,2,1,2,2],[2,1,2,4,2,2,2,2,2,1,2,2,2,1,1,1,1,2,1,2,2],[1,1,2,2,4,1,2,2,2,1,2,1,1,2,2,1,2,2,1,2,2],[1,2,2,2,2,1,1,4,1,1,1,2,2,2,2,1,2,2,1,1,2],[1,2,4,2,2,2,2,4,2,1,2,2,1,2,2,1,2,2,2,1,2],[1,1,1,1,1,2,2,2,2,1,2,1,1,2,1,2,1,1,2,1,1],[2,2,2,2,1,4,1,2,1,2,2,4,2,2,4,2,4,2,2,2,1],[2,2,2,2,1,6,1,2,2,4,1,4,4,4,2,2,1,2,2,2,1],[2,2,2,2,1,1,1,2,2,4,2,2,2,2,2,2,1,1,1,1,1],[2,2,2,2,2,2,1,1,2,2,1,2,2,1,2,2,1,2,2,2,2],[2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,1,1,1,1,1],[2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,2,2,2,1],[2,2,2,2,1,2,2,2,2,2,2,4,2,4,2,1,1,2,1,2,1,2,1],[2,2,2,2,1,2,2,1,1,1,1,2,4,2,2,1,2,2,2,2,2,3,1],[2,2,2,2,1,2,2,2,2,2,2,4,2,1,2,1,2,1,1,3,1,3,1],[2,2,2,2,1,1,4,1,1,1,1,4,2,4,2,4,2,1,1,3,1,3,1],[2,2,2,2,1,2,2,2,2,2,1,2,2,2,2,1,1,1,1,3,1,1,1],[2,2,2,2,1,2,4,2,2,2,1,1,1,1,1,1,2,2,1,3,1,3,1],[1,1,1,1,1,1,4,4,4,1,1,2,2,2,2,2,2,6,1,3,1,3,1],[1,2,2,2,2,2,2,1,2,2,2,2,1,4,1,4,1,1,1,3,2,3,1],[1,2,1,1,1,1,2,1,4,4,4,4,4,2,2,2,2,1,2,3,3,3,1],[1,2,1,2,2,2,2,4,2,2,2,2,2,1,2,2,2,1,2,3,3,3,1],[1,2,1,2,2,2,1,1,2,1,1,2,2,2,2,2,1,1,1,3,3,3,1],[1,2,1,1,1,1,1,1,4,1,1,1,1,1,1,2,2,1,1,1,1,1,1],[1,2,2,2,2,2,2,2,2,1,2,2,2,2,1,2,2,1,2,2,2,2,2],[1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2,2]],[[1,1,1,1,1,1,1,1,1,2,2,2,2,2,2],[1,2,2,2,2,2,2,2,1,2,2,2,2,2,2],[1,2,2,2,2,2,2,2,1,1,1,1,2,2,2],[1,1,2,1,1,1,1,2,1,2,2,1,2,2,2],[1,1,2,1,6,1,1,2,2,2,2,1,2,2,2],[1,2,4,4,4,2,4,2,2,4,4,1,2,2,2],[1,2,2,1,2,1,1,2,4,2,2,1,2,2,2],[1,2,2,1,2,1,1,2,2,4,2,1,1,1,1],[1,1,1,1,2,2,4,4,4,2,4,1,2,2,1],[2,1,2,2,2,1,1,2,2,2,3,3,3,3,1],[2,1,2,1,2,2,2,1,2,1,3,3,2,3,1],[2,1,2,2,2,1,2,1,2,1,1,3,3,3,1],[2,1,1,1,1,1,2,4,2,2,1,3,3,3,1],[2,2,2,2,2,1,1,2,2,2,1,1,1,1,1],[2,2,2,2,2,2,1,1,1,1,1,2,2,2,2]],[[2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2],[2,1,3,3,3,2,2,2,1,2,2,2,2,1,2,2,2,1,1,1,2,2,2],[1,1,3,3,3,3,3,2,2,4,1,1,2,1,2,1,2,4,2,1,2,2,2],[1,3,3,3,3,3,3,1,2,2,4,2,2,1,2,2,4,2,2,1,2,2,2],[1,3,3,3,3,3,3,1,2,2,1,2,2,1,2,1,2,1,2,1,1,2,2],[1,1,1,1,1,1,1,1,1,2,4,2,2,4,2,1,2,1,2,2,1,1,1],[2,2,1,2,2,2,2,2,1,4,1,1,4,2,1,1,2,1,1,2,2,2,1],[2,1,1,2,2,2,4,2,2,2,2,1,2,4,2,2,4,2,2,2,1,2,1],[2,1,2,2,1,1,2,1,1,1,2,1,2,2,1,1,1,1,1,4,1,2,1],[2,1,2,4,2,4,4,2,2,2,2,2,4,2,2,2,4,2,2,2,2,2,1],[2,1,2,4,2,2,2,2,4,1,1,4,2,1,1,1,1,1,1,1,1,2,1],[2,1,1,1,1,1,1,1,2,2,6,2,1,1,2,2,2,2,2,2,1,1,1],[2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,1,1,1,1,1,1,1,2,2,2],[2,2,2,2,2,1,6,2,1,2,2,1,2,2,2],[2,2,2,2,2,1,2,4,2,2,2,1,2,2,2],[2,2,2,2,1,1,1,2,1,1,2,1,2,2,2],[2,1,1,1,1,2,4,2,2,1,2,1,1,2,2],[2,1,2,2,2,2,2,2,2,1,2,2,1,1,2],[2,1,2,4,2,4,1,1,1,1,2,4,2,1,2],[2,1,2,4,4,2,1,2,2,1,2,2,4,1,2],[2,1,4,2,2,4,2,2,2,1,4,2,2,1,2],[1,1,2,2,4,4,1,2,2,2,4,4,2,1,1],[1,2,4,4,2,2,1,2,2,1,2,2,4,2,1],[1,2,2,2,2,2,1,1,1,1,2,4,2,2,1],[1,2,2,1,4,1,1,3,3,1,1,2,2,2,1],[1,1,1,2,3,1,3,3,3,3,1,1,1,1,1],[2,2,1,2,3,3,3,3,3,3,3,1,1,2,2],[2,2,1,3,3,3,3,2,2,2,3,3,1,2,2],[2,2,1,1,1,1,1,1,1,1,1,1,1,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2],[2,2,2,2,2,2,2,1,1,1,1,1,1,2,1,1,1,2,2,2,1,1,1,1],[2,2,2,1,1,1,1,1,2,2,2,2,1,1,1,2,4,2,4,2,2,4,2,1],[1,1,1,1,2,2,1,1,2,1,4,2,4,2,2,2,2,4,2,1,2,2,2,1],[1,3,3,3,3,2,2,2,4,4,2,4,2,4,2,2,4,2,2,2,1,4,1,1],[1,3,3,2,1,2,1,1,2,1,2,2,2,1,1,1,4,1,1,2,1,2,2,1],[1,3,3,3,3,2,2,2,2,1,2,1,1,1,2,2,2,2,1,2,2,2,2,1],[1,3,3,3,3,2,2,2,2,1,2,1,1,2,2,4,2,2,1,1,1,4,2,1],[1,3,3,1,1,1,1,1,1,2,2,4,2,2,1,2,2,1,1,1,1,2,1,1],[1,1,1,1,2,2,2,2,1,2,2,2,1,1,1,2,2,2,2,6,2,2,1,2],[2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2]],[[2,1,1,1,1,1,2,2,2,2,2,2,2,2],[2,1,2,2,2,1,1,1,1,1,1,1,2,2],[2,1,2,4,2,1,1,1,2,2,2,1,2,2],[2,1,2,4,2,2,2,2,4,4,2,1,2,2],[2,1,1,2,1,1,1,1,2,2,2,1,2,2],[1,1,1,2,1,2,2,1,2,1,1,1,2,2],[1,2,2,2,1,2,2,1,6,1,1,2,2,2],[1,2,4,4,2,2,2,2,4,2,1,2,2,2],[1,2,2,2,1,2,1,2,4,2,1,1,1,1],[1,1,1,1,1,2,1,2,2,2,1,2,2,1],[2,1,2,2,2,4,1,1,1,1,2,2,2,1],[2,1,2,2,4,2,2,2,2,2,4,2,2,1],[2,1,1,2,2,2,1,1,1,1,1,2,1,1],[2,1,1,1,1,1,1,1,1,1,1,2,2,1],[1,1,3,3,3,3,1,2,4,2,2,4,2,1],[1,3,3,3,3,3,1,2,4,4,1,2,2,1],[1,3,3,2,3,3,1,2,4,2,2,4,2,1],[1,3,3,3,3,3,4,2,2,2,1,2,2,1],[1,1,2,2,1,1,1,1,1,1,1,1,1,1],[2,1,1,1,1,2,2,2,2,2,2,2,2,2]],[[2,1,1,1,1,1,1,1,2,2,2,2,2,2,2],[2,1,2,2,1,2,2,1,1,1,1,1,2,2,2],[1,1,2,2,1,2,2,1,3,3,3,1,1,1,2],[1,2,2,4,1,2,2,1,3,3,3,2,2,1,2],[1,2,4,2,1,4,4,2,3,3,3,2,2,1,2],[1,2,2,4,1,2,2,1,3,3,3,2,3,1,2],[1,2,2,2,1,2,4,1,1,1,1,1,1,1,1],[1,1,4,2,2,2,2,2,2,2,4,2,4,2,1],[1,1,2,2,1,2,2,4,4,2,1,2,2,2,1],[2,1,1,1,1,1,1,2,2,1,1,4,4,6,1],[2,2,2,2,2,2,1,2,2,2,2,2,2,1,1],[2,2,2,2,2,2,1,1,1,1,1,1,1,1,2]],[[2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,1,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2],[2,1,1,2,2,1,1,2,6,1,2,2,2,1,2,2,2,2],[2,1,2,2,4,1,2,4,2,4,2,2,2,1,1,1,1,2],[2,1,4,2,2,4,2,2,1,2,4,2,4,1,2,2,1,1],[1,1,2,2,4,1,1,2,1,4,2,4,2,2,2,2,2,1],[1,2,2,1,2,2,1,2,1,2,2,2,4,4,4,2,2,1],[1,2,4,2,2,2,2,4,2,2,4,1,1,2,1,1,1,1],[1,2,4,2,4,2,1,4,1,2,2,1,2,2,1,2,2,2],[1,1,2,2,1,1,1,2,2,1,1,1,4,2,1,2,2,2],[2,1,2,2,1,3,3,3,3,2,2,2,2,2,1,2,2,2],[2,1,1,1,1,3,3,3,3,3,3,1,1,1,1,2,2,2],[2,2,2,1,3,3,3,3,1,1,1,1,2,2,2,2,2,2],[2,2,2,1,3,3,3,1,1,2,2,2,2,2,2,2,2,2],[2,2,2,1,3,3,3,1,2,2,2,2,2,2,2,2,2,2],[2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,1,1,1,1,2,2,2],[2,2,1,1,1,1,1,2,2,1,2,2,2],[2,1,1,2,2,2,2,2,4,1,2,2,2],[1,1,2,4,2,2,1,1,2,1,1,1,2],[1,6,4,2,4,2,1,2,4,2,2,1,2],[1,1,1,1,2,1,1,2,2,2,4,1,2],[2,1,3,3,3,3,1,4,2,4,2,1,2],[2,1,3,3,3,3,1,2,2,2,4,1,2],[2,1,3,3,3,3,2,2,4,4,2,1,1],[2,1,3,3,3,2,1,2,4,2,2,2,1],[2,1,1,1,1,1,1,4,2,4,2,2,1],[2,2,2,2,2,2,1,2,2,2,1,1,1],[2,2,2,2,2,2,1,4,2,1,1,1,2],[2,2,2,2,2,2,1,2,2,1,2,2,2],[2,2,2,2,2,2,1,1,1,1,2,2,2]],[[1,1,1,1,1,1,1,1,1,1,1,1],[1,1,2,2,2,2,2,1,1,2,2,1],[1,1,2,2,2,4,2,2,2,4,2,1],[1,1,1,1,2,1,1,2,4,4,2,1],[1,2,2,2,4,2,1,2,2,2,2,1],[1,2,4,4,4,2,1,2,1,1,1,1],[1,2,2,2,1,2,1,2,4,2,1,1],[1,2,2,1,2,2,1,2,2,4,2,1],[1,2,4,1,2,4,1,2,2,2,2,1],[1,2,2,2,3,3,1,2,1,1,1,1],[1,1,1,1,3,3,2,4,2,1,6,1],[1,3,3,3,3,3,1,2,4,1,2,1],[1,1,3,3,3,3,1,2,2,4,2,1],[1,1,1,3,3,1,1,2,2,2,2,1],[1,1,1,1,1,1,1,1,1,1,1,1]],[[1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1],[1,2,2,2,1,2,2,2,2,1,6,1,1,1,1,3,3,3,3,1],[1,2,2,2,4,4,1,2,2,2,2,2,2,2,3,3,3,3,3,1],[1,2,2,2,1,2,1,1,1,2,2,2,1,1,2,3,3,3,3,1],[1,1,2,1,1,2,1,1,1,2,2,1,2,2,2,3,3,3,3,1],[2,1,2,4,2,4,2,2,2,2,2,1,2,1,1,2,1,1,1,1],[2,1,2,2,4,2,4,1,1,2,2,1,2,2,2,2,2,2,2,1],[1,1,1,1,2,1,2,2,1,1,1,1,2,1,1,2,1,1,2,1],[1,2,2,1,2,1,4,2,2,2,1,1,2,1,1,2,2,2,2,1],[1,2,4,2,2,4,2,2,1,2,1,1,2,1,1,1,1,1,1,1],[1,2,1,2,4,2,4,2,2,2,2,1,2,1,2,2,2,2,2,2],[1,2,2,4,2,1,1,2,1,1,2,1,2,1,2,2,2,2,2,2],[1,2,4,4,2,2,2,2,2,4,4,2,2,1,2,2,2,2,2,2],[1,1,2,1,1,2,1,1,1,2,4,2,2,1,2,2,2,2,2,2],[2,1,2,2,2,2,1,2,1,2,2,2,2,1,2,2,2,2,2,2],[2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,2,2,2,2]],[[2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2],[2,2,2,1,1,1,2,2,1,1,2,2,2,2,2,2,2,2],[1,1,1,1,2,2,4,2,2,1,2,2,2,2,2,2,2,2],[1,2,2,2,4,2,4,2,2,1,1,1,1,2,2,2,2,2],[1,2,4,2,2,2,1,2,4,2,2,2,1,2,1,1,1,1],[1,2,2,1,2,2,1,2,2,2,4,2,1,2,1,3,3,1],[1,1,4,1,4,2,1,1,1,1,4,1,1,1,1,3,3,1],[2,1,2,2,2,1,1,1,1,1,2,1,1,2,3,3,3,1],[2,1,4,1,2,1,1,6,1,1,2,1,1,2,2,3,3,1],[2,1,2,1,2,2,2,2,4,2,2,2,2,2,3,3,3,1],[2,1,2,2,2,1,1,1,1,2,1,1,1,2,2,3,3,1],[2,1,1,1,2,1,1,2,1,2,2,1,1,2,3,3,3,1],[2,2,1,1,4,2,1,1,1,1,4,2,1,1,1,3,3,1],[2,2,1,2,2,2,1,1,2,2,2,2,1,2,1,3,3,1],[2,1,1,2,4,4,1,1,2,2,4,2,1,2,1,1,1,1],[2,1,2,2,2,2,2,4,4,4,4,2,1,2,2,2,2,2],[2,1,2,4,2,1,1,1,2,2,2,2,1,2,2,2,2,2],[2,1,2,2,2,1,2,1,1,1,1,1,1,2,2,2,2,2],[2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2]],[[1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2],[1,3,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,2,2],[1,3,3,3,3,3,3,2,2,2,1,2,2,1,1,2,2,2,1,2,2],[1,3,3,1,1,1,2,4,2,2,2,2,4,2,2,2,2,2,1,2,2],[1,3,3,3,2,4,2,4,2,1,2,2,1,1,1,2,2,2,1,2,2],[1,3,3,3,1,4,1,1,1,1,1,2,2,2,2,1,2,2,1,2,2],[1,1,1,2,2,2,2,1,2,2,2,1,4,2,2,1,2,4,1,1,1],[2,2,1,2,2,4,4,2,4,2,4,2,2,4,1,1,2,2,4,2,1],[2,2,1,2,2,4,2,2,2,1,4,1,2,2,1,1,2,2,2,2,1],[2,2,1,1,1,2,1,1,2,1,2,2,4,2,1,1,1,1,1,1,1],[2,2,2,1,2,2,4,2,4,2,1,1,2,1,1,2,2,2,2,2,2],[2,2,2,1,2,2,2,2,4,2,2,4,2,2,1,2,2,2,2,2,2],[2,2,2,1,1,2,2,2,1,2,1,2,2,2,1,2,2,2,2,2,2],[2,2,2,2,1,1,1,1,1,6,1,1,1,1,1,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2]],[[2,1,1,1,1,1,1,1,1,1,2,2,2,2],[2,1,3,3,3,3,2,2,2,1,1,2,2,2],[2,1,3,1,3,1,2,2,4,2,1,1,2,2],[1,1,3,3,3,3,1,2,1,2,6,1,1,2],[1,2,3,3,3,3,1,2,2,1,2,2,1,1],[1,2,2,2,2,2,1,4,2,1,1,4,2,1],[1,1,2,1,1,1,2,2,4,2,2,2,2,1],[2,1,4,2,2,4,2,4,2,4,1,2,2,1],[2,1,2,1,2,2,4,2,4,2,1,1,2,1],[2,1,2,2,1,1,1,2,2,1,1,2,2,1],[2,1,2,2,2,2,1,1,2,1,1,2,1,1],[2,1,2,2,4,2,1,2,2,4,2,2,1,2],[2,1,1,1,4,2,4,2,2,2,1,1,1,2],[2,2,2,1,2,2,1,1,1,1,1,2,2,2],[2,2,2,1,1,1,1,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,3,1,1,1,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,3,3,3,3,1,2,2,2,2],[2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,1,2,2,2,2],[1,1,2,2,2,1,1,2,2,2,2,2,1,1,3,3,3,3,1,1,1,1,1],[1,2,2,4,4,1,1,2,2,4,2,6,1,1,3,3,3,3,2,2,2,2,1],[1,2,2,2,2,2,2,4,4,2,4,1,2,2,3,3,3,3,1,2,2,2,1],[1,2,2,4,2,1,1,2,4,4,2,1,2,1,3,3,3,3,1,2,2,1,1],[1,2,2,4,2,1,1,2,4,2,2,1,2,1,1,2,1,1,1,2,2,1,2],[1,1,2,1,1,1,1,1,2,1,1,1,2,2,2,2,2,2,2,2,2,1,2],[1,1,2,2,2,4,2,2,4,2,1,1,1,1,1,2,1,1,1,2,2,1,2],[1,2,4,1,1,1,2,2,1,2,1,1,1,1,1,2,1,2,1,1,1,1,2],[1,2,2,2,4,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2],[1,2,2,4,2,1,4,2,4,2,4,1,1,1,2,2,1,2,2,2,2,2,2],[1,2,4,4,4,1,2,4,2,2,2,1,2,1,1,1,1,2,2,2,2,2,2],[1,2,2,2,2,1,2,2,4,4,2,1,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,1,1,1,1,2],[1,1,1,1,1,1,1,2,6,1,2],[1,2,2,2,2,2,4,2,2,1,2],[1,2,2,2,4,1,1,2,4,1,2],[1,1,4,1,3,3,3,1,2,1,2],[2,1,2,4,3,3,3,2,2,1,2],[2,1,2,1,3,2,3,1,2,1,1],[2,1,2,2,2,1,2,1,4,2,1],[2,1,4,2,2,4,2,2,2,2,1],[2,1,2,2,1,1,1,1,1,1,1],[2,1,1,1,1,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,1,1,2,2,2],[2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,1,2,2,2],[2,2,2,2,2,2,2,2,1,1,2,2,4,4,2,2,1,2,2,2],[2,2,2,2,2,2,2,1,1,2,4,4,2,2,4,2,1,2,2,2],[2,2,2,2,2,2,2,1,2,4,2,2,2,2,4,2,1,2,2,2],[1,1,1,1,2,2,2,1,2,2,2,4,4,2,1,1,1,1,1,2],[1,2,2,1,1,1,1,1,1,1,1,2,1,1,2,2,2,2,1,2],[1,3,3,2,2,2,2,2,2,2,2,2,2,2,4,4,4,6,1,2],[1,3,1,2,1,1,1,1,1,1,1,2,1,1,2,2,2,1,1,2],[1,3,1,2,1,1,1,1,1,1,1,3,2,1,4,2,4,1,1,1],[1,3,3,3,3,3,3,3,3,3,3,3,2,1,2,2,2,4,2,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,4,2,2,1],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,1,1,1],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2]],[[2,1,1,1,1,1,1,1,1,2,2,2,2],[2,1,6,1,1,2,2,2,1,1,1,1,2],[2,1,2,4,2,2,2,4,2,2,2,1,2],[2,1,2,2,4,2,4,2,4,4,4,1,2],[2,1,2,4,4,1,2,1,2,2,2,1,2],[1,1,4,2,2,2,2,4,2,2,2,1,2],[1,2,2,4,2,2,4,4,4,4,4,1,1],[1,2,4,1,1,1,1,2,1,2,2,2,1],[1,2,2,4,3,3,3,3,1,2,2,2,1],[1,2,1,1,3,3,3,3,1,4,4,2,1],[1,2,1,1,3,3,3,3,2,2,2,1,1],[1,2,2,2,3,3,3,3,1,2,2,1,2],[1,1,2,1,3,3,3,3,1,4,4,1,2],[2,1,2,1,3,3,3,3,1,2,2,1,2],[2,1,2,2,2,2,2,2,2,2,2,1,2],[2,1,1,1,1,2,1,1,4,1,1,1,2],[2,2,2,2,1,2,2,2,2,1,2,2,2],[2,2,2,2,1,1,1,1,1,1,2,2,2]],[[2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2],[2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,1,1],[2,2,2,2,1,2,2,1,2,1,4,4,2,4,2,2,1],[2,2,2,2,1,4,2,1,4,1,2,2,1,1,2,6,1],[2,2,2,1,1,2,1,1,2,1,2,4,2,1,2,1,1],[2,2,2,1,2,2,2,4,2,1,4,2,2,1,2,1,2],[2,2,2,1,2,2,2,1,2,4,2,2,2,1,2,1,2],[2,2,2,1,1,2,4,2,4,2,2,2,1,1,2,1,2],[2,2,2,1,2,2,1,2,2,1,1,2,2,4,2,1,2],[2,2,2,1,2,2,2,2,1,1,2,4,4,1,2,1,2],[1,1,1,1,1,1,4,4,2,2,2,1,2,2,2,1,2],[1,3,3,3,3,1,2,2,1,1,1,1,1,1,1,1,2],[1,3,1,3,3,3,2,1,1,2,2,2,2,2,2,2,2],[1,3,3,3,3,2,2,2,1,2,2,2,2,2,2,2,2],[1,3,3,3,3,2,2,2,1,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,1,1,1,1,1,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,1,2,2,2,1,2,1,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2],[2,2,2,1,2,4,2,1,2,2,4,2,2,2,2,1,1,1,1,1,1,2,2,2,2],[2,2,1,1,4,2,2,1,1,1,2,1,1,2,2,2,2,2,2,2,1,2,2,2,2],[1,1,1,2,2,4,4,2,4,2,4,2,1,2,2,1,1,2,2,2,1,1,1,1,1],[1,2,2,2,2,2,2,2,4,2,2,2,1,1,1,1,1,1,2,1,1,2,2,2,1],[1,2,2,1,1,1,1,1,1,1,1,2,1,6,2,2,2,1,2,1,2,2,1,2,1],[1,1,2,1,1,1,2,2,2,2,2,2,1,1,1,1,2,1,4,1,2,1,2,2,1],[2,1,2,1,1,1,2,1,1,1,1,2,1,1,3,3,2,1,2,2,2,4,2,1,1],[2,1,2,2,4,2,2,4,2,2,1,4,1,1,3,3,2,1,4,1,1,2,2,1,1],[2,1,2,2,1,2,1,2,1,2,2,2,2,2,3,3,1,1,2,1,1,2,4,2,1],[2,1,1,1,1,2,2,2,1,2,1,1,2,1,3,3,1,2,2,2,2,4,2,2,1],[2,2,2,2,1,1,1,1,1,2,2,2,2,1,3,3,1,2,1,2,1,2,2,1,1],[2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,1,2,2,2,1,2,1,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,3,3,1,1,1,1,1,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,3,3,2,2,2,2,2,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,1,1,1,2,2,1,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2]],[[2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2],[2,2,2,2,1,1,1,1,1,2,2,1,2,2,1,1,1,1,2],[2,2,2,2,1,2,2,2,1,2,2,2,4,2,2,2,2,1,2],[2,1,1,1,1,2,1,4,4,2,1,1,2,1,1,2,2,1,2],[1,1,2,2,2,2,2,2,1,2,1,2,2,1,1,2,1,1,1],[1,2,2,1,1,1,2,4,1,4,2,2,4,2,2,4,2,2,1],[1,3,3,3,2,2,2,2,1,2,1,1,2,2,1,2,2,2,1],[1,3,3,3,1,2,2,2,2,6,2,1,2,1,1,1,2,1,1],[1,3,3,3,1,2,2,1,1,1,2,2,4,2,2,4,2,2,1],[1,1,1,1,1,1,1,1,2,1,1,2,2,2,1,2,2,2,1],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1]],[[2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,2,2,2],[2,2,2,2,1,2,2,2,1,1,2,2,1,1,1,1,2,2,1,2,2,2],[2,2,2,2,1,2,2,2,4,2,2,2,1,2,2,4,2,2,1,2,2,2],[2,2,2,2,1,2,2,1,2,1,1,2,1,2,2,2,2,2,1,1,1,1],[2,2,2,2,1,1,2,4,2,2,2,4,2,4,4,1,2,1,2,2,2,1],[2,2,2,2,1,1,1,1,2,2,1,2,2,1,2,4,2,4,2,2,2,1],[1,1,1,1,1,2,2,1,1,1,1,2,2,2,2,1,1,1,3,3,3,1],[1,2,2,2,1,4,2,1,2,2,1,2,1,1,1,1,3,3,3,3,3,1],[1,2,2,2,2,2,2,1,2,2,1,2,1,2,1,1,3,3,3,3,3,1],[1,1,1,1,1,1,2,1,2,2,1,4,2,2,2,1,1,1,3,3,3,1],[2,2,2,1,2,2,2,1,1,2,1,2,4,1,2,2,2,1,3,3,3,1],[2,2,1,1,2,2,2,2,2,2,2,4,2,2,4,1,2,1,1,1,1,1],[2,1,1,2,4,4,4,1,1,2,2,1,2,4,2,2,2,1,2,2,2,2],[2,1,2,2,2,1,2,2,1,2,1,1,1,2,2,1,1,1,2,2,2,2],[2,1,2,2,2,4,2,2,1,4,2,6,1,1,1,1,2,2,2,2,2,2],[2,1,1,1,1,1,2,2,1,2,2,2,1,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2]],[[2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,1,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,1,2,1,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2],[2,1,2,2,2,2,2,2,4,6,1,1,1,1,1,1,2,2,2],[2,1,2,4,2,1,1,4,2,1,1,1,2,2,2,1,2,2,2],[2,1,2,1,1,1,1,2,4,2,2,2,2,4,2,1,2,2,2],[2,1,2,1,1,1,1,1,2,1,2,2,1,4,2,1,1,1,1],[1,1,2,2,1,1,1,1,2,1,1,4,2,2,2,2,2,2,1],[1,2,2,4,1,2,2,4,2,2,1,2,1,1,2,1,1,2,1],[1,2,2,2,2,2,2,2,2,2,1,2,1,3,3,3,1,2,1],[1,1,1,1,1,1,2,2,1,1,1,2,2,3,3,3,2,2,1],[2,2,2,2,2,1,1,1,1,2,1,2,1,3,3,3,1,2,1],[2,2,2,2,2,2,2,2,2,2,1,2,1,1,1,2,1,2,1],[2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1]],[[2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2],[2,2,2,2,2,2,2,1,2,2,1,1,2,2,2,2],[2,2,2,2,2,2,2,1,2,2,2,1,1,2,2,2],[2,2,2,2,2,2,2,1,2,4,4,2,1,1,2,2],[2,2,2,2,2,1,1,1,4,2,2,4,2,1,1,2],[2,2,1,1,1,1,2,2,2,2,4,2,2,2,1,2],[1,1,1,2,2,1,2,1,1,1,1,1,2,2,1,2],[1,2,2,2,2,1,2,1,3,3,3,3,4,2,1,2],[1,2,1,2,2,2,4,2,3,3,3,3,1,2,1,2],[1,2,2,4,2,1,2,1,3,5,3,3,1,2,1,2],[1,1,1,2,2,1,1,1,1,2,1,1,1,2,1,2],[2,2,1,1,1,1,2,6,4,2,2,1,1,4,1,1],[2,2,2,2,2,1,1,1,2,4,2,2,2,2,2,1],[2,2,2,2,2,2,2,1,2,2,1,1,2,2,2,1],[2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1]],[[2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2],[2,2,2,2,2,1,1,3,3,2,2,2,2,1,2,2,2,1,2],[2,2,2,2,1,1,3,3,5,2,4,2,2,2,2,4,2,1,2],[2,2,2,1,1,3,3,5,3,1,2,1,2,1,4,2,1,1,2],[2,2,2,1,3,3,5,3,1,2,1,2,1,2,4,2,2,1,2],[1,1,1,1,3,3,3,1,2,2,1,2,2,2,2,1,2,1,2],[1,2,2,1,1,2,1,2,2,2,2,2,2,2,2,2,2,1,2],[1,2,6,4,2,4,2,1,1,1,2,2,1,2,1,2,1,1,2],[1,2,4,2,2,2,4,2,2,2,1,2,1,2,2,2,1,2,2],[1,1,1,4,4,2,2,2,1,2,1,2,1,2,1,2,1,2,2],[2,2,1,2,2,2,4,2,2,2,1,2,1,2,1,1,1,1,1],[2,2,1,2,4,1,2,1,1,1,1,1,2,2,2,2,2,2,1],[2,2,1,4,2,2,2,1,2,2,2,1,2,2,2,1,2,2,1],[2,2,1,2,2,1,1,1,2,2,2,1,1,2,2,2,2,2,1],[2,2,1,2,2,1,2,2,2,2,2,2,1,2,2,2,2,1,1],[2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,2]],[[2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2],[2,2,2,2,2,1,2,2,2,2,1,1,1,2,2,2,2,1,2,2,2],[2,2,2,2,2,1,2,2,2,2,2,4,2,4,2,2,1,1,1,1,2],[2,2,2,1,1,1,1,2,1,2,2,2,4,2,4,2,2,2,2,1,2],[2,2,1,1,2,4,2,2,1,4,1,1,1,1,2,4,2,4,2,1,2],[1,1,1,2,2,2,1,2,1,2,2,2,1,1,1,2,2,4,2,1,2],[1,2,4,2,2,4,2,2,1,2,2,4,2,2,1,2,1,1,1,1,2],[1,2,1,1,4,1,1,1,1,2,1,4,1,2,2,4,2,2,1,1,1],[1,2,1,1,2,2,1,1,1,2,1,2,1,2,1,2,2,4,2,2,1],[1,2,2,2,2,6,4,2,2,2,4,2,2,2,1,2,4,2,1,2,1],[1,1,1,1,1,2,2,1,2,2,1,1,2,2,1,2,4,1,2,2,1],[2,2,1,3,3,3,2,1,1,1,1,1,4,2,2,1,2,2,1,2,1],[2,2,1,3,3,3,3,3,3,3,1,2,4,4,2,1,4,2,1,2,1],[2,2,1,3,3,3,3,3,3,3,1,2,2,2,2,2,2,2,2,2,1],[2,2,1,3,3,3,3,3,3,3,1,1,1,1,1,1,1,2,2,1,1],[2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,2]],[[1,1,1,1,1,2,1,1,1,1,2,2,2,2,2,2],[1,3,3,3,1,2,1,2,2,1,1,1,1,2,2,2],[1,3,3,3,1,1,1,2,2,4,2,2,1,2,2,2],[1,3,3,3,3,1,1,2,4,2,2,4,1,1,1,2],[1,1,3,3,3,3,1,1,2,2,2,4,2,2,1,2],[1,1,1,3,3,3,2,1,1,2,4,2,4,2,1,2],[1,2,1,1,2,2,2,2,1,2,2,4,2,2,1,2],[1,2,2,1,1,2,1,2,1,1,1,2,1,1,1,1],[1,2,4,2,1,2,1,4,2,2,4,2,2,2,2,1],[1,2,2,4,2,6,2,4,2,2,2,2,4,2,2,1],[1,2,2,2,1,2,4,2,4,4,2,4,2,1,1,1],[1,2,2,1,1,1,1,1,1,2,2,1,1,1,2,2],[1,2,1,1,2,2,2,2,1,1,1,1,2,2,2,2],[1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],[1,1,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,2,2,2,2,2,2],[1,2,4,1,1,1,2,2,1,1,1,2,2,2,1,2,2,2,2,2,2],[1,3,3,1,2,2,4,1,2,1,2,2,1,2,1,2,2,2,2,2,2],[1,3,3,1,2,2,2,2,2,2,4,4,1,2,1,1,1,2,2,2,2],[1,3,5,1,2,1,2,2,1,4,2,4,2,2,2,2,1,1,1,1,1],[1,3,3,1,2,2,1,1,2,2,2,2,2,1,1,4,1,2,2,2,1],[1,3,5,4,2,2,4,2,1,2,1,1,2,2,4,2,2,2,2,2,1],[1,3,3,1,1,2,2,4,2,2,2,1,2,2,2,1,1,1,1,1,1],[1,3,5,1,1,4,1,1,2,2,2,1,1,1,1,1,2,2,2,2,2],[1,3,3,2,2,4,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2],[1,2,2,1,2,6,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,1,1,1,1,1,1,1,1,1,1],[2,2,2,1,2,2,1,1,1,2,2,2,1],[2,2,2,1,2,4,2,2,2,4,2,2,1],[2,2,2,1,2,2,1,1,1,1,4,1,1],[2,2,2,1,1,2,1,2,2,1,2,2,1],[2,2,1,1,2,2,1,3,5,2,2,2,1],[2,2,1,2,2,1,1,3,3,1,2,2,1],[2,2,1,2,6,2,1,3,5,1,2,1,1],[2,2,1,2,1,4,1,3,3,1,4,2,1],[2,2,1,2,4,2,1,3,3,1,2,2,1],[2,2,1,2,1,2,1,5,5,1,2,2,1],[2,2,1,2,4,2,1,3,3,1,4,1,1],[2,2,1,2,2,2,2,3,5,1,2,2,1],[2,1,1,1,2,2,1,2,2,1,2,2,1],[1,1,2,2,2,2,1,1,1,1,2,2,1],[1,2,2,1,1,1,1,1,1,1,4,1,1],[1,2,4,2,2,2,2,2,2,4,2,2,1],[1,2,2,1,1,2,2,2,1,2,2,2,1],[1,1,1,1,1,1,1,1,1,1,1,1,1]],[[2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2],[2,1,2,2,2,1,1,2,2,1,2,2,2,1,2,2,2,1,2,2,2,1,2],[2,1,2,4,2,2,2,2,2,4,2,2,2,4,2,2,2,4,2,2,2,1,1],[1,1,1,1,1,2,1,2,2,1,2,2,2,1,1,1,2,1,1,4,1,1,1],[1,2,2,2,1,2,1,1,4,1,1,1,1,1,1,2,2,2,1,2,2,2,1],[1,2,4,2,2,2,1,2,3,3,3,3,3,3,1,2,2,2,1,2,4,2,1],[1,1,2,1,2,2,1,2,3,3,3,3,3,3,1,1,1,1,1,2,2,2,1],[1,1,2,1,1,1,1,1,1,1,1,1,3,3,1,2,2,2,1,2,1,1,1],[1,2,2,2,2,2,2,2,2,2,2,1,3,3,1,2,4,2,2,2,1,2,2],[1,2,1,1,2,1,1,1,2,1,1,1,3,3,1,1,2,1,2,2,1,1,1],[1,2,1,2,2,2,1,2,2,2,1,1,3,3,1,1,2,1,1,1,2,2,1],[1,2,2,2,6,2,2,2,2,2,2,4,3,3,1,2,2,2,2,2,2,2,1],[1,2,1,2,2,2,1,2,2,2,1,1,2,2,1,2,2,2,1,1,2,2,1],[1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1],[1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,2,2,2,2,4,2,1],[1,2,4,2,2,1,2,4,2,4,2,4,2,2,2,1,2,1,2,2,2,2,1],[1,2,1,4,1,1,2,4,1,2,2,1,1,2,1,1,2,2,2,2,1,2,1],[1,2,2,4,2,4,4,2,1,1,1,1,2,4,2,2,4,2,1,2,1,2,1],[1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,2,2,2,2,2,2,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[[2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1],[1,2,2,2,2,4,2,1,2,2,2,2,2,2,1,1,2,1,2,2,2,1],[1,2,2,1,1,1,1,1,1,2,1,1,1,2,2,1,4,1,1,2,1,1],[1,1,4,1,2,2,2,1,1,4,1,3,3,3,3,2,2,2,1,2,1,2],[1,2,2,1,2,2,2,2,4,2,1,3,3,3,3,1,1,2,1,2,1,2],[1,2,4,2,1,2,1,2,1,2,1,3,3,3,3,1,1,2,2,2,1,2],[1,2,4,2,1,4,4,2,2,2,1,3,3,3,3,1,1,4,1,2,1,2],[1,2,1,2,4,6,4,1,1,4,1,3,3,3,3,1,1,2,2,2,1,2],[1,2,2,2,4,4,4,2,2,2,1,3,3,3,3,1,2,2,2,2,1,2],[1,2,2,4,1,2,2,2,1,2,1,1,1,1,1,1,2,4,1,1,1,2],[1,1,2,2,1,2,1,1,1,4,4,2,2,4,2,2,2,4,2,1,2,2],[1,1,2,2,2,2,2,1,2,4,2,2,4,2,1,1,2,2,2,1,2,2],[2,1,1,1,1,1,2,2,2,1,2,2,2,1,1,1,1,1,1,1,2,2],[2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2]],[[1,1,1,1,1,1,1,1,1,1,2,2,2,2],[1,2,2,2,2,2,2,2,2,1,1,1,1,2],[1,2,1,1,1,1,1,1,2,1,2,2,1,1],[1,2,1,2,4,2,4,2,4,2,2,4,2,1],[1,2,2,2,2,2,2,2,1,4,2,2,2,1],[1,1,1,4,2,2,4,4,1,2,2,1,1,1],[2,2,1,2,2,1,1,2,1,2,4,1,1,2],[2,2,1,1,4,1,2,2,2,4,2,6,1,2],[2,2,2,1,2,2,4,2,4,2,1,1,1,2],[2,2,2,1,2,1,2,2,2,4,2,2,1,2],[2,2,2,1,2,1,1,2,2,2,1,2,1,2],[2,2,1,1,2,2,1,1,1,1,1,2,1,2],[2,2,1,2,2,2,2,2,2,2,2,2,1,2],[2,2,1,3,3,3,3,3,3,3,1,1,1,2],[2,2,1,3,3,3,3,3,3,3,1,2,2,2],[2,2,1,1,1,1,1,1,1,1,1,2,2,2]],[[2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2],[2,1,1,1,1,1,1,1,1,1,2,2,1,1,2,2,2,2],[1,1,2,2,4,2,2,2,2,2,2,4,2,1,1,1,1,1],[1,2,2,2,1,1,2,1,1,2,2,2,1,1,3,3,3,1],[1,2,1,4,4,2,4,2,4,4,1,4,1,1,3,3,3,1],[1,2,1,2,2,2,2,6,2,2,1,2,2,2,3,3,3,1],[1,2,2,4,1,2,1,1,1,4,4,2,2,2,3,3,3,1],[1,2,4,2,2,4,4,2,2,4,2,1,1,3,3,3,3,1],[1,1,1,4,2,2,2,2,2,2,2,1,1,1,1,1,1,1],[2,2,1,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2],[2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,2,2,1,1,2,1,2,2,1,1,1,1,1,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,2,2,2,5,3,1,3,3,1,2,2,2,1,2,2,2],[2,1,1,1,1,1,2,1,1,1,1,2,4,1,3,1,3,3,3,2,2,2,2,1,2,2,2],[2,1,2,2,2,1,1,1,2,2,1,1,2,1,5,3,3,3,3,1,1,2,1,1,2,2,2],[2,1,2,4,2,2,2,2,2,2,1,1,2,1,3,3,1,3,3,1,1,2,1,2,2,2,2],[1,1,1,1,1,1,2,1,2,2,2,1,2,1,5,3,1,1,1,1,1,2,1,2,2,2,2],[1,2,2,2,1,2,4,1,4,1,2,1,2,1,3,3,1,1,1,1,1,2,1,2,2,2,2],[1,2,4,2,2,4,2,2,2,2,2,1,2,1,5,3,2,2,2,2,1,2,1,2,2,2,2],[1,1,2,1,1,2,2,4,2,1,1,1,2,1,2,2,1,1,2,2,1,2,1,2,2,2,2],[2,1,2,2,4,2,2,4,2,1,1,1,2,1,1,1,1,1,2,1,1,2,1,2,2,2,2],[2,1,1,1,4,1,1,1,4,1,1,1,2,2,1,1,1,1,2,1,1,2,1,2,2,2,2],[1,1,1,1,2,1,2,2,2,2,2,2,2,2,2,1,1,1,2,2,1,2,1,2,2,2,2],[1,2,2,4,2,1,2,2,4,1,1,1,1,2,2,1,1,1,4,4,1,6,1,1,1,1,1],[1,2,2,2,2,2,2,4,2,1,2,1,2,2,1,1,1,1,2,2,1,4,1,2,2,2,1],[1,1,1,1,2,1,2,2,4,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1],[2,2,2,1,2,2,4,2,2,1,2,1,1,2,2,1,1,2,2,1,1,1,1,1,1,1,1],[2,2,2,1,1,2,2,1,1,1,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2],[2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,1,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2],[2,2,2,1,1,1,1,1,1,1,2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2],[2,2,2,1,2,2,2,1,2,1,2,1,2,1,2,1,2,2,2,1,1,2,2,2,2,2,2,2,2],[2,2,2,1,2,4,2,2,2,2,2,4,2,2,1,1,2,2,4,2,1,2,2,2,2,2,2,2,2],[2,2,1,1,1,2,4,1,2,1,2,2,1,2,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1],[2,2,1,2,2,4,2,2,1,2,2,4,1,2,1,2,4,4,2,1,2,2,2,1,2,1,2,2,1],[2,1,1,2,1,2,2,2,1,2,2,2,2,2,1,1,1,2,2,2,2,4,2,1,2,1,2,2,1],[2,1,2,2,1,4,2,2,2,1,2,1,1,1,2,2,1,2,2,1,2,4,4,1,2,1,2,2,1],[2,1,2,2,2,2,4,1,1,2,4,2,2,1,2,2,2,1,1,2,4,2,2,1,2,1,2,1,1],[1,1,1,1,4,2,4,2,1,2,2,2,2,1,1,2,2,1,2,2,2,4,2,2,2,2,3,3,1],[1,2,2,1,2,2,2,2,1,1,1,2,1,2,4,2,4,2,1,1,1,2,2,1,1,1,3,5,1],[1,2,2,2,2,2,1,1,2,2,4,4,2,6,2,2,4,2,2,2,2,2,1,1,3,3,3,3,1],[1,2,2,1,1,2,2,1,1,2,2,2,4,2,2,1,4,1,2,2,1,1,3,3,3,3,5,3,1],[1,1,2,1,2,2,4,2,2,1,2,1,2,4,1,1,2,2,1,1,3,3,3,3,5,3,1,1,1],[1,1,2,1,1,2,2,4,2,2,1,2,4,2,1,2,2,1,3,3,3,3,5,3,1,1,1,2,2],[1,2,2,2,2,4,2,1,1,1,1,2,2,2,1,2,3,3,3,3,5,3,1,1,1,2,2,2,2],[1,2,2,2,1,2,2,1,2,2,1,2,2,1,2,2,3,3,5,3,1,1,1,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2]],]
-
-MAPPING = {
- 0: ' ',
- 1: '#',
- 2: '.',
- 3: 'O',
- 4: 'X',
- 5: '%',
- 6: '@',
- 7: 'A'
-}
-
-
-def blank_outside(map):
- flipped = True
-
- h = len(map)
- w = len(map[0])
-
- while flipped:
- flipped = False
-
- for y, row in enumerate(map):
- for x, tile in enumerate(row):
- if tile == 2 and (x in [0, w-1] or y in [0, h-1]):
- map[y][x] = 0
- flipped = True
- elif tile == 2 and 0 in [map[y-1][x], map[y+1][x], map[y][x-1], map[y][x+1]]:
- map[y][x] = 0
- flipped = True
-
- return map
-
-
-def main():
- for i, map in enumerate(maps):
- map = blank_outside(map)
- with open(f'{i+1:02}.sokolvl', 'w+') as f:
- f.write(';version: 1\n')
- f.write(f';name: {i+1:02}\n\n')
-
- for row in map:
- for tile in row:
- f.write(MAPPING[tile])
- f.write('\n')
-
-
-if __name__ == '__main__':
- main()
diff --git a/LoadingScreen.gd b/LoadingScreen.gd
deleted file mode 100644
index c49c44e..0000000
--- a/LoadingScreen.gd
+++ /dev/null
@@ -1,77 +0,0 @@
-extends CanvasLayer
-
-onready var animate: AnimationPlayer = $animate
-onready var progress = $Container/occluder/Progressbar
-onready var tween = $Container/Tween
-onready var fade = $fade
-var queued = false
-
-const distance = 150
-
-signal startup_complete
-
-
-func _ready():
- setup_curve(center($Container/occluder), $Container/Path)
- # sets up the curve with the return value from the centering of the occluder
-
-
-func setup_curve(center, path):
- var curve := Curve2D.new()
- curve.clear_points()
-
- var top_left = center + Vector2(-distance, -distance)
- var bottom_left = center + Vector2(-distance, distance)
- var top_right = center + Vector2(distance, -distance)
- var bottom_right = center + Vector2(distance, distance)
-
- for corner in [top_left, top_right, bottom_right, bottom_left, top_left]:
- curve.add_point(corner)
-
- path.set_curve(curve)
-
-
-func center(node):
- node.position = $Container.get_viewport_rect().size / 2
- return node.position
-
-
-func startup():
- Utils._set_disable_inputs(true)
- fade.play("Fadein")
- animate.play("Animate")
- yield(fade, "animation_finished")
- emit_signal("startup_complete")
- increment_progress()
-
-
-func exit():
- if tween.is_active():
- queued = true
- yield(tween, "tween_all_completed")
- tween_progress(progress.value, 100, Vector2(.1, .5))
- yield(tween, "tween_all_completed")
- fade.play("Fadeout")
- Utils._set_disable_inputs(false)
-
-
-func _exit_tree():
- Utils._set_disable_inputs(false)
-
-
-func tween_progress(old: float, new: float, length_range: Vector2):
- tween.interpolate_property(
- progress,
- "value",
- old,
- new,
- rand_range(length_range.x, length_range.y),
- Tween.TRANS_LINEAR,
- Tween.EASE_IN_OUT
- )
- tween.start()
-
-
-func increment_progress():
- if not tween.is_active() and not queued:
- tween_progress(progress.value, progress.value + round(rand_range(5, 25)), Vector2(1, 2))
diff --git a/LoadingScreen.tscn b/LoadingScreen.tscn
deleted file mode 100644
index b8cc772..0000000
--- a/LoadingScreen.tscn
+++ /dev/null
@@ -1,333 +0,0 @@
-[gd_scene load_steps=17 format=2]
-
-[ext_resource path="res://theme.tres" type="Theme" id=1]
-[ext_resource path="res://04B_19__.TTF" type="DynamicFontData" id=2]
-[ext_resource path="res://light2.png" type="Texture" id=3]
-[ext_resource path="res://PlayerWalk.tscn" type="PackedScene" id=4]
-[ext_resource path="res://LoadingScreen.gd" type="Script" id=6]
-[ext_resource path="res://Back.tscn" type="PackedScene" id=7]
-
-[sub_resource type="Shader" id=31]
-code = "shader_type canvas_item;
-
-uniform vec4 fore_color : hint_color = vec4(0.5, 0.75, 1.0, 1.0);
-uniform vec4 back_color : hint_color = vec4(1.0, 1.0, 1.0, 1.0);
-
-void fragment()
-{
- float aspect = (1.0 / TEXTURE_PIXEL_SIZE).y/(1.0 / TEXTURE_PIXEL_SIZE).x;
- float value;
- vec2 uv = UV.xy / (1.0 / TEXTURE_PIXEL_SIZE).x;
- uv -= vec2(0.5, 0.5*aspect);
- float rot = radians(45.0); // radians(45.0*sin(iTime));
- vec2 part1 = vec2(cos(rot), -sin(rot));
- vec2 part2 = vec2(sin(rot), cos(rot));
- mat2 m = mat2(part1, part2);
- uv = m * uv;
- uv += vec2(0.5, 0.5*aspect);
- uv.y+=0.5*(1.0-aspect);
- vec2 pos = 10.0*uv;
- vec2 rep = fract(pos);
- float dist = 2.0*min(min(rep.x, 1.0-rep.x), min(rep.y, 1.0-rep.y));
- float squareDist = length((floor(pos)+vec2(0.5)) - vec2(5.0) );
- float edge = sin(TIME-squareDist*0.5)*0.5+0.5;
- edge = (TIME-squareDist*0.5)*0.5;
- edge = 2.0*fract(edge*0.5);
- value = fract (dist*2.0);
- value = mix(value, 1.0-value, step(1.0, edge));
- edge = pow(abs(1.0-edge), 2.0);
- value = smoothstep( edge-0.05, edge, 0.95*value);
- value += squareDist*.1;
- COLOR = mix(back_color, fore_color, value);
- //COLOR.a = 0.25*clamp(value, 0.0, 1.0);
-}"
-
-[sub_resource type="ShaderMaterial" id=32]
-shader = SubResource( 31 )
-shader_param/fore_color = Color( 0.5, 0.75, 1, 1 )
-shader_param/back_color = Color( 1, 1, 1, 1 )
-
-[sub_resource type="OccluderPolygon2D" id=4]
-polygon = PoolVector2Array( -48, -48, -48, 48, 48, 48, 48, -48 )
-
-[sub_resource type="DynamicFont" id=3]
-size = 42
-font_data = ExtResource( 2 )
-
-[sub_resource type="Animation" id=29]
-resource_name = "Animate"
-length = 5.0
-loop = true
-tracks/0/type = "value"
-tracks/0/path = NodePath(".:unit_offset")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 5 ),
-"transitions": PoolRealArray( 1, 1 ),
-"update": 0,
-"values": [ 0.0, 1.0 ]
-}
-
-[sub_resource type="Animation" id=30]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/path = NodePath(".:offset")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ 0.0 ]
-}
-
-[sub_resource type="Animation" id=28]
-resource_name = "Fadein"
-step = 0.05
-tracks/0/type = "value"
-tracks/0/path = NodePath("Container:modulate")
-tracks/0/interp = 2
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 1 ),
-"transitions": PoolRealArray( -2, -2 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]
-}
-
-[sub_resource type="Animation" id=26]
-resource_name = "Fadeout"
-tracks/0/type = "method"
-tracks/0/path = NodePath(".")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 1 ),
-"transitions": PoolRealArray( 1 ),
-"values": [ {
-"args": [ ],
-"method": "queue_free"
-} ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Container:modulate")
-tracks/1/interp = 2
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0, 1 ),
-"transitions": PoolRealArray( -2, -2 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
-}
-tracks/2/type = "value"
-tracks/2/path = NodePath("Container/Path/PathFollow/Light:energy")
-tracks/2/interp = 2
-tracks/2/loop_wrap = true
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/keys = {
-"times": PoolRealArray( -0.025, 0.975 ),
-"transitions": PoolRealArray( -2, -2 ),
-"update": 0,
-"values": [ 1.0, 0.0 ]
-}
-
-[sub_resource type="Animation" id=27]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/path = NodePath("Container:modulate")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 0 ) ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Container/Path/PathFollow/Light:energy")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ 1.0 ]
-}
-
-[sub_resource type="Animation" id=1]
-resource_name = "Animate"
-length = 2.0
-loop = true
-tracks/0/type = "value"
-tracks/0/path = NodePath("Container/occluder/LoadLabel:rect_rotation")
-tracks/0/interp = 2
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 1 ),
-"transitions": PoolRealArray( -2, -2 ),
-"update": 0,
-"values": [ 24.7415, -30.2945 ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Container/occluder/LoadLabel:percent_visible")
-tracks/1/interp = 2
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0, 0.9, 1.2 ),
-"transitions": PoolRealArray( 1, -2, -2 ),
-"update": 0,
-"values": [ 0.2, 1.0, 1.0 ]
-}
-tracks/2/type = "value"
-tracks/2/path = NodePath("Container/occluder/LoadLabel:rect_scale")
-tracks/2/interp = 2
-tracks/2/loop_wrap = true
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/keys = {
-"times": PoolRealArray( 0.3, 1.3 ),
-"transitions": PoolRealArray( 1, 1 ),
-"update": 0,
-"values": [ Vector2( 1.5, 1.5 ), Vector2( 0.75, 0.75 ) ]
-}
-tracks/3/type = "value"
-tracks/3/path = NodePath("Container/occluder/LoadLabel:custom_colors/font_color")
-tracks/3/interp = 2
-tracks/3/loop_wrap = true
-tracks/3/imported = false
-tracks/3/enabled = true
-tracks/3/keys = {
-"times": PoolRealArray( 0, 0.4, 0.9, 1.4 ),
-"transitions": PoolRealArray( -2, -2, -2, -2 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 0.588235, 1 ), Color( 1, 0.588235, 1, 1 ), Color( 0.588235, 1, 1, 1 ) ]
-}
-tracks/4/type = "method"
-tracks/4/path = NodePath(".")
-tracks/4/interp = 1
-tracks/4/loop_wrap = true
-tracks/4/imported = false
-tracks/4/enabled = true
-tracks/4/keys = {
-"times": PoolRealArray( 1.4 ),
-"transitions": PoolRealArray( 1 ),
-"values": [ {
-"args": [ ],
-"method": "increment_progress"
-} ]
-}
-
-[node name="LoadScreen" type="CanvasLayer"]
-layer = 2
-script = ExtResource( 6 )
-
-[node name="Container" type="Control" parent="."]
-modulate = Color( 1, 1, 1, 0 )
-anchor_right = 1.0
-anchor_bottom = 1.0
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Back" parent="Container" instance=ExtResource( 7 )]
-material = SubResource( 32 )
-
-[node name="occluder" type="LightOccluder2D" parent="Container"]
-position = Vector2( 160, 160 )
-occluder = SubResource( 4 )
-
-[node name="Polygon2D" type="Polygon2D" parent="Container/occluder"]
-position = Vector2( -20, -20 )
-color = Color( 0, 0, 0, 1 )
-polygon = PoolVector2Array( -28, -28, 68, -28, 68, 68, -28, 68 )
-
-[node name="LoadLabel" type="Label" parent="Container/occluder"]
-anchor_left = 0.5
-anchor_top = 0.5
-anchor_right = 0.5
-anchor_bottom = 0.5
-margin_left = -81.0
-margin_top = -21.0
-margin_right = 81.0
-margin_bottom = 21.0
-rect_rotation = -28.9766
-rect_scale = Vector2( 0.789688, 0.789688 )
-rect_pivot_offset = Vector2( 83.8821, 21.1559 )
-custom_colors/font_color = Color( 0.701299, 0.886936, 1, 1 )
-custom_colors/font_color_shadow = Color( 0.188235, 0.294118, 0.411765, 1 )
-custom_fonts/font = SubResource( 3 )
-text = "Loading!"
-align = 1
-valign = 1
-percent_visible = 0.999728
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Progressbar" type="ProgressBar" parent="Container/occluder"]
-margin_left = -64.0
-margin_top = 64.0
-margin_right = 64.0
-margin_bottom = 96.0
-rect_min_size = Vector2( 40, 0 )
-theme = ExtResource( 1 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="PlayerSprite" parent="Container" instance=ExtResource( 4 )]
-position = Vector2( 0, 256 )
-
-[node name="Tween" type="Tween" parent="Container"]
-
-[node name="Path" type="Path2D" parent="Container"]
-curve = null
-
-[node name="PathFollow" type="PathFollow2D" parent="Container/Path"]
-lookahead = 2.0
-
-[node name="AnimationPlayer" type="AnimationPlayer" parent="Container/Path/PathFollow"]
-autoplay = "Animate"
-anims/Animate = SubResource( 29 )
-anims/RESET = SubResource( 30 )
-
-[node name="Light" type="Light2D" parent="Container/Path/PathFollow"]
-texture = ExtResource( 3 )
-color = Color( 0.321569, 0.745098, 0.745098, 1 )
-range_layer_min = -2
-range_layer_max = 2
-shadow_enabled = true
-shadow_gradient_length = 4.0
-shadow_filter = 3
-shadow_filter_smooth = 11.1
-__meta__ = {
-"_editor_description_": ""
-}
-
-[node name="fade" type="AnimationPlayer" parent="."]
-anims/Fadein = SubResource( 28 )
-anims/Fadeout = SubResource( 26 )
-anims/RESET = SubResource( 27 )
-
-[node name="animate" type="AnimationPlayer" parent="."]
-anims/Animate = SubResource( 1 )
diff --git a/Main.tscn b/Main.tscn
deleted file mode 100644
index 70a653e..0000000
--- a/Main.tscn
+++ /dev/null
@@ -1,3 +0,0 @@
-[gd_scene format=2]
-
-[node name="Main" type="Node2D"]
diff --git a/MainInstances.gd b/MainInstances.gd
deleted file mode 100644
index 2b56f72..0000000
--- a/MainInstances.gd
+++ /dev/null
@@ -1,5 +0,0 @@
-extends Node
-
-var console
-var world
-var stopwatch
diff --git a/MobileInputs.tscn b/MobileInputs.tscn
deleted file mode 100644
index e64387e..0000000
--- a/MobileInputs.tscn
+++ /dev/null
@@ -1,56 +0,0 @@
-[gd_scene load_steps=3 format=2]
-
-[ext_resource path="res://arrow.png" type="Texture" id=1]
-
-[sub_resource type="CircleShape2D" id=1]
-radius = 6.0
-
-[node name="MobileInputs" type="CanvasLayer"]
-
-[node name="Node2d" type="Node2D" parent="."]
-
-[node name="Floor" type="Sprite" parent="Node2d"]
-self_modulate = Color( 0, 0, 0, 1 )
-position = Vector2( 50, 227 )
-rotation = -3.14159
-scale = Vector2( 1.5, 1.5 )
-
-[node name="Left" type="TouchScreenButton" parent="Node2d/Floor"]
-position = Vector2( 9, -7 )
-rotation = -6.3573e-08
-scale = Vector2( 2, 2 )
-normal = ExtResource( 1 )
-shape = SubResource( 1 )
-passby_press = true
-action = "ui_left"
-visibility_mode = 1
-
-[node name="Right" type="TouchScreenButton" parent="Node2d/Floor"]
-position = Vector2( -9, 7 )
-rotation = 3.14159
-scale = Vector2( 2, 2 )
-normal = ExtResource( 1 )
-shape = SubResource( 1 )
-passby_press = true
-action = "ui_right"
-visibility_mode = 1
-
-[node name="Down" type="TouchScreenButton" parent="Node2d/Floor"]
-position = Vector2( -7, -9 )
-rotation = -1.5708
-scale = Vector2( 2, 2 )
-normal = ExtResource( 1 )
-shape = SubResource( 1 )
-passby_press = true
-action = "ui_right"
-visibility_mode = 1
-
-[node name="Up" type="TouchScreenButton" parent="Node2d/Floor"]
-position = Vector2( 7, 9 )
-rotation = 1.5708
-scale = Vector2( 2, 2 )
-normal = ExtResource( 1 )
-shape = SubResource( 1 )
-passby_press = true
-action = "ui_right"
-visibility_mode = 1
diff --git a/Music.gd b/Music.gd
deleted file mode 100644
index 064a2b7..0000000
--- a/Music.gd
+++ /dev/null
@@ -1,82 +0,0 @@
-extends Node
-
-export(Array, AudioStream) var music_list = []
-
-var music_index = 0
-var lowering_sound = false
-const min_vol_db = -17
-
-onready var musicPlayer = $AudioStreamPlayer
-onready var tween = $Tween
-
-
-func _ready():
- music_list.shuffle()
- list_play()
-
-
-func list_play():
- assert(music_list.size() > 0)
- musicPlayer.stream = music_list[music_index]
- musicPlayer.play()
- music_index += 1
- if music_index == music_list.size():
- music_index = 0
-
- tween.interpolate_property(
- musicPlayer,
- "volume_db",
- musicPlayer.volume_db,
- min_vol_db,
- 40,
- Tween.TRANS_LINEAR,
- Tween.EASE_IN_OUT
- )
-
-
-func lower_sound():
- lowering_sound = true
- var new_vol = musicPlayer.volume_db
- new_vol -= 10
- tween.interpolate_property(
- musicPlayer,
- "volume_db",
- musicPlayer.volume_db,
- new_vol,
- .5,
- tween.TRANS_LINEAR,
- tween.EASE_IN_OUT
- )
- tween.start()
-
-
-func continue_playback():
- lowering_sound = false
- _on_Timer_timeout()
-
-
-func list_stop():
- musicPlayer.stop()
-
-
-func _on_AudioStreamPlayer_finished():
- music_list.shuffle()
- list_play()
-
-
-func _on_Timer_timeout():
- var new_pitch = rand_range(.9, 1.1)
- tween.interpolate_property(
- musicPlayer,
- "pitch_scale",
- musicPlayer.pitch_scale,
- new_pitch,
- 1,
- tween.TRANS_LINEAR,
- tween.EASE_IN_OUT
- )
- tween.start()
-# if not lowering_sound:
-# var new_vol = rand_range(-8, -12)
-# tween.interpolate_property(musicPlayer, "volume_db", musicPlayer.volume_db, new_vol, .5, tween.TRANS_LINEAR, tween.EASE_IN_OUT)
-# tween.start()
diff --git a/Music.tscn b/Music.tscn
deleted file mode 100644
index 723e65f..0000000
--- a/Music.tscn
+++ /dev/null
@@ -1,21 +0,0 @@
-[gd_scene load_steps=3 format=2]
-
-[ext_resource path="res://Music.gd" type="Script" id=2]
-[ext_resource path="res://lite_music.wav" type="AudioStream" id=3]
-
-[node name="Music" type="Node"]
-pause_mode = 2
-script = ExtResource( 2 )
-music_list = [ ExtResource( 3 ) ]
-
-[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
-stream = ExtResource( 3 )
-
-[node name="Timer" type="Timer" parent="."]
-wait_time = 2.5
-autostart = true
-
-[node name="Tween" type="Tween" parent="."]
-
-[connection signal="finished" from="AudioStreamPlayer" to="." method="_on_AudioStreamPlayer_finished"]
-[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
diff --git a/Others.tscn b/Others.tscn
deleted file mode 100644
index 650e99c..0000000
--- a/Others.tscn
+++ /dev/null
@@ -1,363 +0,0 @@
-[gd_scene load_steps=3 format=2]
-
-[ext_resource path="res://decoration.png" type="Texture" id=1]
-
-[sub_resource type="TileSet" id=1]
-0/name = "decoration.png 0"
-0/texture = ExtResource( 1 )
-0/tex_offset = Vector2( 0, 0 )
-0/modulate = Color( 1, 1, 1, 1 )
-0/region = Rect2( 80, 16, 16, 16 )
-0/tile_mode = 0
-0/occluder_offset = Vector2( 0, 0 )
-0/navigation_offset = Vector2( 0, 0 )
-0/shape_offset = Vector2( 0, 0 )
-0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-0/shape_one_way = false
-0/shape_one_way_margin = 0.0
-0/shapes = [ ]
-0/z_index = 0
-1/name = "decoration.png 1"
-1/texture = ExtResource( 1 )
-1/tex_offset = Vector2( 0, 0 )
-1/modulate = Color( 1, 1, 1, 1 )
-1/region = Rect2( 64, 16, 16, 16 )
-1/tile_mode = 0
-1/occluder_offset = Vector2( 0, 0 )
-1/navigation_offset = Vector2( 0, 0 )
-1/shape_offset = Vector2( 0, 0 )
-1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-1/shape_one_way = false
-1/shape_one_way_margin = 0.0
-1/shapes = [ ]
-1/z_index = 0
-2/name = "decoration.png 2"
-2/texture = ExtResource( 1 )
-2/tex_offset = Vector2( 0, 0 )
-2/modulate = Color( 1, 1, 1, 1 )
-2/region = Rect2( 64, 32, 16, 16 )
-2/tile_mode = 0
-2/occluder_offset = Vector2( 0, 0 )
-2/navigation_offset = Vector2( 0, 0 )
-2/shape_offset = Vector2( 0, 0 )
-2/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-2/shape_one_way = false
-2/shape_one_way_margin = 0.0
-2/shapes = [ ]
-2/z_index = 0
-3/name = "decoration.png 3"
-3/texture = ExtResource( 1 )
-3/tex_offset = Vector2( 0, 0 )
-3/modulate = Color( 1, 1, 1, 1 )
-3/region = Rect2( 80, 32, 16, 16 )
-3/tile_mode = 0
-3/occluder_offset = Vector2( 0, 0 )
-3/navigation_offset = Vector2( 0, 0 )
-3/shape_offset = Vector2( 0, 0 )
-3/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-3/shape_one_way = false
-3/shape_one_way_margin = 0.0
-3/shapes = [ ]
-3/z_index = 0
-4/name = "decoration.png 4"
-4/texture = ExtResource( 1 )
-4/tex_offset = Vector2( 0, 0 )
-4/modulate = Color( 1, 1, 1, 1 )
-4/region = Rect2( 48, 16, 16, 16 )
-4/tile_mode = 0
-4/occluder_offset = Vector2( 0, 0 )
-4/navigation_offset = Vector2( 0, 0 )
-4/shape_offset = Vector2( 0, 0 )
-4/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-4/shape_one_way = false
-4/shape_one_way_margin = 0.0
-4/shapes = [ ]
-4/z_index = 0
-5/name = "decoration.png 5"
-5/texture = ExtResource( 1 )
-5/tex_offset = Vector2( 0, 0 )
-5/modulate = Color( 1, 1, 1, 1 )
-5/region = Rect2( 32, 16, 16, 16 )
-5/tile_mode = 0
-5/occluder_offset = Vector2( 0, 0 )
-5/navigation_offset = Vector2( 0, 0 )
-5/shape_offset = Vector2( 0, 0 )
-5/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-5/shape_one_way = false
-5/shape_one_way_margin = 0.0
-5/shapes = [ ]
-5/z_index = 0
-6/name = "decoration.png 6"
-6/texture = ExtResource( 1 )
-6/tex_offset = Vector2( 0, 0 )
-6/modulate = Color( 1, 1, 1, 1 )
-6/region = Rect2( 48, 32, 16, 16 )
-6/tile_mode = 0
-6/occluder_offset = Vector2( 0, 0 )
-6/navigation_offset = Vector2( 0, 0 )
-6/shape_offset = Vector2( 0, 0 )
-6/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-6/shape_one_way = false
-6/shape_one_way_margin = 0.0
-6/shapes = [ ]
-6/z_index = 0
-7/name = "decoration.png 7"
-7/texture = ExtResource( 1 )
-7/tex_offset = Vector2( 0, 0 )
-7/modulate = Color( 1, 1, 1, 1 )
-7/region = Rect2( 32, 32, 16, 16 )
-7/tile_mode = 0
-7/occluder_offset = Vector2( 0, 0 )
-7/navigation_offset = Vector2( 0, 0 )
-7/shape_offset = Vector2( 0, 0 )
-7/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-7/shape_one_way = false
-7/shape_one_way_margin = 0.0
-7/shapes = [ ]
-7/z_index = 0
-8/name = "decoration.png 8"
-8/texture = ExtResource( 1 )
-8/tex_offset = Vector2( 0, 0 )
-8/modulate = Color( 1, 1, 1, 1 )
-8/region = Rect2( 80, 48, 16, 32 )
-8/tile_mode = 0
-8/occluder_offset = Vector2( 0, 0 )
-8/navigation_offset = Vector2( 0, 0 )
-8/shape_offset = Vector2( 0, 0 )
-8/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-8/shape_one_way = false
-8/shape_one_way_margin = 0.0
-8/shapes = [ ]
-8/z_index = 0
-9/name = "decoration.png 9"
-9/texture = ExtResource( 1 )
-9/tex_offset = Vector2( 0, 0 )
-9/modulate = Color( 1, 1, 1, 1 )
-9/region = Rect2( 48, 48, 32, 32 )
-9/tile_mode = 0
-9/occluder_offset = Vector2( 0, 0 )
-9/navigation_offset = Vector2( 0, 0 )
-9/shape_offset = Vector2( 0, 0 )
-9/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-9/shape_one_way = false
-9/shape_one_way_margin = 0.0
-9/shapes = [ ]
-9/z_index = 0
-10/name = "decoration.png 10"
-10/texture = ExtResource( 1 )
-10/tex_offset = Vector2( 0, 0 )
-10/modulate = Color( 1, 1, 1, 1 )
-10/region = Rect2( 32, 48, 16, 32 )
-10/tile_mode = 0
-10/occluder_offset = Vector2( 0, 0 )
-10/navigation_offset = Vector2( 0, 0 )
-10/shape_offset = Vector2( 0, 0 )
-10/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-10/shape_one_way = false
-10/shape_one_way_margin = 0.0
-10/shapes = [ ]
-10/z_index = 0
-11/name = "decoration.png 11"
-11/texture = ExtResource( 1 )
-11/tex_offset = Vector2( 0, 0 )
-11/modulate = Color( 1, 1, 1, 1 )
-11/region = Rect2( 16, 48, 16, 32 )
-11/tile_mode = 0
-11/occluder_offset = Vector2( 0, 0 )
-11/navigation_offset = Vector2( 0, 0 )
-11/shape_offset = Vector2( 0, 0 )
-11/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-11/shape_one_way = false
-11/shape_one_way_margin = 0.0
-11/shapes = [ ]
-11/z_index = 0
-12/name = "decoration.png 12"
-12/texture = ExtResource( 1 )
-12/tex_offset = Vector2( 0, 0 )
-12/modulate = Color( 1, 1, 1, 1 )
-12/region = Rect2( 64, 80, 32, 32 )
-12/tile_mode = 0
-12/occluder_offset = Vector2( 0, 0 )
-12/navigation_offset = Vector2( 0, 0 )
-12/shape_offset = Vector2( 0, 0 )
-12/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-12/shape_one_way = false
-12/shape_one_way_margin = 0.0
-12/shapes = [ ]
-12/z_index = 0
-13/name = "decoration.png 13"
-13/texture = ExtResource( 1 )
-13/tex_offset = Vector2( 0, 0 )
-13/modulate = Color( 1, 1, 1, 1 )
-13/region = Rect2( 80, 112, 16, 16 )
-13/tile_mode = 0
-13/occluder_offset = Vector2( 0, 0 )
-13/navigation_offset = Vector2( 0, 0 )
-13/shape_offset = Vector2( 0, 0 )
-13/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-13/shape_one_way = false
-13/shape_one_way_margin = 0.0
-13/shapes = [ ]
-13/z_index = 0
-14/name = "decoration.png 14"
-14/texture = ExtResource( 1 )
-14/tex_offset = Vector2( 0, 0 )
-14/modulate = Color( 1, 1, 1, 1 )
-14/region = Rect2( 64, 112, 16, 16 )
-14/tile_mode = 0
-14/occluder_offset = Vector2( 0, 0 )
-14/navigation_offset = Vector2( 0, 0 )
-14/shape_offset = Vector2( 0, 0 )
-14/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-14/shape_one_way = false
-14/shape_one_way_margin = 0.0
-14/shapes = [ ]
-14/z_index = 0
-15/name = "decoration.png 15"
-15/texture = ExtResource( 1 )
-15/tex_offset = Vector2( 0, 0 )
-15/modulate = Color( 1, 1, 1, 1 )
-15/region = Rect2( 48, 80, 16, 16 )
-15/tile_mode = 0
-15/occluder_offset = Vector2( 0, 0 )
-15/navigation_offset = Vector2( 0, 0 )
-15/shape_offset = Vector2( 0, 0 )
-15/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-15/shape_one_way = false
-15/shape_one_way_margin = 0.0
-15/shapes = [ ]
-15/z_index = 0
-16/name = "decoration.png 16"
-16/texture = ExtResource( 1 )
-16/tex_offset = Vector2( 0, 0 )
-16/modulate = Color( 1, 1, 1, 1 )
-16/region = Rect2( 32, 80, 16, 16 )
-16/tile_mode = 0
-16/occluder_offset = Vector2( 0, 0 )
-16/navigation_offset = Vector2( 0, 0 )
-16/shape_offset = Vector2( 0, 0 )
-16/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-16/shape_one_way = false
-16/shape_one_way_margin = 0.0
-16/shapes = [ ]
-16/z_index = 0
-17/name = "decoration.png 17"
-17/texture = ExtResource( 1 )
-17/tex_offset = Vector2( 0, 0 )
-17/modulate = Color( 1, 1, 1, 1 )
-17/region = Rect2( 96, 16, 16, 16 )
-17/tile_mode = 0
-17/occluder_offset = Vector2( 0, 0 )
-17/navigation_offset = Vector2( 0, 0 )
-17/shape_offset = Vector2( 0, 0 )
-17/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-17/shape_one_way = false
-17/shape_one_way_margin = 0.0
-17/shapes = [ ]
-17/z_index = 0
-18/name = "decoration.png 18"
-18/texture = ExtResource( 1 )
-18/tex_offset = Vector2( 0, 0 )
-18/modulate = Color( 1, 1, 1, 1 )
-18/region = Rect2( 112, 16, 16, 16 )
-18/tile_mode = 0
-18/occluder_offset = Vector2( 0, 0 )
-18/navigation_offset = Vector2( 0, 0 )
-18/shape_offset = Vector2( 0, 0 )
-18/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-18/shape_one_way = false
-18/shape_one_way_margin = 0.0
-18/shapes = [ ]
-18/z_index = 0
-19/name = "decoration.png 19"
-19/texture = ExtResource( 1 )
-19/tex_offset = Vector2( 0, 0 )
-19/modulate = Color( 1, 1, 1, 1 )
-19/region = Rect2( 96, 32, 16, 16 )
-19/tile_mode = 0
-19/occluder_offset = Vector2( 0, 0 )
-19/navigation_offset = Vector2( 0, 0 )
-19/shape_offset = Vector2( 0, 0 )
-19/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-19/shape_one_way = false
-19/shape_one_way_margin = 0.0
-19/shapes = [ ]
-19/z_index = 0
-20/name = "decoration.png 20"
-20/texture = ExtResource( 1 )
-20/tex_offset = Vector2( 0, 0 )
-20/modulate = Color( 1, 1, 1, 1 )
-20/region = Rect2( 112, 32, 16, 16 )
-20/tile_mode = 0
-20/occluder_offset = Vector2( 0, 0 )
-20/navigation_offset = Vector2( 0, 0 )
-20/shape_offset = Vector2( 0, 0 )
-20/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-20/shape_one_way = false
-20/shape_one_way_margin = 0.0
-20/shapes = [ ]
-20/z_index = 0
-21/name = "decoration.png 21"
-21/texture = ExtResource( 1 )
-21/tex_offset = Vector2( 0, 0 )
-21/modulate = Color( 1, 1, 1, 1 )
-21/region = Rect2( 128, 32, 16, 16 )
-21/tile_mode = 0
-21/occluder_offset = Vector2( 0, 0 )
-21/navigation_offset = Vector2( 0, 0 )
-21/shape_offset = Vector2( 0, 0 )
-21/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-21/shape_one_way = false
-21/shape_one_way_margin = 0.0
-21/shapes = [ ]
-21/z_index = 0
-22/name = "decoration.png 22"
-22/texture = ExtResource( 1 )
-22/tex_offset = Vector2( 0, 0 )
-22/modulate = Color( 1, 1, 1, 1 )
-22/region = Rect2( 144, 16, 16, 16 )
-22/tile_mode = 0
-22/occluder_offset = Vector2( 0, 0 )
-22/navigation_offset = Vector2( 0, 0 )
-22/shape_offset = Vector2( 0, 0 )
-22/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-22/shape_one_way = false
-22/shape_one_way_margin = 0.0
-22/shapes = [ ]
-22/z_index = 0
-23/name = "decoration.png 23"
-23/texture = ExtResource( 1 )
-23/tex_offset = Vector2( 0, 0 )
-23/modulate = Color( 1, 1, 1, 1 )
-23/region = Rect2( 128, 16, 16, 16 )
-23/tile_mode = 0
-23/occluder_offset = Vector2( 0, 0 )
-23/navigation_offset = Vector2( 0, 0 )
-23/shape_offset = Vector2( 0, 0 )
-23/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-23/shape_one_way = false
-23/shape_one_way_margin = 0.0
-23/shapes = [ ]
-23/z_index = 0
-24/name = "decoration.png 24"
-24/texture = ExtResource( 1 )
-24/tex_offset = Vector2( 0, 0 )
-24/modulate = Color( 1, 1, 1, 1 )
-24/region = Rect2( 144, 32, 16, 16 )
-24/tile_mode = 0
-24/occluder_offset = Vector2( 0, 0 )
-24/navigation_offset = Vector2( 0, 0 )
-24/shape_offset = Vector2( 0, 0 )
-24/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-24/shape_one_way = false
-24/shape_one_way_margin = 0.0
-24/shapes = [ ]
-24/z_index = 0
-
-[node name="Others" type="TileMap"]
-tile_set = SubResource( 1 )
-cell_size = Vector2( 16, 16 )
-format = 1
-__meta__ = {
-"_editor_description_": ""
-}
diff --git a/Pause.tscn b/Pause.tscn
deleted file mode 100644
index d70540d..0000000
--- a/Pause.tscn
+++ /dev/null
@@ -1,106 +0,0 @@
-[gd_scene load_steps=7 format=2]
-
-[ext_resource path="res://PauseMenu.gd" type="Script" id=1]
-[ext_resource path="res://pause.png" type="Texture" id=2]
-[ext_resource path="res://theme.tres" type="Theme" id=3]
-[ext_resource path="res://settingshover.png" type="Texture" id=4]
-[ext_resource path="res://settings.png" type="Texture" id=5]
-[ext_resource path="res://SettingsMenu.tscn" type="PackedScene" id=6]
-
-[node name="Pause" type="CanvasLayer"]
-pause_mode = 2
-script = ExtResource( 1 )
-
-[node name="PauseMenu" type="Control" parent="."]
-anchor_right = 1.0
-anchor_bottom = 1.0
-theme = ExtResource( 3 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="ColorRect" type="ColorRect" parent="PauseMenu"]
-anchor_right = 1.0
-anchor_bottom = 1.0
-color = Color( 0, 0, 0, 0.27451 )
-
-[node name="TextureRect" type="TextureRect" parent="PauseMenu/ColorRect"]
-margin_left = 24.0
-margin_top = 24.0
-margin_right = 64.0
-margin_bottom = 64.0
-texture = ExtResource( 2 )
-expand = true
-stretch_mode = 5
-
-[node name="CenterContainer" type="CenterContainer" parent="PauseMenu/ColorRect"]
-anchor_right = 1.0
-anchor_bottom = 1.0
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="VBoxContainer" type="VBoxContainer" parent="PauseMenu/ColorRect/CenterContainer"]
-margin_left = 115.0
-margin_top = 26.0
-margin_right = 205.0
-margin_bottom = 294.0
-custom_constants/separation = 4
-
-[node name="QuitButton" type="Button" parent="PauseMenu/ColorRect/CenterContainer/VBoxContainer"]
-margin_right = 90.0
-margin_bottom = 30.0
-rect_min_size = Vector2( 90, 30 )
-size_flags_vertical = 0
-text = "exit(!)"
-
-[node name="BackButton" type="Button" parent="PauseMenu/ColorRect/CenterContainer/VBoxContainer"]
-visible = false
-margin_top = 34.0
-margin_right = 90.0
-margin_bottom = 64.0
-rect_min_size = Vector2( 90, 30 )
-size_flags_vertical = 0
-text = "back"
-
-[node name="SettingsButton" type="Button" parent="PauseMenu/ColorRect/CenterContainer/VBoxContainer"]
-margin_top = 34.0
-margin_right = 90.0
-margin_bottom = 64.0
-rect_min_size = Vector2( 90, 30 )
-size_flags_vertical = 0
-text = "settings"
-
-[node name="Gap" type="Control" parent="PauseMenu/ColorRect/CenterContainer/VBoxContainer"]
-margin_top = 68.0
-margin_right = 90.0
-margin_bottom = 268.0
-rect_min_size = Vector2( 0, 200 )
-
-[node name="Settings" type="TextureButton" parent="."]
-anchor_top = 0.5
-anchor_bottom = 0.5
-margin_left = 16.0
-margin_top = -16.0
-margin_right = 48.0
-margin_bottom = 16.0
-focus_mode = 0
-toggle_mode = true
-texture_normal = ExtResource( 5 )
-texture_pressed = ExtResource( 4 )
-texture_hover = ExtResource( 4 )
-texture_disabled = ExtResource( 4 )
-texture_focused = ExtResource( 4 )
-expand = true
-stretch_mode = 4
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="SettingsMenu" parent="." instance=ExtResource( 6 )]
-visible = false
-
-[connection signal="pressed" from="PauseMenu/ColorRect/CenterContainer/VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]
-[connection signal="pressed" from="PauseMenu/ColorRect/CenterContainer/VBoxContainer/BackButton" to="." method="_on_BackButton_pressed"]
-[connection signal="pressed" from="PauseMenu/ColorRect/CenterContainer/VBoxContainer/SettingsButton" to="." method="_on_SettingsButton_pressed"]
-[connection signal="toggled" from="Settings" to="." method="_on_Settings_toggled"]
diff --git a/PauseMenu.gd b/PauseMenu.gd
deleted file mode 100644
index dc8ba2e..0000000
--- a/PauseMenu.gd
+++ /dev/null
@@ -1,35 +0,0 @@
-extends CanvasLayer
-
-
-func _ready():
- $PauseMenu.hide()
-
-
-func pause_toggle(new_pause_state):
-# var new_pause_state = not get_tree().paused
- get_tree().paused = new_pause_state
- $PauseMenu.visible = new_pause_state
- $Settings.pressed = new_pause_state
- if new_pause_state:
- $PauseMenu/ColorRect/CenterContainer/VBoxContainer/QuitButton.grab_focus()
-
-
-func _on_QuitButton_pressed():
- get_tree().quit()
-
-
-func _on_Settings_toggled(button_pressed): # pause enablement button
- pause_toggle(button_pressed)
-
-
-# not to be confused
-func _on_SettingsButton_pressed():
- $SettingsMenu.start()
-
-
-func _on_Back_pressed():
- pause_toggle(false)
-
-
-func _on_BackButton_pressed():
- get_tree().change_scene("res://StartScreen.tscn")
diff --git a/PauseMenu.tscn b/PauseMenu.tscn
deleted file mode 100644
index c174a7a..0000000
--- a/PauseMenu.tscn
+++ /dev/null
@@ -1,87 +0,0 @@
-[gd_scene load_steps=4 format=2]
-
-[ext_resource path="res://theme.tres" type="Theme" id=1]
-[ext_resource path="res://pause.png" type="Texture" id=2]
-[ext_resource path="res://PauseMenu.gd" type="Script" id=3]
-
-[node name="PauseMenu" type="Control"]
-anchor_right = 1.0
-anchor_bottom = 1.0
-theme = ExtResource( 1 )
-script = ExtResource( 3 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="ColorRect" type="ColorRect" parent="."]
-anchor_right = 1.0
-anchor_bottom = 1.0
-color = Color( 0, 0, 0, 0.27451 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="TextureRect" type="TextureRect" parent="ColorRect"]
-margin_left = 24.0
-margin_top = 24.0
-margin_right = 64.0
-margin_bottom = 64.0
-texture = ExtResource( 2 )
-expand = true
-stretch_mode = 5
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="CenterContainer" type="CenterContainer" parent="ColorRect"]
-anchor_right = 1.0
-anchor_bottom = 1.0
-margin_top = 16.0
-margin_bottom = 202.0
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="VBoxContainer" type="VBoxContainer" parent="ColorRect/CenterContainer"]
-margin_left = 115.0
-margin_right = 205.0
-margin_bottom = 506.0
-custom_constants/separation = 4
-
-[node name="QuitButton" type="Button" parent="ColorRect/CenterContainer/VBoxContainer"]
-margin_right = 90.0
-margin_bottom = 30.0
-rect_min_size = Vector2( 90, 30 )
-size_flags_vertical = 0
-text = "exit(!)"
-
-[node name="SettingsButton" type="Button" parent="ColorRect/CenterContainer/VBoxContainer"]
-margin_top = 34.0
-margin_right = 90.0
-margin_bottom = 64.0
-rect_min_size = Vector2( 90, 30 )
-size_flags_vertical = 0
-text = "back"
-
-[node name="Gap2" type="Control" parent="ColorRect/CenterContainer/VBoxContainer"]
-margin_top = 68.0
-margin_right = 90.0
-margin_bottom = 68.0
-
-[node name="Back" type="Button" parent="ColorRect/CenterContainer/VBoxContainer"]
-margin_top = 72.0
-margin_right = 90.0
-margin_bottom = 102.0
-rect_min_size = Vector2( 90, 30 )
-size_flags_vertical = 0
-text = "back"
-
-[node name="Gap" type="Control" parent="ColorRect/CenterContainer/VBoxContainer"]
-margin_top = 106.0
-margin_right = 90.0
-margin_bottom = 506.0
-rect_min_size = Vector2( 0, 400 )
-
-[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]
-[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/SettingsButton" to="." method="_on_SettingsButton_pressed"]
-[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/Back" to="." method="_on_Back_pressed"]
diff --git a/Player.gd b/Player.gd
deleted file mode 100644
index 6514c08..0000000
--- a/Player.gd
+++ /dev/null
@@ -1,159 +0,0 @@
-extends CollisionObject2D
-
-signal level_reset_requested
-
-const GRID_SIZE = 16
-
-var moves = 0 setget set_moves
-
-var last_move = null
-var last_move_crate = null
-var world: Node2D
-var count = 0
-var started = false
-var won := false
-
-signal won
-
-onready var cam = $Camera2D
-onready var tween = $Tween
-onready var ray = $RayCast2D
-onready var dir = $Direction
-onready var anitree: AnimationTree = $AnimationTree
-onready var anistate = anitree.get("parameters/playback")
-
-
-func _ready():
- anitree.active = true
-
-
-func initialize():
- won = false
- set_physics_process(false)
- yield(get_tree().create_timer(2), "timeout")
- set_physics_process(true)
-
-
-func _physics_process(_delta):
- if Input.is_action_just_pressed("level_reload"):
- emit_signal("level_reset_requested")
- anistate.travel("Idle")
- set_moves(0)
- last_move = null
- last_move_crate = null
- return
-
- if not world:
- return
-
- if Utils.stop_input:
- return
-
- if get_parent().get_parent().just_started:
- return
-
- if world.over:
- anistate.travel("Idle")
- return
-
- if tween.is_active():
- return
-
- var move_intent = Vector2.ZERO
-
- move_intent = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
-
- if Input.is_action_just_pressed("undo_last_move"):
- if last_move != null:
- self.position -= last_move * GRID_SIZE
- if last_move_crate != null:
- last_move_crate.position -= last_move * GRID_SIZE
- set_moves(moves - 1)
- last_move = null
- last_move_crate = null
- return
-
- if move_intent.x != 0 && move_intent.y != 0:
- move_intent = Vector2.ZERO
-
- if move_intent != Vector2.ZERO:
- if not started:
- get_parent().get_parent().start_stopwatch()
- started = true
- var offset = move_intent * GRID_SIZE
-
- apply_rotation(offset)
-
- if ray.is_colliding():
- var collider = ray.get_collider()
- if collider.is_in_group("crates"):
- if !collider.push(offset):
- anistate.travel("Idle")
- return
-
- last_move_crate = collider
-
- else:
- anistate.travel("Idle")
- return
-
- else:
- last_move_crate = null
-
- set_moves(moves + 1)
- last_move = move_intent
-
- tween.interpolate_property(
- self,
- "position",
- self.position,
- self.position + offset,
- 0.35,
- Tween.TRANS_LINEAR,
- Tween.EASE_IN_OUT
- )
- tween.start()
-
- SoundFx.play("walk", -10, rand_range(.9, 1.1))
- anistate.travel("Run")
- anitree.set("parameters/Run/blend_position", move_intent)
- else:
- anistate.travel("Idle")
-
-
-func set_moves(new_moves: int):
- moves = new_moves
- $"../../CanvasLayer/HUD/MovesLabel".text = "Moves: " + str(moves)
-
-
-func apply_rotation(offset: Vector2):
- ray.cast_to = offset
-
- var new_rot := offset.angle()
-
- ray.force_raycast_update()
-
- var future_rot := lerp_angle(dir.rotation, new_rot, 1)
-
- if future_rot != dir.rotation:
- tween.interpolate_property(
- dir, "rotation", dir.rotation, future_rot, 0.3, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
- )
- tween.start()
-
-
-func _over():
- if won:
- return
- emit_signal("won")
- won = true
-
-
-func _on_Player_body_exited(_body):
- pass
- # if not body.name == "Player" and not body.is_in_group("crates"):
- # print("emitting won")
- # if won:
- # return
- # emit_signal("won")
- # won = true
diff --git a/Player.tscn b/Player.tscn
deleted file mode 100644
index 8d978df..0000000
--- a/Player.tscn
+++ /dev/null
@@ -1,312 +0,0 @@
-[gd_scene load_steps=28 format=2]
-
-[ext_resource path="res://Player.gd" type="Script" id=1]
-[ext_resource path="res://cuberot.png" type="Texture" id=2]
-[ext_resource path="res://arrow.png" type="Texture" id=3]
-[ext_resource path="res://spot.png" type="Texture" id=4]
-
-[sub_resource type="Curve" id=1]
-_data = [ Vector2( 0.0184332, 0.967672 ), 0.0, 0.0, 0, 0, Vector2( 0.184332, 0.795259 ), 0.0, 0.0, 0, 0, Vector2( 0.308756, 0.890086 ), 0.0, 0.0, 0, 0, Vector2( 0.474654, 0.769397 ), 0.0, 0.0, 0, 0, Vector2( 0.585253, 0.950431 ), 0.0, 0.0, 0, 0, Vector2( 0.714286, 0.924569 ), 0.0, 0.0, 0, 0, Vector2( 0.83871, 0.786638 ), 0.0, 0.0, 0, 0, Vector2( 1, 0 ), 0.0, 0.0, 0, 0 ]
-
-[sub_resource type="Gradient" id=2]
-offsets = PoolRealArray( 0, 0.944751, 1 )
-colors = PoolColorArray( 1, 1, 1, 1, 1, 1, 1, 0.952128, 1, 1, 1, 0 )
-
-[sub_resource type="RectangleShape2D" id=3]
-extents = Vector2( 7.5, 7.5 )
-
-[sub_resource type="Animation" id=19]
-resource_name = "Idle"
-length = 0.1
-loop = true
-tracks/0/type = "value"
-tracks/0/path = NodePath("Sprite:frame")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 1,
-"values": [ 0 ]
-}
-
-[sub_resource type="Animation" id=8]
-resource_name = "MoveDown"
-length = 0.35
-loop = true
-step = 0.05
-tracks/0/type = "value"
-tracks/0/path = NodePath("Sprite:frame")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3 ),
-"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
-"update": 1,
-"values": [ 0, 1, 2, 3, 4, 5, 6 ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Sprite:rotation_degrees")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 1,
-"values": [ 0.0 ]
-}
-
-[sub_resource type="Animation" id=6]
-resource_name = "MoveLeft"
-length = 0.35
-loop = true
-tracks/0/type = "value"
-tracks/0/path = NodePath("Sprite:rotation_degrees")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 1,
-"values": [ 90.0 ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Sprite:frame")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3 ),
-"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
-"update": 1,
-"values": [ 0, 1, 2, 3, 4, 5, 6 ]
-}
-
-[sub_resource type="Animation" id=20]
-resource_name = "MoveRight"
-length = 0.35
-loop = true
-tracks/0/type = "value"
-tracks/0/path = NodePath("Sprite:rotation_degrees")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 1,
-"values": [ -90.0 ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Sprite:frame")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3 ),
-"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
-"update": 1,
-"values": [ 0, 1, 2, 3, 4, 5, 6 ]
-}
-
-[sub_resource type="Animation" id=7]
-resource_name = "MoveUp"
-length = 0.35
-loop = true
-step = 0.01
-tracks/0/type = "value"
-tracks/0/path = NodePath("Sprite:rotation_degrees")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 1,
-"values": [ 180.0 ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Sprite:frame")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3 ),
-"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
-"update": 1,
-"values": [ 0, 1, 2, 3, 4, 5, 6 ]
-}
-
-[sub_resource type="Animation" id=21]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/path = NodePath("Sprite:frame")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ 0 ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Sprite:rotation_degrees")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ -90.0 ]
-}
-
-[sub_resource type="AnimationNodeAnimation" id=24]
-animation = "Idle"
-
-[sub_resource type="AnimationNodeAnimation" id=25]
-animation = "Idle"
-
-[sub_resource type="AnimationNodeAnimation" id=22]
-animation = "Idle"
-
-[sub_resource type="AnimationNodeAnimation" id=23]
-animation = "Idle"
-
-[sub_resource type="AnimationNodeBlendSpace2D" id=9]
-blend_point_0/node = SubResource( 24 )
-blend_point_0/pos = Vector2( -0.1, 0 )
-blend_point_1/node = SubResource( 25 )
-blend_point_1/pos = Vector2( 0, 0.6 )
-blend_point_2/node = SubResource( 22 )
-blend_point_2/pos = Vector2( 0.1, 0 )
-blend_point_3/node = SubResource( 23 )
-blend_point_3/pos = Vector2( 0, -0.6 )
-
-[sub_resource type="AnimationNodeAnimation" id=15]
-animation = "MoveDown"
-
-[sub_resource type="AnimationNodeAnimation" id=16]
-animation = "MoveRight"
-
-[sub_resource type="AnimationNodeAnimation" id=17]
-animation = "MoveUp"
-
-[sub_resource type="AnimationNodeAnimation" id=18]
-animation = "MoveLeft"
-
-[sub_resource type="AnimationNodeBlendSpace2D" id=10]
-blend_point_0/node = SubResource( 15 )
-blend_point_0/pos = Vector2( 0, 1 )
-blend_point_1/node = SubResource( 16 )
-blend_point_1/pos = Vector2( 1, 0 )
-blend_point_2/node = SubResource( 17 )
-blend_point_2/pos = Vector2( 0, -1 )
-blend_point_3/node = SubResource( 18 )
-blend_point_3/pos = Vector2( -1, 0 )
-blend_mode = 1
-
-[sub_resource type="AnimationNodeStateMachineTransition" id=11]
-
-[sub_resource type="AnimationNodeStateMachineTransition" id=12]
-
-[sub_resource type="AnimationNodeStateMachine" id=13]
-states/Idle/node = SubResource( 9 )
-states/Idle/position = Vector2( 517, 64 )
-states/Run/node = SubResource( 10 )
-states/Run/position = Vector2( 663, 64 )
-transitions = [ "Idle", "Run", SubResource( 11 ), "Run", "Idle", SubResource( 12 ) ]
-start_node = "Idle"
-
-[sub_resource type="AnimationNodeStateMachinePlayback" id=14]
-
-[node name="Player" type="Area2D"]
-collision_layer = 0
-collision_mask = 2
-script = ExtResource( 1 )
-
-[node name="Light2D" type="Light2D" parent="."]
-position = Vector2( 8, 8 )
-texture = ExtResource( 4 )
-color = Color( 0.14902, 0.360784, 1, 1 )
-shadow_enabled = true
-shadow_gradient_length = 1.0
-shadow_filter = 3
-shadow_filter_smooth = 4.0
-
-[node name="CPUParticles2D" type="CPUParticles2D" parent="."]
-show_behind_parent = true
-position = Vector2( 8, 8 )
-amount = 4
-local_coords = false
-gravity = Vector2( 0, 0 )
-scale_amount = 5.0
-scale_amount_random = 1.0
-scale_amount_curve = SubResource( 1 )
-color_ramp = SubResource( 2 )
-
-[node name="Direction" type="Sprite" parent="."]
-position = Vector2( 8, 8 )
-z_index = 1
-texture = ExtResource( 3 )
-offset = Vector2( 9.95932, -0.107321 )
-
-[node name="Tween" type="Tween" parent="."]
-
-[node name="RayCast2D" type="RayCast2D" parent="."]
-visible = false
-position = Vector2( 8, 8 )
-cast_to = Vector2( 50, 0 )
-
-[node name="Sprite" type="Sprite" parent="."]
-position = Vector2( 8, 8 )
-rotation = -1.5708
-texture = ExtResource( 2 )
-centered = false
-offset = Vector2( -8, -8 )
-hframes = 7
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
-visible = false
-position = Vector2( 8, 8 )
-shape = SubResource( 3 )
-
-[node name="Camera2D" type="Camera2D" parent="."]
-position = Vector2( 8, 8 )
-current = true
-zoom = Vector2( 0.5, 0.5 )
-smoothing_enabled = true
-smoothing_speed = 4.0
-
-[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
-anims/Idle = SubResource( 19 )
-anims/MoveDown = SubResource( 8 )
-anims/MoveLeft = SubResource( 6 )
-anims/MoveRight = SubResource( 20 )
-anims/MoveUp = SubResource( 7 )
-anims/RESET = SubResource( 21 )
-
-[node name="AnimationTree" type="AnimationTree" parent="."]
-tree_root = SubResource( 13 )
-anim_player = NodePath("../AnimationPlayer")
-parameters/playback = SubResource( 14 )
-parameters/Idle/blend_position = Vector2( 0, 0 )
-parameters/Run/blend_position = Vector2( 0, 0 )
-
-[connection signal="body_exited" from="." to="." method="_on_Player_body_exited"]
diff --git a/PlayerSprite.gd b/PlayerSprite.gd
deleted file mode 100644
index 91d9c5a..0000000
--- a/PlayerSprite.gd
+++ /dev/null
@@ -1,35 +0,0 @@
-extends Sprite
-
-onready var tween = $Tween
-
-onready var initial_pos = position
-
-var start_new = true
-
-
-func _physics_process(_delta):
- if tween.is_active():
- return
-
- if not start_new:
- return
-
- tween.interpolate_property(
- self,
- "position",
- position,
- position + Vector2.RIGHT * 32,
- .7,
- tween.TRANS_LINEAR,
- tween.EASE_IN_OUT
- )
- tween.start()
-
-
-func _on_VisibilityNotifier2D_screen_exited():
- start_new = false
- if tween.is_active():
- yield(tween, "tween_all_completed")
- tween.stop_all()
- position = initial_pos
- start_new = true
diff --git a/PlayerWalk.tscn b/PlayerWalk.tscn
deleted file mode 100644
index 735acf9..0000000
--- a/PlayerWalk.tscn
+++ /dev/null
@@ -1,59 +0,0 @@
-[gd_scene load_steps=5 format=2]
-
-[ext_resource path="res://cuberot.png" type="Texture" id=1]
-[ext_resource path="res://PlayerSprite.gd" type="Script" id=2]
-
-[sub_resource type="Animation" id=1]
-resource_name = "Animate"
-length = 0.7
-loop = true
-tracks/0/type = "value"
-tracks/0/path = NodePath(".:frame")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6 ),
-"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
-"update": 1,
-"values": [ 0, 1, 2, 3, 4, 5, 6 ]
-}
-
-[sub_resource type="Animation" id=2]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/path = NodePath(".:frame")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ 0 ]
-}
-
-[node name="PlayerSprite" type="Sprite"]
-light_mask = 0
-position = Vector2( 0, 272 )
-rotation = -1.5708
-scale = Vector2( 2, 2 )
-texture = ExtResource( 1 )
-offset = Vector2( -8, -8 )
-hframes = 7
-script = ExtResource( 2 )
-
-[node name="VisibilityNotifier2D" type="VisibilityNotifier2D" parent="."]
-position = Vector2( -16, -16 )
-rect = Rect2( 0, 0, 16, 16 )
-
-[node name="Tween" type="Tween" parent="."]
-
-[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
-autoplay = "Animate"
-anims/Animate = SubResource( 1 )
-anims/RESET = SubResource( 2 )
-
-[connection signal="screen_exited" from="VisibilityNotifier2D" to="." method="_on_VisibilityNotifier2D_screen_exited"]
diff --git a/README.md b/README.md
deleted file mode 100644
index d19338e..0000000
--- a/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# sokoban
-
-sokoban
diff --git a/Save_Load.gd b/Save_Load.gd
deleted file mode 100644
index 698d668..0000000
--- a/Save_Load.gd
+++ /dev/null
@@ -1,41 +0,0 @@
-extends Node
-
-const settings_file = "user://settings.res"
-const level_file = "user://level_data.res"
-
-var files := { # file types
- "settings":
- {
- "file": settings_file,
- "data":
- {"stopwatch": false, "fullscreen": true, "resolution": Vector2(1280, 720), "vsync": false}
- },
- "level": {"file": level_file, "data": {"highest_level": "0", "current_level": "1"}}
-}
-
-
-func _ready():
- load_data("settings")
- load_data("level")
-
-
-func save(type):
- var file = File.new()
- file.open(files[type].file, File.WRITE)
- file.store_string(var2str(files[type].data))
-
-
-func load_data(type: String):
- var file = File.new()
- if check_file(type):
- file.open(files[type].file, File.READ)
- if file.get_as_text().length() > 0:
- var read_dictionary: Dictionary = str2var(file.get_as_text())
- if files[type].data.size() == read_dictionary.size():
- files[type].data = read_dictionary
- file.close()
-
-
-func check_file(type):
- var file = File.new()
- return file.file_exists(files[type].file)
diff --git a/Settings.gd b/Settings.gd
deleted file mode 100644
index d9119ef..0000000
--- a/Settings.gd
+++ /dev/null
@@ -1,122 +0,0 @@
-extends Control
-
-var _settings := {
- resolution = Vector2(1280, 720), fullscreen = true, vsync = true, stopwatch = false
-}
-var starting = true
-
-export(NodePath) onready var vsyncbutton = get_node(vsyncbutton)
-export(NodePath) onready var fullscreenbutton = get_node(fullscreenbutton)
-export(NodePath) onready var resolution_input = get_node(resolution_input)
-export(NodePath) onready var stopwatchbox = get_node(stopwatchbox)
-
-
-func _ready():
- var data = SaveLoad.files.settings.data
- _settings.stopwatch = data.stopwatch
- _settings.resolution = data.resolution
- _settings.vsync = data.vsync
- _settings.fullscreen = data.fullscreen
- update_settings(false)
-
-
-func start():
- starting = false
- yield(get_tree().create_timer(.3), "timeout")
- $ColorRect/ExitButton.grab_focus()
- show()
-
-
-func update_settings_visual():
- fullscreenbutton.pressed = _settings.fullscreen
- vsyncbutton.pressed = _settings.vsync
- var resolution_text_placeholder = (
- str(_settings.resolution.x)
- + "x"
- + str(_settings.resolution.y)
- )
- resolution_input.placeholder_text = resolution_text_placeholder
- stopwatchbox.pressed = _settings.stopwatch
-
-
-func _on_VscynButton_toggled(button_pressed):
- if starting:
- return
- _settings.vsync = button_pressed
- update_settings()
-
-
-func _on_FullscreenButton_toggled(button_pressed):
- if starting:
- return
- _settings.fullscreen = button_pressed
- update_settings()
-
-
-func update_settings(open := true) -> void:
- if not open:
- _settings.vsync = OS.vsync_enabled
- _settings.fullscreen = OS.window_fullscreen
- _settings.resolution = OS.window_size
- var data = SaveLoad.files.settings.data
- _settings = data
- apply_settings()
- update_settings_visual()
- if open:
- MainInstances.console.Log("Settings applied.", .1, 1)
- $ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder.visible = !_settings.fullscreen
- SaveLoad.save("settings")
-
-
-func apply_settings():
- resolution_input.placeholder_text = (
- str(_settings.resolution.x)
- + "x"
- + str(_settings.resolution.y)
- )
- OS.window_fullscreen = _settings.fullscreen
- if _settings.fullscreen:
- _settings.resolution = OS.get_screen_size()
- OS.set_window_size(_settings.resolution)
- OS.vsync_enabled = _settings.vsync
- globalsettings.stopwatch = _settings.stopwatch
-
-
-func _on_ResolutionInput_text_entered(new_text: String):
- if starting:
- return
- var text = new_text.split("x")
- if text.size() < 2:
- MainInstances.console.Log("Please split text with a x (1270x720)", 2.5, 5)
- return
- var text_processed = []
- for number in text:
- number = int(number)
- number = round(number)
- number = clamp(number, 400, 4000)
- text_processed.append(number)
- var new_res = Vector2(text_processed[0], text_processed[1])
- _settings.resolution = new_res
- update_settings()
-
-
-func _on_ResolutionButton_pressed():
- if starting:
- return
- resolution_input.visible = !resolution_input.visible
-
-
-func _on_ExitButton_pressed():
- hide()
- update_settings(false)
- if get_parent().has_method("pause_toggle"):
- get_parent().pause_toggle(true)
- else:
- push_warning("Parent of %s not pausemenu" % self)
-
-
-func _on_StopwatchBox_toggled(button_pressed):
- if starting:
- return
- _settings.stopwatch = button_pressed
- update_settings()
diff --git a/SettingsMenu.tscn b/SettingsMenu.tscn
deleted file mode 100644
index f736318..0000000
--- a/SettingsMenu.tscn
+++ /dev/null
@@ -1,114 +0,0 @@
-[gd_scene load_steps=3 format=2]
-
-[ext_resource path="res://theme.tres" type="Theme" id=1]
-[ext_resource path="res://Settings.gd" type="Script" id=2]
-
-[node name="SettingsMenu" type="Control"]
-anchor_right = 1.0
-anchor_bottom = 1.0
-theme = ExtResource( 1 )
-script = ExtResource( 2 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-vsyncbutton = NodePath("ColorRect/VBoxContainer/HBoxContainer/VscynButton")
-fullscreenbutton = NodePath("ColorRect/VBoxContainer/HBoxContainer/FullscreenButton")
-resolution_input = NodePath("ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder/ResolutionInput")
-stopwatchbox = NodePath("ColorRect/VBoxContainer/HBoxContainer2/StopwatchBox")
-
-[node name="ColorRect" type="ColorRect" parent="."]
-anchor_right = 1.0
-anchor_bottom = 1.0
-color = Color( 0, 0, 0, 0.615686 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="ExitButton" type="Button" parent="ColorRect"]
-anchor_left = 0.5
-anchor_top = 1.0
-anchor_right = 0.5
-anchor_bottom = 1.0
-margin_left = -32.0
-margin_top = -32.0
-margin_right = 32.0
-margin_bottom = -8.0
-rect_min_size = Vector2( 64, 0 )
-text = "back"
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="VBoxContainer" type="VBoxContainer" parent="ColorRect"]
-margin_left = 8.0
-margin_top = 8.0
-margin_right = 312.0
-margin_bottom = 112.0
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="HBoxContainer" type="HBoxContainer" parent="ColorRect/VBoxContainer"]
-margin_right = 304.0
-margin_bottom = 30.0
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="VscynButton" type="CheckBox" parent="ColorRect/VBoxContainer/HBoxContainer"]
-margin_right = 86.0
-margin_bottom = 30.0
-rect_min_size = Vector2( 86, 30 )
-text = "vsyc"
-align = 1
-
-[node name="FullscreenButton" type="CheckBox" parent="ColorRect/VBoxContainer/HBoxContainer"]
-margin_left = 90.0
-margin_right = 225.0
-margin_bottom = 30.0
-rect_min_size = Vector2( 135, 30 )
-pressed = true
-text = "fullscreen"
-align = 1
-
-[node name="HBoxContainer2" type="HBoxContainer" parent="ColorRect/VBoxContainer"]
-margin_top = 34.0
-margin_right = 304.0
-margin_bottom = 64.0
-
-[node name="ResolutionHolder" type="VBoxContainer" parent="ColorRect/VBoxContainer/HBoxContainer2"]
-visible = false
-margin_right = 104.0
-margin_bottom = 30.0
-
-[node name="ResolutionButton" type="Button" parent="ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder"]
-margin_right = 104.0
-margin_bottom = 30.0
-rect_min_size = Vector2( 104, 30 )
-text = "resolution"
-
-[node name="ResolutionInput" type="LineEdit" parent="ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder"]
-visible = false
-margin_top = 34.0
-margin_right = 104.0
-margin_bottom = 55.0
-align = 1
-expand_to_text_length = true
-placeholder_text = "1280x720"
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="StopwatchBox" type="CheckBox" parent="ColorRect/VBoxContainer/HBoxContainer2"]
-margin_right = 215.0
-margin_bottom = 30.0
-rect_min_size = Vector2( 215, 30 )
-text = "speedrunner mode"
-align = 1
-
-[connection signal="pressed" from="ColorRect/ExitButton" to="." method="_on_ExitButton_pressed"]
-[connection signal="toggled" from="ColorRect/VBoxContainer/HBoxContainer/VscynButton" to="." method="_on_VscynButton_toggled"]
-[connection signal="toggled" from="ColorRect/VBoxContainer/HBoxContainer/FullscreenButton" to="." method="_on_FullscreenButton_toggled"]
-[connection signal="pressed" from="ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder/ResolutionButton" to="." method="_on_ResolutionButton_pressed"]
-[connection signal="text_entered" from="ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder/ResolutionInput" to="." method="_on_ResolutionInput_text_entered"]
-[connection signal="toggled" from="ColorRect/VBoxContainer/HBoxContainer2/StopwatchBox" to="." method="_on_StopwatchBox_toggled"]
diff --git a/SoundFX.gd b/SoundFX.gd
deleted file mode 100644
index cb8100f..0000000
--- a/SoundFX.gd
+++ /dev/null
@@ -1,30 +0,0 @@
-extends Node
-
-var res = "res://"
-
-var sounds = {
- "victory": load(res + "victory.wav"),
- "motion_box": load(res + "motion_box.wav"),
- "defeat": load(res + "gameover.wav"),
- "walk": load(res + "walk.wav")
-}
-
-onready var sound_players = get_children()
-
-
-func play(sound_string, volume_db = 0, pitch_scale = randf() + 0.4):
- if sound_string == "target":
- if not $WINTONEPLAYER.playing:
- $WINTONEPLAYER.stream = sounds[sound_string]
- $WINTONEPLAYER.play()
- yield($WINTONEPLAYER, "finished")
- return
- return
- for soundPlayer in sound_players:
- if not soundPlayer.playing:
- soundPlayer.pitch_scale = pitch_scale
- soundPlayer.volume_db = volume_db
- soundPlayer.stream = sounds[sound_string]
- soundPlayer.play()
- return
- print_debug("TOO MANY SOUNDS")
diff --git a/SoundFX.tscn b/SoundFX.tscn
deleted file mode 100644
index 32cc012..0000000
--- a/SoundFX.tscn
+++ /dev/null
@@ -1,17 +0,0 @@
-[gd_scene load_steps=2 format=2]
-
-[ext_resource path="res://SoundFX.gd" type="Script" id=1]
-
-[node name="SoundFX" type="Node"]
-pause_mode = 2
-script = ExtResource( 1 )
-
-[node name="AudioStreamPlayer1" type="AudioStreamPlayer" parent="."]
-
-[node name="AudioStreamPlayer2" type="AudioStreamPlayer" parent="."]
-
-[node name="AudioStreamPlayer3" type="AudioStreamPlayer" parent="."]
-
-[node name="AudioStreamPlayer4" type="AudioStreamPlayer" parent="."]
-
-[node name="WINTONEPLAYER" type="AudioStreamPlayer2D" parent="."]
diff --git a/StartScreen.gd b/StartScreen.gd
deleted file mode 100644
index 832d2f2..0000000
--- a/StartScreen.gd
+++ /dev/null
@@ -1,50 +0,0 @@
-extends CanvasLayer
-
-const world = preload("res://World.tscn")
-
-var level_to_load = 1
-
-
-func _ready():
- $Control/Hi.text = "Highscore: " + SaveLoad.files.level.data.highest_level
- $Control/CenterContainer/VBoxContainer/StartButton.grab_focus()
-
-
-func _on_StartButton_pressed():
- Utils.starting = true
- Utils.change_scene_to(world)
-
-
-func _on_LoadButton_pressed():
- var spinbox: SpinBox = $Control/CenterContainer/VBoxContainer/HBoxContainer/Spinbox
- spinbox.show()
- var spinline: LineEdit = spinbox.get_line_edit()
- spinline.connect("text_entered", self, "_on_spinbox_entered")
-
-
-func _on_QuitButton_pressed():
- get_tree().quit()
-
-
-func hide():
- $Control.hide()
-
-
-func _on_spinbox_entered(text):
- level_to_load = int(text)
- level_to_load = clamp(level_to_load, 1, 60)
- Utils.loading = true
- Utils.loading_int = level_to_load
- Utils.change_scene_to(world)
-
-
-func _on_ContinueButton_pressed():
- Utils.loading_int = int(SaveLoad.files.level.data.current_level)
- Utils.loading = true
- Utils.change_scene_to(world)
-
-
-func _on_LoadScreenButton_pressed():
- Utils.load_loading_screen()
- yield(get_tree().create_timer(30), "timeout")
- Utils.unload_loading_screen()
diff --git a/StartScreen.tscn b/StartScreen.tscn
deleted file mode 100644
index 2591d7c..0000000
--- a/StartScreen.tscn
+++ /dev/null
@@ -1,141 +0,0 @@
-[gd_scene load_steps=4 format=2]
-
-[ext_resource path="res://theme.tres" type="Theme" id=1]
-[ext_resource path="res://smallfont.tres" type="DynamicFont" id=2]
-[ext_resource path="res://StartScreen.gd" type="Script" id=4]
-
-[node name="StartScreen" type="CanvasLayer"]
-script = ExtResource( 4 )
-
-[node name="Control" type="Control" parent="."]
-anchor_right = 1.0
-anchor_bottom = 1.0
-theme = ExtResource( 1 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="CenterContainer" type="CenterContainer" parent="Control"]
-anchor_right = 1.0
-anchor_bottom = 1.0
-
-[node name="VBoxContainer" type="VBoxContainer" parent="Control/CenterContainer"]
-margin_left = 118.0
-margin_top = 59.0
-margin_right = 201.0
-margin_bottom = 261.0
-custom_constants/separation = 4
-
-[node name="StartButton" type="Button" parent="Control/CenterContainer/VBoxContainer"]
-margin_left = 5.0
-margin_right = 77.0
-margin_bottom = 32.0
-rect_min_size = Vector2( 72, 32 )
-size_flags_horizontal = 6
-size_flags_vertical = 0
-theme = ExtResource( 1 )
-text = "start"
-
-[node name="HBoxContainer" type="HBoxContainer" parent="Control/CenterContainer/VBoxContainer"]
-margin_top = 36.0
-margin_right = 83.0
-margin_bottom = 68.0
-rect_min_size = Vector2( 0, 21 )
-
-[node name="LoadButton" type="Button" parent="Control/CenterContainer/VBoxContainer/HBoxContainer"]
-margin_left = 5.0
-margin_right = 77.0
-margin_bottom = 32.0
-grow_horizontal = 2
-grow_vertical = 2
-rect_min_size = Vector2( 72, 32 )
-size_flags_horizontal = 6
-size_flags_vertical = 0
-text = "load"
-
-[node name="Spinbox" type="SpinBox" parent="Control/CenterContainer/VBoxContainer/HBoxContainer"]
-visible = false
-margin_left = 76.0
-margin_right = 165.0
-margin_bottom = 32.0
-rect_min_size = Vector2( 0, 32 )
-rect_pivot_offset = Vector2( 43, 3 )
-size_flags_horizontal = 0
-size_flags_vertical = 0
-min_value = 1.0
-max_value = 60.0
-page = 1.0
-value = 1.0
-rounded = true
-align = 1
-
-[node name="ContinueButton" type="Button" parent="Control/CenterContainer/VBoxContainer"]
-margin_top = 72.0
-margin_right = 83.0
-margin_bottom = 104.0
-rect_min_size = Vector2( 83, 32 )
-size_flags_horizontal = 6
-size_flags_vertical = 0
-theme = ExtResource( 1 )
-text = "continue"
-
-[node name="Gap2" type="Control" parent="Control/CenterContainer/VBoxContainer"]
-margin_top = 108.0
-margin_right = 83.0
-margin_bottom = 112.0
-rect_min_size = Vector2( 0, 4 )
-
-[node name="QuitButton" type="Button" parent="Control/CenterContainer/VBoxContainer"]
-margin_left = 5.0
-margin_top = 116.0
-margin_right = 77.0
-margin_bottom = 148.0
-rect_min_size = Vector2( 72, 32 )
-size_flags_horizontal = 6
-size_flags_vertical = 0
-text = "exit(!)"
-
-[node name="LoadScreenButton" type="Button" parent="Control/CenterContainer/VBoxContainer"]
-visible = false
-margin_top = 152.0
-margin_right = 144.0
-margin_bottom = 184.0
-rect_min_size = Vector2( 144, 32 )
-size_flags_horizontal = 6
-size_flags_vertical = 0
-text = "test load screen"
-
-[node name="Gap" type="Control" parent="Control/CenterContainer/VBoxContainer"]
-margin_top = 152.0
-margin_right = 83.0
-margin_bottom = 202.0
-rect_min_size = Vector2( 0, 50 )
-
-[node name="Label" type="Label" parent="Control"]
-margin_left = 8.0
-margin_top = 8.0
-margin_right = 41.0
-margin_bottom = 15.0
-custom_fonts/font = ExtResource( 2 )
-text = "(c) bendn"
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Hi" type="Label" parent="Control"]
-anchor_left = 1.0
-anchor_right = 1.0
-margin_left = -96.0
-margin_top = 16.0
-margin_right = -24.0
-margin_bottom = 30.0
-text = "highscore:"
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[connection signal="pressed" from="Control/CenterContainer/VBoxContainer/StartButton" to="." method="_on_StartButton_pressed"]
-[connection signal="pressed" from="Control/CenterContainer/VBoxContainer/HBoxContainer/LoadButton" to="." method="_on_LoadButton_pressed"]
-[connection signal="pressed" from="Control/CenterContainer/VBoxContainer/ContinueButton" to="." method="_on_ContinueButton_pressed"]
-[connection signal="pressed" from="Control/CenterContainer/VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]
-[connection signal="pressed" from="Control/CenterContainer/VBoxContainer/LoadScreenButton" to="." method="_on_LoadScreenButton_pressed"]
diff --git a/StopWatch.gd b/StopWatch.gd
deleted file mode 100644
index 35e6492..0000000
--- a/StopWatch.gd
+++ /dev/null
@@ -1,39 +0,0 @@
-extends Label
-
-var time_elapsed := 0.0
-
-
-func _ready():
- MainInstances.stopwatch = self
- set_process(false)
-
-
-func start():
- set_process(true)
-
-
-func _exit_tree():
- MainInstances.stopwatch = null
-
-
-func reset():
- time_elapsed = 0.0
- text = _format_seconds(time_elapsed, true)
- set_process(false)
-
-
-func _process(delta):
- time_elapsed += delta
- text = _format_seconds(time_elapsed, true)
-
-
-func _format_seconds(time: float, use_milliseconds: bool) -> String:
- var minutes := time / 60
- var seconds := fmod(time, 60)
-
- if not use_milliseconds:
- return "%02d:%02d" % [minutes, seconds]
-
- var milliseconds := fmod(time, 1) * 100
-
- return "%02d:%02d:%02d" % [minutes, seconds, milliseconds]
diff --git a/Target.gd b/Target.gd
deleted file mode 100644
index bf970a5..0000000
--- a/Target.gd
+++ /dev/null
@@ -1,28 +0,0 @@
-extends Node
-
-onready var anim = $AnimationPlayer
-
-var main: Node2D
-onready var circle = $Circle
-
-
-func _on_Target_body_entered(body):
- if body.is_in_group("crates"):
- body.entered_target(self)
- if not main.just_started:
- play_pulse()
-
-
-func _on_Target_body_exited(body):
- if body.is_in_group("crates"):
- body.left_target(self)
- anim.play("Animate")
-
-
-func r():
- return rand_range(0, 1)
-
-
-func play_pulse():
- circle.self_modulate = Color(r(), r(), r(), 1)
- anim.play("Animate")
diff --git a/Target.png b/Target.png
deleted file mode 100644
index 0b0a14e..0000000
--- a/Target.png
+++ /dev/null
Binary files differ
diff --git a/Target.png.import b/Target.png.import
deleted file mode 100644
index 9af05f0..0000000
--- a/Target.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/Target.png-a2fc14cdfa4f6bab21fb499d99aa5d1c.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://Target.png"
-dest_files=[ "res://.import/Target.png-a2fc14cdfa4f6bab21fb499d99aa5d1c.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/Target.tscn b/Target.tscn
deleted file mode 100644
index 14464e3..0000000
--- a/Target.tscn
+++ /dev/null
@@ -1,88 +0,0 @@
-[gd_scene load_steps=7 format=2]
-
-[ext_resource path="res://Target.gd" type="Script" id=1]
-[ext_resource path="res://Target.png" type="Texture" id=2]
-[ext_resource path="res://circle.png" type="Texture" id=3]
-
-[sub_resource type="RectangleShape2D" id=1]
-extents = Vector2( 7, 7 )
-
-[sub_resource type="Animation" id=2]
-resource_name = "Animate"
-tracks/0/type = "value"
-tracks/0/path = NodePath("Circle:scale")
-tracks/0/interp = 2
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 0.9, 1 ),
-"transitions": PoolRealArray( -2, -2, -2 ),
-"update": 0,
-"values": [ Vector2( 1e-05, 1e-05 ), Vector2( 1, 1 ), Vector2( 0, 0 ) ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Circle:modulate")
-tracks/1/interp = 2
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0, 0.6, 0.8, 1 ),
-"transitions": PoolRealArray( -2, -2, -2, -2 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 0 ) ]
-}
-
-[sub_resource type="Animation" id=3]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/path = NodePath("Circle:scale")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ Vector2( 0, 0 ) ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Circle:modulate")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 1 ) ]
-}
-
-[node name="Target" type="Area2D" groups=["target"]]
-script = ExtResource( 1 )
-
-[node name="Sprite" type="Sprite" parent="."]
-texture = ExtResource( 2 )
-centered = false
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
-position = Vector2( 8, 8 )
-shape = SubResource( 1 )
-
-[node name="Circle" type="Sprite" parent="."]
-position = Vector2( 8, 8 )
-scale = Vector2( 1e-05, 1e-05 )
-z_index = 1
-texture = ExtResource( 3 )
-
-[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
-autoplay = "RESET"
-playback_speed = 0.5
-anims/Animate = SubResource( 2 )
-anims/RESET = SubResource( 3 )
-
-[connection signal="body_entered" from="." to="." method="_on_Target_body_entered"]
-[connection signal="body_exited" from="." to="." method="_on_Target_body_exited"]
diff --git a/Utils.gd b/Utils.gd
deleted file mode 100644
index 15dc404..0000000
--- a/Utils.gd
+++ /dev/null
@@ -1,55 +0,0 @@
-extends Node
-
-var color := Color(0.333333, 0.490196, 0.333333)
-
-var starting = false
-var loading = false
-var loading_int = 0
-
-var loadScreen: CanvasLayer = null
-var stop_input = false
-
-signal loaded_loading_screen
-
-const LoadScreen = preload("res://LoadingScreen.tscn")
-
-
-func _ready():
- VisualServer.set_default_clear_color(color)
-
-
-func instance_scene_on_main(position, scene):
- var main = get_tree().current_scene
- var instance = scene.instance()
- main.add_child(instance)
- if not instance is CanvasLayer:
- instance.global_position = position
- return instance
-
-
-func change_scene_to(scene):
- get_tree().change_scene_to(scene)
-
-
-func load_loading_screen():
- # redundancy check
- if loadScreen != null:
- return
- yield(get_tree().create_timer(.1), "timeout")
- loadScreen = instance_scene_on_main(Vector2.ZERO, LoadScreen)
- loadScreen.startup()
- yield(loadScreen, "startup_complete")
- emit_signal("loaded_loading_screen")
-
-
-func unload_loading_screen():
- if loadScreen == null:
- return
- loadScreen.exit()
- loadScreen = null
-
-
-func _set_disable_inputs(inputs):
- stop_input = inputs
- get_viewport().gui_disable_input = inputs
- get_tree().call_group("input", "set_process_input", !inputs)
diff --git a/WinScreen.gd b/WinScreen.gd
deleted file mode 100644
index 01486d4..0000000
--- a/WinScreen.gd
+++ /dev/null
@@ -1,21 +0,0 @@
-extends CanvasLayer
-
-var player: KinematicBody2D
-var shown = false
-
-
-func _show(integer):
- shown = true
- $Container/AnimationPlayer.play("Animate")
- $Container.visible = true
- $Container/Label._dialogue("LEVEL %s COMPLETED PRESS enter TO CONTINUE!" % integer)
- SoundFx.play("victory", -15)
-
-
-func hide(backwards = true):
- shown = false
- if backwards:
- $Container/Label._erase()
- $Container/AnimationPlayer.play_backwards("Animate")
- yield($Container/AnimationPlayer, "animation_finished")
- $Container.hide()
diff --git a/WinScreen.tscn b/WinScreen.tscn
deleted file mode 100644
index 45e9031..0000000
--- a/WinScreen.tscn
+++ /dev/null
@@ -1,71 +0,0 @@
-[gd_scene load_steps=5 format=2]
-
-[ext_resource path="res://Label.tscn" type="PackedScene" id=1]
-[ext_resource path="res://WinScreen.gd" type="Script" id=2]
-
-[sub_resource type="Animation" id=3]
-resource_name = "Animate"
-length = 2.0
-tracks/0/type = "value"
-tracks/0/path = NodePath("Panel:color")
-tracks/0/interp = 2
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 2 ),
-"transitions": PoolRealArray( -2, -2 ),
-"update": 0,
-"values": [ Color( 0, 0, 0, 0 ), Color( 0, 0, 0, 0.784314 ) ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Label:rect_scale")
-tracks/1/interp = 2
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0, 2 ),
-"transitions": PoolRealArray( -2, -2 ),
-"update": 0,
-"values": [ Vector2( 1e-05, 1e-05 ), Vector2( 1, 1 ) ]
-}
-
-[sub_resource type="Animation" id=2]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/path = NodePath("Panel:color")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ Color( 0, 0, 0, 0 ) ]
-}
-
-[node name="WinScreen" type="CanvasLayer"]
-script = ExtResource( 2 )
-
-[node name="Container" type="Control" parent="."]
-anchor_right = 1.0
-anchor_bottom = 1.0
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Panel" type="ColorRect" parent="Container"]
-anchor_right = 1.0
-anchor_bottom = 1.0
-color = Color( 0, 0, 0, 0 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Label" parent="Container" instance=ExtResource( 1 )]
-
-[node name="AnimationPlayer" type="AnimationPlayer" parent="Container"]
-anims/Animate = SubResource( 3 )
-anims/RESET = SubResource( 2 )
diff --git a/World.gd b/World.gd
deleted file mode 100644
index f09c12b..0000000
--- a/World.gd
+++ /dev/null
@@ -1,136 +0,0 @@
-extends Node2D
-
-var currentintlevel := 1
-var screenshots = 0
-var game_over = false setget set_over
-var game_won = false setget set_won
-var over = false
-var just_started = true
-
-onready var level := $Level
-onready var console = MainInstances.console
-
-const path = "user://"
-
-
-func _ready():
- if Utils.starting:
- start()
- Utils.starting = false
- if Utils.loading:
- Utils.loading = false
- currentintlevel = Utils.loading_int
- Utils.loading_int = 0
- start()
- $WinScreen.player = $Level/LevelContainer/Player
- $WinScreen.hide(false)
- level.connect("level_completed", self, "_on_Level_level_completed")
- level.connect("level_reset", self, "_on_Level_level_reset")
- level.connect("game_over", self, "_on_Level_game_over")
-
-
-func _on_Level_level_completed(complete = false):
- $Level/CanvasLayer/HUD/StopWatch.set_process(false)
- if complete:
- $WinScreen._show(str(level.current_level))
- save(currentintlevel + 1)
- game_over = false
- game_won = true
- else:
- $Level/LevelContainer/LevelComplete.play("Animate")
- get_tree().call_group("target", "play_pulse")
-
-
-func _on_Level_level_reset():
- $WinScreen.hide(true)
- $GameoverScreen.hide(true)
- game_over = false
- game_won = false
-
-
-func save(new_level): # what level are we on/going to
- if (new_level) > int(SaveLoad.files.level.data.highest_level):
- SaveLoad.files.level.data.highest_level = str(new_level - 1)
- console.Log("New Highscore!")
- SaveLoad.save("level")
-
-
-func _on_Level_game_over():
- game_over = true
- game_won = false
- $GameoverScreen._show(str(level.current_level))
-
-
-onready var cam = $Level/LevelContainer/Player.cam
-
-var max_zoom = 3
-var min_zoom = .25
-
-
-func _input(event: InputEvent):
- if event.is_action("scrollup"):
- var new_zoom = cam.zoom.x
- new_zoom += .01
- new_zoom = clamp(new_zoom, min_zoom, max_zoom)
- cam.zoom = Vector2(new_zoom, new_zoom)
-
- elif event.is_action("scrolldown"):
- var new_zoom = cam.zoom.x
- new_zoom -= .03
- new_zoom = clamp(new_zoom, min_zoom, max_zoom)
- cam.zoom = Vector2(new_zoom, new_zoom)
-
- elif event.is_action_released("next"):
- currentintlevel += 1
- currentintlevel = clamp(currentintlevel, 1, 60)
-
- start()
-
- if event.is_action_released("ui_accept"):
- if $WinScreen.shown:
- currentintlevel += 1
- $WinScreen.hide(true)
- game_won = false
- level.load_level(str(currentintlevel))
-
- elif $GameoverScreen.shown:
- $GameoverScreen.hide(true)
- game_won = false
- game_over = false
- level.load_level(str(currentintlevel), false)
-
- elif event.is_action_released("prtscrn"):
- screenshots += 1
- screenshots = clamp(screenshots, 0, 20)
- var save_path = path + "sokobanscreenshot_%s.png" % str(screenshots)
- var image = get_viewport().get_texture().get_data()
- image.flip_y()
- if console.Log(
- (
- "saved to: "
- + OS.get_user_data_dir()
- + "/"
- + "sokobanscreenshot_%s.png" % str(screenshots)
- ),
- 1,
- 2.5
- ):
- image.save_png(save_path)
-
-
-func start():
- Utils.load_loading_screen()
- yield(Utils, "loaded_loading_screen")
- $Level/CanvasLayer/HUD.show()
- level.show()
- level.load_level(str(currentintlevel))
-
-
-func set_won(value):
- game_won = value
- over = game_over or game_won
-
-
-func set_over(value):
- game_over = value
- over = game_over or game_won
diff --git a/World.tscn b/World.tscn
deleted file mode 100644
index f9b4553..0000000
--- a/World.tscn
+++ /dev/null
@@ -1,29 +0,0 @@
-[gd_scene load_steps=8 format=2]
-
-[ext_resource path="res://Level.tscn" type="PackedScene" id=1]
-[ext_resource path="res://console.tscn" type="PackedScene" id=2]
-[ext_resource path="res://World.gd" type="Script" id=3]
-[ext_resource path="res://WinScreen.tscn" type="PackedScene" id=4]
-[ext_resource path="res://MobileInputs.tscn" type="PackedScene" id=5]
-[ext_resource path="res://GameoverScreen.tscn" type="PackedScene" id=6]
-[ext_resource path="res://Pause.tscn" type="PackedScene" id=7]
-
-[node name="World" type="Node2D" groups=["input"]]
-script = ExtResource( 3 )
-
-[node name="CanvasModulate" type="CanvasModulate" parent="."]
-visible = false
-color = Color( 0.415686, 0.415686, 0.415686, 1 )
-
-[node name="Level" parent="." instance=ExtResource( 1 )]
-visible = false
-
-[node name="WinScreen" parent="." instance=ExtResource( 4 )]
-
-[node name="GameoverScreen" parent="." instance=ExtResource( 6 )]
-
-[node name="MobileInputs" parent="." instance=ExtResource( 5 )]
-
-[node name="Pause" parent="." instance=ExtResource( 7 )]
-
-[node name="console" parent="." instance=ExtResource( 2 )]
diff --git a/addons/gdcli b/addons/gdcli
deleted file mode 120000
index ac119d8..0000000
--- a/addons/gdcli
+++ /dev/null
@@ -1 +0,0 @@
-../submodules/gdcli/addons/gdcli/ \ No newline at end of file
diff --git a/arrow.png b/arrow.png
deleted file mode 100644
index 9c67940..0000000
--- a/arrow.png
+++ /dev/null
Binary files differ
diff --git a/arrow.png.import b/arrow.png.import
deleted file mode 100644
index 989b2f1..0000000
--- a/arrow.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/arrow.png-9a52328c9c8f79a188b7fabb13b1f3fc.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://arrow.png"
-dest_files=[ "res://.import/arrow.png-9a52328c9c8f79a188b7fabb13b1f3fc.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/autoloads/CLI.gd b/autoloads/CLI.gd
deleted file mode 100644
index 095bfd3..0000000
--- a/autoloads/CLI.gd
+++ /dev/null
@@ -1,11 +0,0 @@
-extends Node
-
-func _ready() -> void:
- var p := Parser.new()
- p.add_argument(Arg.new({triggers=["-h", "--help", "-?"], help="show this help message and exit", action="store_true"}))
- var args = p.parse_arguments()
- if args == null:
- get_tree().quit()
- elif args.get("help", false):
- print(p.help())
- get_tree().quit() \ No newline at end of file
diff --git a/box.png b/box.png
deleted file mode 100644
index 7127308..0000000
--- a/box.png
+++ /dev/null
Binary files differ
diff --git a/box.png.import b/box.png.import
deleted file mode 100644
index 406f655..0000000
--- a/box.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/box.png-196cb2b6d7422a4ab3b9c60b5a994fe3.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://box.png"
-dest_files=[ "res://.import/box.png-196cb2b6d7422a4ab3b9c60b5a994fe3.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/box_normal.png b/box_normal.png
deleted file mode 100644
index b61bf9e..0000000
--- a/box_normal.png
+++ /dev/null
Binary files differ
diff --git a/box_normal.png.import b/box_normal.png.import
deleted file mode 100644
index 9ef8247..0000000
--- a/box_normal.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/box_normal.png-4ab3172ed1cab6e2c2937f697957b48b.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://box_normal.png"
-dest_files=[ "res://.import/box_normal.png-4ab3172ed1cab6e2c2937f697957b48b.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/checked_box.png b/checked_box.png
deleted file mode 100644
index 070262b..0000000
--- a/checked_box.png
+++ /dev/null
Binary files differ
diff --git a/checked_box.png.import b/checked_box.png.import
deleted file mode 100644
index 82a15a7..0000000
--- a/checked_box.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/checked_box.png-a413fe7d6aa4e2798e5d8bd072b7bf58.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://checked_box.png"
-dest_files=[ "res://.import/checked_box.png-a413fe7d6aa4e2798e5d8bd072b7bf58.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/circle.png b/circle.png
deleted file mode 100644
index a3aff8c..0000000
--- a/circle.png
+++ /dev/null
Binary files differ
diff --git a/circle.png.import b/circle.png.import
deleted file mode 100644
index 2e2e79f..0000000
--- a/circle.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/circle.png-10953cad44a8947fbdd4128a631e9e52.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://circle.png"
-dest_files=[ "res://.import/circle.png-10953cad44a8947fbdd4128a631e9e52.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/clean_import.py b/clean_import.py
deleted file mode 100644
index 027d9f0..0000000
--- a/clean_import.py
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/python3
-
-import re
-from glob import iglob
-import json
-import os
-
-used = set()
-unused = set()
-
-re_dest_files = re.compile(r'^dest_files=(\[.*\])$')
-
-# for all *.import files in project:
-for path in iglob("**/*.import", recursive=True):
- with open(path, 'r') as f:
- # find the dest_files line in the [deps] section
- deps = False
- found = False
- for line in f:
- if not deps:
- deps = (line == '[deps]\n')
- continue
- else:
- if line[0] == '[':
- # new section encountered, somehow there's no dest_files
- break
-
- # extract the imported file path(s)
- match = re_dest_files.match(line)
- if match:
- paths_str = match.group(1)
- paths = json.loads(paths_str)
- md5s = set()
- for i, p in enumerate(paths):
- # remove 'res://'
- paths[i] = p[6:]
- md5s.add(os.path.splitext(paths[i])[0] + '.md5')
-
- used |= set(paths)
- used |= md5s
- found = True
- break
-
- if not found:
- print(f"warning: {path}: no deps.dest_files")
-
-# find every file in .import/ that isn't referenced in a *.import file
-for path in iglob('.import/*'):
- if path not in used:
- unused.add(path)
-
-# do this alphabetically for nicer terminal output
-unused = list(unused)
-unused.sort()
-n = 0
-
-for path in unused:
- print(path)
- os.remove(path)
- n += 1
-
-print('---')
-print(f'removed {n} files from .import/')
diff --git a/console.gd b/console.gd
deleted file mode 100644
index fcf17c7..0000000
--- a/console.gd
+++ /dev/null
@@ -1,32 +0,0 @@
-extends CanvasLayer
-
-onready var label = $Label
-onready var tween = $Tween
-
-
-func _ready():
- MainInstances.console = self
- label.percent_visible = 0
-
-
-func Log(new_text: String, time := .5, length := 2.5):
- if tween.is_active():
- return false
- label.percent_visible = 0
- label.text = new_text
- tween_(0, 1, time)
- yield(tween, "tween_all_completed")
- yield(get_tree().create_timer(length), "timeout")
- tween_(1, 0, time)
- return true
-
-
-func _exit_tree():
- MainInstances.console = null
-
-
-func tween_(from, to, time):
- tween.interpolate_property(
- $Label, "percent_visible", from, to, time, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
- )
- tween.start()
diff --git a/console.tscn b/console.tscn
deleted file mode 100644
index 51e6502..0000000
--- a/console.tscn
+++ /dev/null
@@ -1,29 +0,0 @@
-[gd_scene load_steps=4 format=2]
-
-[ext_resource path="res://theme.tres" type="Theme" id=1]
-[ext_resource path="res://console.gd" type="Script" id=2]
-[ext_resource path="res://smallfont.tres" type="DynamicFont" id=3]
-
-[node name="console" type="CanvasLayer"]
-pause_mode = 2
-layer = 3
-script = ExtResource( 2 )
-
-[node name="Label" type="Label" parent="."]
-anchor_top = 1.0
-anchor_right = 1.0
-anchor_bottom = 1.0
-margin_left = 8.0
-margin_top = -24.0
-margin_right = -8.0
-margin_bottom = -14.0
-theme = ExtResource( 1 )
-custom_fonts/font = ExtResource( 3 )
-valign = 1
-autowrap = true
-percent_visible = 0.0
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Tween" type="Tween" parent="."]
diff --git a/cube_normal.png b/cube_normal.png
deleted file mode 100644
index 1106a55..0000000
--- a/cube_normal.png
+++ /dev/null
Binary files differ
diff --git a/cube_normal.png.import b/cube_normal.png.import
deleted file mode 100644
index c64fcbb..0000000
--- a/cube_normal.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/cube_normal.png-ff88bc9b783bfa228efa5945105d185b.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://cube_normal.png"
-dest_files=[ "res://.import/cube_normal.png-ff88bc9b783bfa228efa5945105d185b.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/cuberot.png b/cuberot.png
deleted file mode 100644
index 00d9ac2..0000000
--- a/cuberot.png
+++ /dev/null
Binary files differ
diff --git a/cuberot.png.import b/cuberot.png.import
deleted file mode 100644
index f742b1b..0000000
--- a/cuberot.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/cuberot.png-09a3b8edec03f9428006f7e69a73b4eb.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://cuberot.png"
-dest_files=[ "res://.import/cuberot.png-09a3b8edec03f9428006f7e69a73b4eb.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/decoration.png b/decoration.png
deleted file mode 100644
index b975bc2..0000000
--- a/decoration.png
+++ /dev/null
Binary files differ
diff --git a/decoration.png.import b/decoration.png.import
deleted file mode 100644
index 628ea85..0000000
--- a/decoration.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/decoration.png-2c41963842a7ec2bc4646726edcd568c.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://decoration.png"
-dest_files=[ "res://.import/decoration.png-2c41963842a7ec2bc4646726edcd568c.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/default_env.tres b/default_env.tres
deleted file mode 100644
index 20207a4..0000000
--- a/default_env.tres
+++ /dev/null
@@ -1,7 +0,0 @@
-[gd_resource type="Environment" load_steps=2 format=2]
-
-[sub_resource type="ProceduralSky" id=1]
-
-[resource]
-background_mode = 2
-background_sky = SubResource( 1 )
diff --git a/explode.png b/explode.png
deleted file mode 100644
index 707a6e8..0000000
--- a/explode.png
+++ /dev/null
Binary files differ
diff --git a/explode.png.import b/explode.png.import
deleted file mode 100644
index a817c89..0000000
--- a/explode.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/explode.png-d4ea30f12ff0a2274a9cd85ead11bc93.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://explode.png"
-dest_files=[ "res://.import/explode.png-d4ea30f12ff0a2274a9cd85ead11bc93.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/export_presets.cfg b/export_presets.cfg
deleted file mode 100644
index b0a6f12..0000000
--- a/export_presets.cfg
+++ /dev/null
@@ -1,382 +0,0 @@
-[preset.0]
-
-name="Windows"
-platform="Windows Desktop"
-runnable=true
-custom_features=""
-export_filter="all_resources"
-include_filter=""
-exclude_filter=""
-export_path=""
-script_export_mode=1
-script_encryption_key=""
-
-[preset.0.options]
-
-custom_template/debug=""
-custom_template/release=""
-binary_format/64_bits=true
-binary_format/embed_pck=true
-texture_format/bptc=false
-texture_format/s3tc=true
-texture_format/etc=false
-texture_format/etc2=false
-texture_format/no_bptc_fallbacks=true
-codesign/enable=false
-codesign/identity_type=0
-codesign/identity=""
-codesign/password=""
-codesign/timestamp=true
-codesign/timestamp_server_url=""
-codesign/digest_algorithm=1
-codesign/description=""
-codesign/custom_options=PoolStringArray( )
-application/modify_resources=false
-application/icon=""
-application/file_version=""
-application/product_version=""
-application/company_name=""
-application/product_name=""
-application/file_description=""
-application/copyright=""
-application/trademarks=""
-
-[preset.1]
-
-name="Linux"
-platform="Linux/X11"
-runnable=true
-custom_features=""
-export_filter="all_resources"
-include_filter=""
-exclude_filter=""
-export_path=""
-script_export_mode=1
-script_encryption_key=""
-
-[preset.1.options]
-
-custom_template/debug=""
-custom_template/release=""
-binary_format/64_bits=true
-binary_format/embed_pck=true
-texture_format/bptc=false
-texture_format/s3tc=true
-texture_format/etc=false
-texture_format/etc2=false
-texture_format/no_bptc_fallbacks=true
-
-[preset.2]
-
-name="HTML"
-platform="HTML5"
-runnable=true
-custom_features=""
-export_filter="all_resources"
-include_filter=""
-exclude_filter=""
-export_path=""
-script_export_mode=1
-script_encryption_key=""
-
-[preset.2.options]
-
-custom_template/debug=""
-custom_template/release=""
-variant/export_type=1
-vram_texture_compression/for_desktop=true
-vram_texture_compression/for_mobile=false
-html/export_icon=true
-html/custom_html_shell="res://html/custom.html"
-html/head_include=""
-html/canvas_resize_policy=2
-html/focus_canvas_on_start=true
-html/experimental_virtual_keyboard=true
-progressive_web_app/enabled=false
-progressive_web_app/offline_page=""
-progressive_web_app/display=1
-progressive_web_app/orientation=0
-progressive_web_app/icon_144x144=""
-progressive_web_app/icon_180x180=""
-progressive_web_app/icon_512x512=""
-progressive_web_app/background_color=Color( 0, 0, 0, 1 )
-
-[preset.3]
-
-name="Mac"
-platform="Mac OSX"
-runnable=true
-custom_features=""
-export_filter="all_resources"
-include_filter=""
-exclude_filter=""
-export_path=""
-script_export_mode=1
-script_encryption_key=""
-
-[preset.3.options]
-
-custom_template/debug=""
-custom_template/release=""
-application/name="Godot Template"
-application/info="Godot Template"
-application/icon=""
-application/identifier="com.godot-template"
-application/signature=""
-application/app_category="Games"
-application/short_version="1.0"
-application/version="1.0"
-application/copyright=""
-display/high_res=false
-privacy/microphone_usage_description=""
-privacy/camera_usage_description=""
-privacy/location_usage_description=""
-privacy/address_book_usage_description=""
-privacy/calendar_usage_description=""
-privacy/photos_library_usage_description=""
-privacy/desktop_folder_usage_description=""
-privacy/documents_folder_usage_description=""
-privacy/downloads_folder_usage_description=""
-privacy/network_volumes_usage_description=""
-privacy/removable_volumes_usage_description=""
-codesign/enable=true
-codesign/identity=""
-codesign/timestamp=true
-codesign/hardened_runtime=true
-codesign/replace_existing_signature=true
-codesign/entitlements/custom_file=""
-codesign/entitlements/allow_jit_code_execution=false
-codesign/entitlements/allow_unsigned_executable_memory=false
-codesign/entitlements/allow_dyld_environment_variables=false
-codesign/entitlements/disable_library_validation=false
-codesign/entitlements/audio_input=false
-codesign/entitlements/camera=false
-codesign/entitlements/location=false
-codesign/entitlements/address_book=false
-codesign/entitlements/calendars=false
-codesign/entitlements/photos_library=false
-codesign/entitlements/apple_events=false
-codesign/entitlements/debugging=false
-codesign/entitlements/app_sandbox/enabled=false
-codesign/entitlements/app_sandbox/network_server=false
-codesign/entitlements/app_sandbox/network_client=false
-codesign/entitlements/app_sandbox/device_usb=false
-codesign/entitlements/app_sandbox/device_bluetooth=false
-codesign/entitlements/app_sandbox/files_downloads=0
-codesign/entitlements/app_sandbox/files_pictures=0
-codesign/entitlements/app_sandbox/files_music=0
-codesign/entitlements/app_sandbox/files_movies=0
-codesign/custom_options=PoolStringArray( )
-notarization/enable=false
-notarization/apple_id_name=""
-notarization/apple_id_password=""
-notarization/apple_team_id=""
-texture_format/s3tc=true
-texture_format/etc=false
-texture_format/etc2=false
-
-[preset.4]
-
-name="Android"
-platform="Android"
-runnable=true
-custom_features=""
-export_filter="all_resources"
-include_filter=""
-exclude_filter=""
-export_path=""
-script_export_mode=1
-script_encryption_key=""
-
-[preset.4.options]
-
-custom_template/debug=""
-custom_template/release=""
-custom_build/use_custom_build=false
-custom_build/export_format=0
-custom_build/min_sdk=""
-custom_build/target_sdk=""
-architectures/armeabi-v7a=true
-architectures/arm64-v8a=false
-architectures/x86=false
-architectures/x86_64=false
-keystore/debug=""
-keystore/debug_user=""
-keystore/debug_password=""
-keystore/release=""
-keystore/release_user=""
-keystore/release_password=""
-one_click_deploy/clear_previous_install=false
-version/code=1
-version/name="1.0"
-package/unique_name="org.godotengine.$genname"
-package/name=""
-package/signed=true
-package/classify_as_game=true
-package/retain_data_on_uninstall=false
-package/exclude_from_recents=false
-launcher_icons/main_192x192=""
-launcher_icons/adaptive_foreground_432x432=""
-launcher_icons/adaptive_background_432x432=""
-graphics/opengl_debug=false
-xr_features/xr_mode=0
-xr_features/hand_tracking=0
-xr_features/hand_tracking_frequency=0
-xr_features/passthrough=0
-screen/immersive_mode=true
-screen/support_small=true
-screen/support_normal=true
-screen/support_large=true
-screen/support_xlarge=true
-user_data_backup/allow=false
-command_line/extra_args=""
-apk_expansion/enable=false
-apk_expansion/SALT=""
-apk_expansion/public_key=""
-permissions/custom_permissions=PoolStringArray( )
-permissions/access_checkin_properties=false
-permissions/access_coarse_location=false
-permissions/access_fine_location=false
-permissions/access_location_extra_commands=false
-permissions/access_mock_location=false
-permissions/access_network_state=false
-permissions/access_surface_flinger=false
-permissions/access_wifi_state=false
-permissions/account_manager=false
-permissions/add_voicemail=false
-permissions/authenticate_accounts=false
-permissions/battery_stats=false
-permissions/bind_accessibility_service=false
-permissions/bind_appwidget=false
-permissions/bind_device_admin=false
-permissions/bind_input_method=false
-permissions/bind_nfc_service=false
-permissions/bind_notification_listener_service=false
-permissions/bind_print_service=false
-permissions/bind_remoteviews=false
-permissions/bind_text_service=false
-permissions/bind_vpn_service=false
-permissions/bind_wallpaper=false
-permissions/bluetooth=false
-permissions/bluetooth_admin=false
-permissions/bluetooth_privileged=false
-permissions/brick=false
-permissions/broadcast_package_removed=false
-permissions/broadcast_sms=false
-permissions/broadcast_sticky=false
-permissions/broadcast_wap_push=false
-permissions/call_phone=false
-permissions/call_privileged=false
-permissions/camera=false
-permissions/capture_audio_output=false
-permissions/capture_secure_video_output=false
-permissions/capture_video_output=false
-permissions/change_component_enabled_state=false
-permissions/change_configuration=false
-permissions/change_network_state=false
-permissions/change_wifi_multicast_state=false
-permissions/change_wifi_state=false
-permissions/clear_app_cache=false
-permissions/clear_app_user_data=false
-permissions/control_location_updates=false
-permissions/delete_cache_files=false
-permissions/delete_packages=false
-permissions/device_power=false
-permissions/diagnostic=false
-permissions/disable_keyguard=false
-permissions/dump=false
-permissions/expand_status_bar=false
-permissions/factory_test=false
-permissions/flashlight=false
-permissions/force_back=false
-permissions/get_accounts=false
-permissions/get_package_size=false
-permissions/get_tasks=false
-permissions/get_top_activity_info=false
-permissions/global_search=false
-permissions/hardware_test=false
-permissions/inject_events=false
-permissions/install_location_provider=false
-permissions/install_packages=false
-permissions/install_shortcut=false
-permissions/internal_system_window=false
-permissions/internet=false
-permissions/kill_background_processes=false
-permissions/location_hardware=false
-permissions/manage_accounts=false
-permissions/manage_app_tokens=false
-permissions/manage_documents=false
-permissions/manage_external_storage=false
-permissions/master_clear=false
-permissions/media_content_control=false
-permissions/modify_audio_settings=false
-permissions/modify_phone_state=false
-permissions/mount_format_filesystems=false
-permissions/mount_unmount_filesystems=false
-permissions/nfc=false
-permissions/persistent_activity=false
-permissions/process_outgoing_calls=false
-permissions/read_calendar=false
-permissions/read_call_log=false
-permissions/read_contacts=false
-permissions/read_external_storage=false
-permissions/read_frame_buffer=false
-permissions/read_history_bookmarks=false
-permissions/read_input_state=false
-permissions/read_logs=false
-permissions/read_phone_state=false
-permissions/read_profile=false
-permissions/read_sms=false
-permissions/read_social_stream=false
-permissions/read_sync_settings=false
-permissions/read_sync_stats=false
-permissions/read_user_dictionary=false
-permissions/reboot=false
-permissions/receive_boot_completed=false
-permissions/receive_mms=false
-permissions/receive_sms=false
-permissions/receive_wap_push=false
-permissions/record_audio=false
-permissions/reorder_tasks=false
-permissions/restart_packages=false
-permissions/send_respond_via_message=false
-permissions/send_sms=false
-permissions/set_activity_watcher=false
-permissions/set_alarm=false
-permissions/set_always_finish=false
-permissions/set_animation_scale=false
-permissions/set_debug_app=false
-permissions/set_orientation=false
-permissions/set_pointer_speed=false
-permissions/set_preferred_applications=false
-permissions/set_process_limit=false
-permissions/set_time=false
-permissions/set_time_zone=false
-permissions/set_wallpaper=false
-permissions/set_wallpaper_hints=false
-permissions/signal_persistent_processes=false
-permissions/status_bar=false
-permissions/subscribed_feeds_read=false
-permissions/subscribed_feeds_write=false
-permissions/system_alert_window=false
-permissions/transmit_ir=false
-permissions/uninstall_shortcut=false
-permissions/update_device_stats=false
-permissions/use_credentials=false
-permissions/use_sip=false
-permissions/vibrate=false
-permissions/wake_lock=false
-permissions/write_apn_settings=false
-permissions/write_calendar=false
-permissions/write_call_log=false
-permissions/write_contacts=false
-permissions/write_external_storage=false
-permissions/write_gservices=false
-permissions/write_history_bookmarks=false
-permissions/write_profile=false
-permissions/write_secure_settings=false
-permissions/write_settings=false
-permissions/write_sms=false
-permissions/write_social_stream=false
-permissions/write_sync_settings=false
-permissions/write_user_dictionary=false
diff --git a/focus_box.tres b/focus_box.tres
deleted file mode 100644
index 85ab432..0000000
--- a/focus_box.tres
+++ /dev/null
@@ -1,15 +0,0 @@
-[gd_resource type="StyleBoxTexture" load_steps=2 format=2]
-
-[ext_resource path="res://focused.png" type="Texture" id=1]
-
-[resource]
-texture = ExtResource( 1 )
-region_rect = Rect2( 0, 0, 12, 12 )
-margin_left = 1.0
-margin_right = 1.0
-margin_top = 1.0
-margin_bottom = 1.0
-expand_margin_left = 2.0
-expand_margin_right = 2.0
-expand_margin_top = 2.0
-expand_margin_bottom = 2.0
diff --git a/focused.png b/focused.png
deleted file mode 100644
index 12b0188..0000000
--- a/focused.png
+++ /dev/null
Binary files differ
diff --git a/focused.png.import b/focused.png.import
deleted file mode 100644
index 204665a..0000000
--- a/focused.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/focused.png-2787c2852fdac55d3bd87c2ee5c1d87d.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://focused.png"
-dest_files=[ "res://.import/focused.png-2787c2852fdac55d3bd87c2ee5c1d87d.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/font.tres b/font.tres
deleted file mode 100644
index 134b904..0000000
--- a/font.tres
+++ /dev/null
@@ -1,7 +0,0 @@
-[gd_resource type="DynamicFont" load_steps=2 format=2]
-
-[ext_resource path="res://04B_19__.TTF" type="DynamicFontData" id=1]
-
-[resource]
-size = 14
-font_data = ExtResource( 1 )
diff --git a/gameover.wav b/gameover.wav
deleted file mode 100644
index 489b8d8..0000000
--- a/gameover.wav
+++ /dev/null
Binary files differ
diff --git a/gameover.wav.import b/gameover.wav.import
deleted file mode 100644
index 59ef426..0000000
--- a/gameover.wav.import
+++ /dev/null
@@ -1,21 +0,0 @@
-[remap]
-
-importer="wav"
-type="AudioStreamSample"
-path="res://.import/gameover.wav-3be9b8c5e5110c6cb40d0384ce2294af.sample"
-
-[deps]
-
-source_file="res://gameover.wav"
-dest_files=[ "res://.import/gameover.wav-3be9b8c5e5110c6cb40d0384ce2294af.sample" ]
-
-[params]
-
-force/8_bit=false
-force/mono=false
-force/max_rate=false
-force/max_rate_hz=44100
-edit/trim=false
-edit/normalize=false
-edit/loop=false
-compress/mode=0
diff --git a/globalsettings.gd b/globalsettings.gd
deleted file mode 100644
index 1ac14c5..0000000
--- a/globalsettings.gd
+++ /dev/null
@@ -1,8 +0,0 @@
-extends Node
-
-var stopwatch = false setget set_stopwatch
-
-
-func set_stopwatch(set):
- stopwatch = set
- MainInstances.stopwatch.visible = stopwatch
diff --git a/html/.gdignore b/html/.gdignore
deleted file mode 100644
index e69de29..0000000
--- a/html/.gdignore
+++ /dev/null
diff --git a/icon.ico b/icon.ico
deleted file mode 100644
index df08788..0000000
--- a/icon.ico
+++ /dev/null
Binary files differ
diff --git a/icon.png b/icon.png
deleted file mode 100644
index b54c5a3..0000000
--- a/icon.png
+++ /dev/null
Binary files differ
diff --git a/icon.png.import b/icon.png.import
deleted file mode 100644
index eb3cdb6..0000000
--- a/icon.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://icon.png"
-dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/index.apple-touch-icon.png b/index.apple-touch-icon.png
new file mode 100644
index 0000000..cf44eb5
--- /dev/null
+++ b/index.apple-touch-icon.png
Binary files differ
diff --git a/index.audio.worklet.js b/index.audio.worklet.js
new file mode 100644
index 0000000..ea4d8cb
--- /dev/null
+++ b/index.audio.worklet.js
@@ -0,0 +1,211 @@
+/*************************************************************************/
+/* audio.worklet.js */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+class RingBuffer {
+ constructor(p_buffer, p_state, p_threads) {
+ this.buffer = p_buffer;
+ this.avail = p_state;
+ this.threads = p_threads;
+ this.rpos = 0;
+ this.wpos = 0;
+ }
+
+ data_left() {
+ return this.threads ? Atomics.load(this.avail, 0) : this.avail;
+ }
+
+ space_left() {
+ return this.buffer.length - this.data_left();
+ }
+
+ read(output) {
+ const size = this.buffer.length;
+ let from = 0;
+ let to_write = output.length;
+ if (this.rpos + to_write > size) {
+ const high = size - this.rpos;
+ output.set(this.buffer.subarray(this.rpos, size));
+ from = high;
+ to_write -= high;
+ this.rpos = 0;
+ }
+ if (to_write) {
+ output.set(this.buffer.subarray(this.rpos, this.rpos + to_write), from);
+ }
+ this.rpos += to_write;
+ if (this.threads) {
+ Atomics.add(this.avail, 0, -output.length);
+ Atomics.notify(this.avail, 0);
+ } else {
+ this.avail -= output.length;
+ }
+ }
+
+ write(p_buffer) {
+ const to_write = p_buffer.length;
+ const mw = this.buffer.length - this.wpos;
+ if (mw >= to_write) {
+ this.buffer.set(p_buffer, this.wpos);
+ this.wpos += to_write;
+ if (mw === to_write) {
+ this.wpos = 0;
+ }
+ } else {
+ const high = p_buffer.subarray(0, mw);
+ const low = p_buffer.subarray(mw);
+ this.buffer.set(high, this.wpos);
+ this.buffer.set(low);
+ this.wpos = low.length;
+ }
+ if (this.threads) {
+ Atomics.add(this.avail, 0, to_write);
+ Atomics.notify(this.avail, 0);
+ } else {
+ this.avail += to_write;
+ }
+ }
+}
+
+class GodotProcessor extends AudioWorkletProcessor {
+ constructor() {
+ super();
+ this.threads = false;
+ this.running = true;
+ this.lock = null;
+ this.notifier = null;
+ this.output = null;
+ this.output_buffer = new Float32Array();
+ this.input = null;
+ this.input_buffer = new Float32Array();
+ this.port.onmessage = (event) => {
+ const cmd = event.data['cmd'];
+ const data = event.data['data'];
+ this.parse_message(cmd, data);
+ };
+ }
+
+ process_notify() {
+ if (this.notifier) {
+ Atomics.add(this.notifier, 0, 1);
+ Atomics.notify(this.notifier, 0);
+ }
+ }
+
+ parse_message(p_cmd, p_data) {
+ if (p_cmd === 'start' && p_data) {
+ const state = p_data[0];
+ let idx = 0;
+ this.threads = true;
+ this.lock = state.subarray(idx, ++idx);
+ this.notifier = state.subarray(idx, ++idx);
+ const avail_in = state.subarray(idx, ++idx);
+ const avail_out = state.subarray(idx, ++idx);
+ this.input = new RingBuffer(p_data[1], avail_in, true);
+ this.output = new RingBuffer(p_data[2], avail_out, true);
+ } else if (p_cmd === 'stop') {
+ this.running = false;
+ this.output = null;
+ this.input = null;
+ } else if (p_cmd === 'start_nothreads') {
+ this.output = new RingBuffer(p_data[0], p_data[0].length, false);
+ } else if (p_cmd === 'chunk') {
+ this.output.write(p_data);
+ }
+ }
+
+ static array_has_data(arr) {
+ return arr.length && arr[0].length && arr[0][0].length;
+ }
+
+ process(inputs, outputs, parameters) {
+ if (!this.running) {
+ return false; // Stop processing.
+ }
+ if (this.output === null) {
+ return true; // Not ready yet, keep processing.
+ }
+ const process_input = GodotProcessor.array_has_data(inputs);
+ if (process_input) {
+ const input = inputs[0];
+ const chunk = input[0].length * input.length;
+ if (this.input_buffer.length !== chunk) {
+ this.input_buffer = new Float32Array(chunk);
+ }
+ if (!this.threads) {
+ GodotProcessor.write_input(this.input_buffer, input);
+ this.port.postMessage({ 'cmd': 'input', 'data': this.input_buffer });
+ } else if (this.input.space_left() >= chunk) {
+ GodotProcessor.write_input(this.input_buffer, input);
+ this.input.write(this.input_buffer);
+ } else {
+ this.port.postMessage('Input buffer is full! Skipping input frame.');
+ }
+ }
+ const process_output = GodotProcessor.array_has_data(outputs);
+ if (process_output) {
+ const output = outputs[0];
+ const chunk = output[0].length * output.length;
+ if (this.output_buffer.length !== chunk) {
+ this.output_buffer = new Float32Array(chunk);
+ }
+ if (this.output.data_left() >= chunk) {
+ this.output.read(this.output_buffer);
+ GodotProcessor.write_output(output, this.output_buffer);
+ if (!this.threads) {
+ this.port.postMessage({ 'cmd': 'read', 'data': chunk });
+ }
+ } else {
+ this.port.postMessage('Output buffer has not enough frames! Skipping output frame.');
+ }
+ }
+ this.process_notify();
+ return true;
+ }
+
+ static write_output(dest, source) {
+ const channels = dest.length;
+ for (let ch = 0; ch < channels; ch++) {
+ for (let sample = 0; sample < dest[ch].length; sample++) {
+ dest[ch][sample] = source[sample * channels + ch];
+ }
+ }
+ }
+
+ static write_input(dest, source) {
+ const channels = source.length;
+ for (let ch = 0; ch < channels; ch++) {
+ for (let sample = 0; sample < source[ch].length; sample++) {
+ dest[sample * channels + ch] = source[ch][sample];
+ }
+ }
+ }
+}
+
+registerProcessor('godot-processor', GodotProcessor);
diff --git a/html/custom.html b/index.html
index 832478b..2a23bc2 100644
--- a/html/custom.html
+++ b/index.html
@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, user-scalable=no" />
- <title>$GODOT_PROJECT_NAME</title>
+ <title>sokoban</title>
<style type="text/css">
body {
touch-action: none;
@@ -127,7 +127,9 @@
visibility: visible;
}
</style>
- $GODOT_HEAD_INCLUDE
+ <link id='-gd-engine-icon' rel='icon' type='image/png' href='index.icon.png' />
+<link rel='apple-touch-icon' href='index.apple-touch-icon.png'/>
+
</head>
<body>
<canvas id="canvas">
@@ -159,11 +161,11 @@
<div id="status-notice" class="godot" style="display: none"></div>
</div>
- <script type="text/javascript" src="$GODOT_URL"></script>
+ <script type="text/javascript" src="index.js"></script>
<script type="text/javascript">
//<![CDATA[
- const GODOT_CONFIG = $GODOT_CONFIG;
+ const GODOT_CONFIG = {"args":[],"canvasResizePolicy":2,"executable":"index","experimentalVK":true,"fileSizes":{"index.pck":35307008,"index.wasm":11303167},"focusCanvas":true,"gdnativeLibs":[]};
var engine = new Engine(GODOT_CONFIG);
(function () {
@@ -278,3 +280,4 @@
</script>
</body>
</html>
+
diff --git a/index.icon.png b/index.icon.png
new file mode 100644
index 0000000..6b436b2
--- /dev/null
+++ b/index.icon.png
Binary files differ
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..6abf81d
--- /dev/null
+++ b/index.js
@@ -0,0 +1,796 @@
+
+var Godot = (() => {
+ var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
+
+ return (
+function(Godot) {
+ Godot = Godot || {};
+
+function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAP8}function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPU8}function GROWABLE_HEAP_I16(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAP16}function GROWABLE_HEAP_U16(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPU16}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAP32}function GROWABLE_HEAP_U32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPU32}function GROWABLE_HEAP_F32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPF32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPF64}var Module=typeof Godot!="undefined"?Godot:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=(url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText});if(ENVIRONMENT_IS_WORKER){readBinary=(url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)})}readAsync=((url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=(()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()});xhr.onerror=onerror;xhr.send(null)})}setWindowTitle=(title=>document.title=title)}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=value=>{tempRet0=value};var getTempRet0=()=>tempRet0;var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||false;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}function setValue(ptr,value,type="i8",noSafe){if(type.endsWith("*"))type="i32";switch(type){case"i1":GROWABLE_HEAP_I8()[ptr>>0]=value;break;case"i8":GROWABLE_HEAP_I8()[ptr>>0]=value;break;case"i16":GROWABLE_HEAP_I16()[ptr>>1]=value;break;case"i32":GROWABLE_HEAP_I32()[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],GROWABLE_HEAP_I32()[ptr>>2]=tempI64[0],GROWABLE_HEAP_I32()[ptr+4>>2]=tempI64[1];break;case"float":GROWABLE_HEAP_F32()[ptr>>2]=value;break;case"double":GROWABLE_HEAP_F64()[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function getValue(ptr,type="i8",noSafe){if(type.endsWith("*"))type="i32";switch(type){case"i1":return GROWABLE_HEAP_I8()[ptr>>0];case"i8":return GROWABLE_HEAP_I8()[ptr>>0];case"i16":return GROWABLE_HEAP_I16()[ptr>>1];case"i32":return GROWABLE_HEAP_I32()[ptr>>2];case"i64":return GROWABLE_HEAP_I32()[ptr>>2];case"float":return GROWABLE_HEAP_F32()[ptr>>2];case"double":return Number(GROWABLE_HEAP_F64()[ptr>>3]);default:abort("invalid type for getValue: "+type)}}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}function getCFunc(ident){var func=Module["_"+ident];return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every(function(type){return type==="number"});var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.buffer instanceof SharedArrayBuffer?heapOrArray.slice(idx,endPtr):heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,GROWABLE_HEAP_I8(),ret,size);return ret}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,GROWABLE_HEAP_I8(),ret,size);return ret}function writeArrayToMemory(array,buffer){GROWABLE_HEAP_I8().set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){GROWABLE_HEAP_I8()[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)GROWABLE_HEAP_I8()[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||33554432;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":2147483648/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;SOCKFS.root=FS.mount(SOCKFS,{},null);if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;___funcs_on_exit();callRuntimeCallbacks(__ATEXIT__);FS.quit();TTY.shutdown();IDBFS.quit();PThread.terminateAllThreads();runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="godot.javascript.opt.threads.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTlsInit(Module["asm"]["Bh"]);wasmTable=Module["asm"]["Jh"];addOnInit(Module["asm"]["rh"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;var ASM_CONSTS={};function killThread(pthread_ptr){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var pthread=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];pthread.worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1);pthread.worker.pthread=undefined}function cancelThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];if(pthread){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var worker=pthread.worker;PThread.returnWorkerToPool(worker)}}function zeroMemory(address,size){GROWABLE_HEAP_U8().fill(0,address,address+size)}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,threadInfoStruct:threadParams.pthread_ptr};worker.pthread=pthread;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"threadInfoStruct":threadParams.pthread_ptr};worker.runPthread=(()=>{msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)});if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}function _exit(status){exit(status)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],init:function(){if(ENVIRONMENT_IS_PTHREAD){PThread.initWorker()}else{PThread.initMainThread()}},initMainThread:function(){var pthreadPoolSize=8;for(var i=0;i<pthreadPoolSize;++i){PThread.allocateUnusedWorker()}},initWorker:function(){noExitRuntime=false},pthreads:{},setExitStatus:function(status){EXITSTATUS=status},terminateAllThreads:function(){for(var t in PThread.pthreads){var pthread=PThread.pthreads[t];if(pthread&&pthread.worker){PThread.returnWorkerToPool(pthread.worker)}}for(var i=0;i<PThread.unusedWorkers.length;++i){var worker=PThread.unusedWorkers[i];worker.terminate()}PThread.unusedWorkers=[]},returnWorkerToPool:function(worker){PThread.runWithoutMainThreadQueuedCalls(function(){delete PThread.pthreads[worker.pthread.threadInfoStruct];PThread.unusedWorkers.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);__emscripten_thread_free_data(worker.pthread.threadInfoStruct);worker.pthread=undefined})},runWithoutMainThreadQueuedCalls:function(func){GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls>>2]=0;try{func()}finally{GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls>>2]=1}},receiveObjectTransfer:function(data){},threadInit:function(){for(var i in PThread.tlsInitFunctions){if(PThread.tlsInitFunctions.hasOwnProperty(i))PThread.tlsInitFunctions[i]()}},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=(e=>{var d=e["data"];var cmd=d["cmd"];if(worker.pthread)PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];if(thread){thread.worker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processProxyingQueue"){executeNotifiedProxyingQueue(d["queue"])}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else if(cmd){err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined});worker.onerror=(e=>{var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e});worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("godot.javascript.opt.threads.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};Module["PThread"]=PThread;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func=="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=GROWABLE_HEAP_I32()[pthread_ptr+44>>2];var stackSize=GROWABLE_HEAP_I32()[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}function getWasmTableEntry(funcPtr){return wasmTable.get(funcPtr)}function invokeEntryPoint(ptr,arg){return getWasmTableEntry(ptr)(arg)}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTlsInit(tlsInitFunc){PThread.tlsInitFunctions.push(tlsInitFunc)}function ___call_sighandler(fp,sig){getWasmTableEntry(fp)(sig)}function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInit()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function pthreadCreateProxied(pthread_ptr,attr,start_routine,arg){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,1,pthread_ptr,attr,start_routine,arg);return ___pthread_create_js(pthread_ptr,attr,start_routine,arg)}function ___pthread_create_js(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer=="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return pthreadCreateProxied(pthread_ptr,attr,start_routine,arg)}if(error)return error;var threadParams={startRoutine:start_routine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else return function(){abort("randomDevice")}}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")}};var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.flush(stream.tty)},flush:function(stream){stream.tty.ops.flush(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(60)}try{for(var i=0;i<length;i++){stream.tty.ops.put_char(stream.tty,buffer[offset+i])}}catch(e){throw new FS.ErrnoError(29)}if(length){stream.node.timestamp=Date.now()}return i}},default_tty_ops:{get_char:function(tty){if(!tty.input.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function alignMemory(size,alignment){return Math.ceil(size/alignment)*alignment}function mmapAlloc(size){size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;zeroMemory(ptr,size);return ptr}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)>>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size},write:function(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===GROWABLE_HEAP_I8().buffer){canOwn=false}if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray){node.contents.set(buffer.subarray(offset,offset+length),position)}else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},allocate:function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)},mmap:function(stream,address,length,position,prot,flags){if(address!==0){throw new FS.ErrnoError(28)}if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===buffer){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<contents.length){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}GROWABLE_HEAP_I8().set(contents,ptr)}return{ptr:ptr,allocated:allocated}},msync:function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(mmapFlags&2){return 0}var bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};function asyncLoad(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";readAsync(url,function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)}var IDBFS={dbs:{},indexedDB:()=>{if(typeof indexedDB!="undefined")return indexedDB;var ret=null;if(typeof window=="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,"IDBFS used, but indexedDB not supported");return ret},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function(mount){return MEMFS.mount.apply(null,arguments)},syncfs:(mount,populate,callback)=>{IDBFS.getLocalSet(mount,(err,local)=>{if(err)return callback(err);IDBFS.getRemoteSet(mount,(err,remote)=>{if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)})})},quit:()=>{Object.values(IDBFS.dbs).forEach(value=>value.close());IDBFS.dbs={}},getDB:(name,callback)=>{var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=(e=>{var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}});req.onsuccess=(()=>{db=req.result;IDBFS.dbs[name]=db;callback(null,db)});req.onerror=(e=>{callback(this.error);e.preventDefault()})},getLocalSet:(mount,callback)=>{var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return p=>{return PATH.join2(root,p)}}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={"timestamp":stat.mtime}}return callback(null,{type:"local",entries:entries})},getRemoteSet:(mount,callback)=>{var entries={};IDBFS.getDB(mount.mountpoint,(err,db)=>{if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=(e=>{callback(this.error);e.preventDefault()});var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=(event=>{var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={"timestamp":cursor.key};cursor.continue()})}catch(e){return callback(e)}})},loadLocalEntry:(path,callback)=>{var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{"timestamp":stat.mtime,"mode":stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{"timestamp":stat.mtime,"mode":stat.mode,"contents":node.contents})}else{return callback(new Error("node type not supported"))}},storeLocalEntry:(path,entry,callback)=>{try{if(FS.isDir(entry["mode"])){FS.mkdirTree(path,entry["mode"])}else if(FS.isFile(entry["mode"])){FS.writeFile(path,entry["contents"],{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry["mode"]);FS.utime(path,entry["timestamp"],entry["timestamp"])}catch(e){return callback(e)}callback(null)},removeLocalEntry:(path,callback)=>{try{var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)},loadRemoteEntry:(store,path,callback)=>{var req=store.get(path);req.onsuccess=(event=>{callback(null,event.target.result)});req.onerror=(e=>{callback(this.error);e.preventDefault()})},storeRemoteEntry:(store,path,entry,callback)=>{try{var req=store.put(entry,path)}catch(e){callback(e);return}req.onsuccess=(()=>{callback(null)});req.onerror=(e=>{callback(this.error);e.preventDefault()})},removeRemoteEntry:(store,path,callback)=>{var req=store.delete(path);req.onsuccess=(()=>{callback(null)});req.onerror=(e=>{callback(this.error);e.preventDefault()})},reconcile:(src,dst,callback)=>{var total=0;var create=[];Object.keys(src.entries).forEach(function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e["timestamp"].getTime()!=e2["timestamp"].getTime()){create.push(key);total++}});var remove=[];Object.keys(dst.entries).forEach(function(key){if(!src.entries[key]){remove.push(key);total++}});if(!total){return callback(null)}var errored=false;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err&&!errored){errored=true;return callback(err)}}transaction.onerror=(e=>{done(this.error);e.preventDefault()});transaction.oncomplete=(e=>{if(!errored){callback(null)}});create.sort().forEach(path=>{if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(err,entry)=>{if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,(err,entry)=>{if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}});remove.sort().reverse().forEach(path=>{if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}})}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH_FS.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count+1});current=lookup.node;if(count++>40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get function(){return this.shared.position},set:function(val){this.shared.position=val}}}}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+="/"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev:(path,mode,dev)=>{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,address,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,address,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"IDBFS":IDBFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;___stdio_exit();for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}},getMode:(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node},createDevice:(parent,name,input,output)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:(stream,buffer,offset,length,pos)=>{for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(29)}}if(length){stream.node.timestamp=Date.now()}return i}});return FS.mkdev(path,mode,dev)},forceLoadFile:obj=>{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});stream_ops.read=((stream,buffer,offset,length,position)=>{FS.forceLoadFile(node);var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size});node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=(()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)});openRequest.onsuccess=(()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=(()=>{ok++;if(ok+fail==total)finish()});putRequest.onerror=(()=>{fail++;if(ok+fail==total)finish()})});transaction.onerror=onerror});openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=(()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=(()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()});getRequest.onerror=(()=>{fail++;if(ok+fail==total)finish()})});transaction.onerror=onerror});openRequest.onerror=onerror}};var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}else{data=new Uint8Array(data)}}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}GROWABLE_HEAP_I32()[arg>>2]=bytes;return 0;default:return 28}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i<peers.length;i++){var peer=sock.peers[peers[i]];try{peer.socket.close()}catch(e){}SOCKFS.websocket_sock_ops.removePeer(sock,peer)}return 0},bind:function(sock,addr,port){if(typeof sock.saddr!="undefined"||typeof sock.sport!="undefined"){throw new FS.ErrnoError(28)}sock.saddr=addr;sock.sport=port;if(sock.type===2){if(sock.server){sock.server.close();sock.server=null}try{sock.sock_ops.listen(sock,0)}catch(e){if(!(e instanceof FS.ErrnoError))throw e;if(e.errno!==138)throw e}}},connect:function(sock,addr,port){if(sock.server){throw new FS.ErrnoError(138)}if(typeof sock.daddr!="undefined"&&typeof sock.dport!="undefined"){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(dest){if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(7)}else{throw new FS.ErrnoError(30)}}}var peer=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port);sock.daddr=peer.addr;sock.dport=peer.port;throw new FS.ErrnoError(26)},listen:function(sock,backlog){if(!ENVIRONMENT_IS_NODE){throw new FS.ErrnoError(138)}},accept:function(listensock){if(!listensock.server||!listensock.pending.length){throw new FS.ErrnoError(28)}var newsock=listensock.pending.shift();newsock.stream.flags=listensock.stream.flags;return newsock},getname:function(sock,peer){var addr,port;if(peer){if(sock.daddr===undefined||sock.dport===undefined){throw new FS.ErrnoError(53)}addr=sock.daddr;port=sock.dport}else{addr=sock.saddr||0;port=sock.sport||0}return{addr:addr,port:port}},sendmsg:function(sock,buffer,offset,length,addr,port){if(sock.type===2){if(addr===undefined||port===undefined){addr=sock.daddr;port=sock.dport}if(addr===undefined||port===undefined){throw new FS.ErrnoError(17)}}else{addr=sock.daddr;port=sock.dport}var dest=SOCKFS.websocket_sock_ops.getPeer(sock,addr,port);if(sock.type===1){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){throw new FS.ErrnoError(53)}else if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(6)}}if(ArrayBuffer.isView(buffer)){offset+=buffer.byteOffset;buffer=buffer.buffer}var data;if(buffer instanceof SharedArrayBuffer){data=new Uint8Array(new Uint8Array(buffer.slice(offset,offset+length))).buffer}else{data=buffer.slice(offset,offset+length)}if(sock.type===2){if(!dest||dest.socket.readyState!==dest.socket.OPEN){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){dest=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port)}dest.dgram_send_queue.push(data);return length}}try{dest.socket.send(data);return length}catch(e){throw new FS.ErrnoError(28)}},recvmsg:function(sock,length){if(sock.type===1&&sock.server){throw new FS.ErrnoError(53)}var queued=sock.recv_queue.shift();if(!queued){if(sock.type===1){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(!dest){throw new FS.ErrnoError(53)}else if(dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){return null}else{throw new FS.ErrnoError(6)}}else{throw new FS.ErrnoError(6)}}var queuedLength=queued.data.byteLength||queued.data.length;var queuedOffset=queued.data.byteOffset||0;var queuedBuffer=queued.data.buffer||queued.data;var bytesRead=Math.min(length,queuedLength);var res={buffer:new Uint8Array(queuedBuffer,queuedOffset,bytesRead),addr:queued.addr,port:queued.port};if(sock.type===1&&bytesRead<queuedLength){var bytesRemaining=queuedLength-bytesRead;queued.data=new Uint8Array(queuedBuffer,queuedOffset+bytesRead,bytesRemaining);sock.recv_queue.unshift(queued)}return res}}};function getSocketFromFD(fd){var socket=SOCKFS.getSocket(fd);if(!socket)throw new FS.ErrnoError(8);return socket}function setErrNo(value){GROWABLE_HEAP_I32()[___errno_location()>>2]=value;return value}function inetPton4(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function jstoi_q(str){return parseInt(str)}function inetPton6(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w<words.length;w++){if(typeof words[w]=="string"){if(words[w]==="Z"){for(z=0;z<8-words.length+1;z++){parts[w+z]=0}offset=z-1}else{parts[w+offset]=_htons(parseInt(words[w],16))}}else{parts[w+offset]=words[w]}}return[parts[1]<<16|parts[0],parts[3]<<16|parts[2],parts[5]<<16|parts[4],parts[7]<<16|parts[6]]}function writeSockaddr(sa,family,addr,port,addrlen){switch(family){case 2:addr=inetPton4(addr);zeroMemory(sa,16);if(addrlen){GROWABLE_HEAP_I32()[addrlen>>2]=16}GROWABLE_HEAP_I16()[sa>>1]=family;GROWABLE_HEAP_I32()[sa+4>>2]=addr;GROWABLE_HEAP_I16()[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){GROWABLE_HEAP_I32()[addrlen>>2]=28}GROWABLE_HEAP_I32()[sa>>2]=family;GROWABLE_HEAP_I32()[sa+8>>2]=addr[0];GROWABLE_HEAP_I32()[sa+12>>2]=addr[1];GROWABLE_HEAP_I32()[sa+16>>2]=addr[2];GROWABLE_HEAP_I32()[sa+20>>2]=addr[3];GROWABLE_HEAP_I16()[sa+2>>1]=_htons(port);break;default:return 5}return 0}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}GROWABLE_HEAP_I32()[buf>>2]=stat.dev;GROWABLE_HEAP_I32()[buf+4>>2]=0;GROWABLE_HEAP_I32()[buf+8>>2]=stat.ino;GROWABLE_HEAP_I32()[buf+12>>2]=stat.mode;GROWABLE_HEAP_I32()[buf+16>>2]=stat.nlink;GROWABLE_HEAP_I32()[buf+20>>2]=stat.uid;GROWABLE_HEAP_I32()[buf+24>>2]=stat.gid;GROWABLE_HEAP_I32()[buf+28>>2]=stat.rdev;GROWABLE_HEAP_I32()[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],GROWABLE_HEAP_I32()[buf+40>>2]=tempI64[0],GROWABLE_HEAP_I32()[buf+44>>2]=tempI64[1];GROWABLE_HEAP_I32()[buf+48>>2]=4096;GROWABLE_HEAP_I32()[buf+52>>2]=stat.blocks;GROWABLE_HEAP_I32()[buf+56>>2]=stat.atime.getTime()/1e3|0;GROWABLE_HEAP_I32()[buf+60>>2]=0;GROWABLE_HEAP_I32()[buf+64>>2]=stat.mtime.getTime()/1e3|0;GROWABLE_HEAP_I32()[buf+68>>2]=0;GROWABLE_HEAP_I32()[buf+72>>2]=stat.ctime.getTime()/1e3|0;GROWABLE_HEAP_I32()[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],GROWABLE_HEAP_I32()[buf+80>>2]=tempI64[0],GROWABLE_HEAP_I32()[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=GROWABLE_HEAP_U8().slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=GROWABLE_HEAP_I32()[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall_accept4(fd,addr,addrlen,flags){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,fd,addr,addrlen,flags);try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function inetNtop4(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function inetNtop6(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word<zstart+longest){if(word===zstart){str+=":";if(zstart===0)str+=":"}continue}}str+=Number(_ntohs(parts[word]&65535)).toString(16);str+=word<7?":":""}return str}function readSockaddr(sa,salen){var family=GROWABLE_HEAP_I16()[sa>>1];var port=_ntohs(GROWABLE_HEAP_U16()[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=GROWABLE_HEAP_I32()[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[GROWABLE_HEAP_I32()[sa+8>>2],GROWABLE_HEAP_I32()[sa+12>>2],GROWABLE_HEAP_I32()[sa+16>>2],GROWABLE_HEAP_I32()[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}}function getSocketAddress(addrp,addrlen,allowNull){if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}function ___syscall_bind(fd,addr,addrlen){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,fd,addr,addrlen);try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_chdir(path){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,path);try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_chmod(path,mode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(6,1,path,mode);try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_connect(fd,addr,addrlen){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(7,1,fd,addr,addrlen);try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_faccessat(dirfd,path,amode,flags){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(8,1,dirfd,path,amode,flags);try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_fcntl64(fd,cmd,varargs){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(9,1,fd,cmd,varargs);SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;GROWABLE_HEAP_I16()[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getcwd(buf,size){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(10,1,buf,size);try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size<cwdLengthInBytes)return-68;stringToUTF8(cwd,buf,size);return cwdLengthInBytes}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getdents64(fd,dirp,count){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(11,1,fd,dirp,count);try{var stream=SYSCALLS.getStreamFromFD(fd);if(!stream.getdents){stream.getdents=FS.readdir(stream.path)}var struct_size=280;var pos=0;var off=FS.llseek(stream,0,1);var idx=Math.floor(off/struct_size);while(idx<stream.getdents.length&&pos+struct_size<=count){var id;var type;var name=stream.getdents[idx];if(name==="."){id=stream.node.id;type=4}else if(name===".."){var lookup=FS.lookupPath(stream.path,{parent:true});id=lookup.node.id;type=4}else{var child=FS.lookupNode(stream.node,name);id=child.id;type=FS.isChrdev(child.mode)?2:FS.isDir(child.mode)?4:FS.isLink(child.mode)?10:8}tempI64=[id>>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],GROWABLE_HEAP_I32()[dirp+pos>>2]=tempI64[0],GROWABLE_HEAP_I32()[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],GROWABLE_HEAP_I32()[dirp+pos+8>>2]=tempI64[0],GROWABLE_HEAP_I32()[dirp+pos+12>>2]=tempI64[1];GROWABLE_HEAP_I16()[dirp+pos+16>>1]=280;GROWABLE_HEAP_I8()[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(12,1,fd,op,varargs);SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();GROWABLE_HEAP_I32()[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_listen(fd,backlog){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(13,1,fd,backlog);try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(14,1,path,buf);try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(15,1,dirfd,path,mode);try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(16,1,dirfd,path,buf,flags);try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~4352;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(17,1,dirfd,path,flags,varargs);SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_poll(fds,nfds,timeout){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(18,1,fds,nfds,timeout);try{var nonzero=0;for(var i=0;i<nfds;i++){var pollfd=fds+8*i;var fd=GROWABLE_HEAP_I32()[pollfd>>2];var events=GROWABLE_HEAP_I16()[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream)}}mask&=events|8|16;if(mask)nonzero++;GROWABLE_HEAP_I16()[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(19,1,dirfd,path,buf,bufsize);try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=GROWABLE_HEAP_I8()[buf+len];stringToUTF8(ret,buf,bufsize+1);GROWABLE_HEAP_I8()[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(20,1,fd,buf,len,flags,addr,addrlen);try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}GROWABLE_HEAP_U8().set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(21,1,olddirfd,oldpath,newdirfd,newpath);try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_rmdir(path){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(22,1,path);try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_sendto(fd,message,length,flags,addr,addr_len){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(23,1,fd,message,length,flags,addr,addr_len);try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,GROWABLE_HEAP_I8(),message,length)}else{return sock.sock_ops.sendmsg(sock,GROWABLE_HEAP_I8(),message,length,dest.addr,dest.port)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_socket(domain,type,protocol){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(24,1,domain,type,protocol);try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_stat64(path,buf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(25,1,path,buf);try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_statfs64(path,size,buf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(26,1,path,size,buf);try{path=SYSCALLS.getStr(path);GROWABLE_HEAP_I32()[buf+4>>2]=4096;GROWABLE_HEAP_I32()[buf+40>>2]=4096;GROWABLE_HEAP_I32()[buf+8>>2]=1e6;GROWABLE_HEAP_I32()[buf+12>>2]=5e5;GROWABLE_HEAP_I32()[buf+16>>2]=5e5;GROWABLE_HEAP_I32()[buf+20>>2]=FS.nextInode;GROWABLE_HEAP_I32()[buf+24>>2]=1e6;GROWABLE_HEAP_I32()[buf+28>>2]=42;GROWABLE_HEAP_I32()[buf+44>>2]=2;GROWABLE_HEAP_I32()[buf+36>>2]=255;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_symlink(target,linkpath){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(27,1,target,linkpath);try{target=SYSCALLS.getStr(target);linkpath=SYSCALLS.getStr(linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(28,1,dirfd,path,flags);try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function __dlinit(main_dso_handle){}var dlopenMissingError="To use dlopen, you need enable dynamic linking, see https://github.com/emscripten-core/emscripten/wiki/Linking";function __dlopen_js(filename,flag){abort(dlopenMissingError)}function __dlsym_js(handle,symbol){abort(dlopenMissingError)}function __emscripten_date_now(){return Date.now()}function __emscripten_default_pthread_stack_size(){return 2097152}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function executeNotifiedProxyingQueue(queue){Atomics.store(GROWABLE_HEAP_I32(),queue>>2,1);if(_pthread_self()){__emscripten_proxy_execute_task_queue(queue)}Atomics.compareExchange(GROWABLE_HEAP_I32(),queue>>2,1,0)}Module["executeNotifiedProxyingQueue"]=executeNotifiedProxyingQueue;function __emscripten_notify_task_queue(targetThreadId,currThreadId,mainThreadId,queue){if(targetThreadId==currThreadId){setTimeout(()=>executeNotifiedProxyingQueue(queue))}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processProxyingQueue","queue":queue})}else{var pthread=PThread.pthreads[targetThreadId];var worker=pthread&&pthread.worker;if(!worker){return}worker.postMessage({"cmd":"processProxyingQueue","queue":queue})}return 1}function __emscripten_proxied_gl_context_activated_from_main_browser_thread(contextHandle){GLctx=Module.ctx=GL.currentContext=contextHandle;GL.currentContextIsProxied=true}function __emscripten_set_offscreencanvas_size(target,width,height){return-1}function __emscripten_throw_longjmp(){throw Infinity}function __gmtime_js(time,tmPtr){var date=new Date(GROWABLE_HEAP_I32()[time>>2]*1e3);GROWABLE_HEAP_I32()[tmPtr>>2]=date.getUTCSeconds();GROWABLE_HEAP_I32()[tmPtr+4>>2]=date.getUTCMinutes();GROWABLE_HEAP_I32()[tmPtr+8>>2]=date.getUTCHours();GROWABLE_HEAP_I32()[tmPtr+12>>2]=date.getUTCDate();GROWABLE_HEAP_I32()[tmPtr+16>>2]=date.getUTCMonth();GROWABLE_HEAP_I32()[tmPtr+20>>2]=date.getUTCFullYear()-1900;GROWABLE_HEAP_I32()[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;GROWABLE_HEAP_I32()[tmPtr+28>>2]=yday}function __localtime_js(time,tmPtr){var date=new Date(GROWABLE_HEAP_I32()[time>>2]*1e3);GROWABLE_HEAP_I32()[tmPtr>>2]=date.getSeconds();GROWABLE_HEAP_I32()[tmPtr+4>>2]=date.getMinutes();GROWABLE_HEAP_I32()[tmPtr+8>>2]=date.getHours();GROWABLE_HEAP_I32()[tmPtr+12>>2]=date.getDate();GROWABLE_HEAP_I32()[tmPtr+16>>2]=date.getMonth();GROWABLE_HEAP_I32()[tmPtr+20>>2]=date.getFullYear()-1900;GROWABLE_HEAP_I32()[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;GROWABLE_HEAP_I32()[tmPtr+28>>2]=yday;GROWABLE_HEAP_I32()[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;GROWABLE_HEAP_I32()[tmPtr+32>>2]=dst}function _tzset_impl(timezone,daylight,tzname){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(29,1,timezone,daylight,tzname);var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);GROWABLE_HEAP_I32()[timezone>>2]=stdTimezoneOffset*60;GROWABLE_HEAP_I32()[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset<winterOffset){GROWABLE_HEAP_I32()[tzname>>2]=winterNamePtr;GROWABLE_HEAP_I32()[tzname+4>>2]=summerNamePtr}else{GROWABLE_HEAP_I32()[tzname>>2]=summerNamePtr;GROWABLE_HEAP_I32()[tzname+4>>2]=winterNamePtr}}function __tzset_js(timezone,daylight,tzname){if(__tzset_js.called)return;__tzset_js.called=true;_tzset_impl(timezone,daylight,tzname)}function _abort(){abort("")}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){runtimeKeepalivePush();Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=function(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}var _emscripten_get_now;if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=(()=>performance.now()-Module["__performance_now_clock_drift"])}else _emscripten_get_now=(()=>performance.now());function runtimeKeepalivePush(){runtimeKeepaliveCounter+=1}function maybeExit(){if(!keepRuntimeAlive()){try{if(ENVIRONMENT_IS_PTHREAD)__emscripten_thread_exit(EXITSTATUS);else _exit(EXITSTATUS)}catch(e){handleException(e)}}}function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop){runtimeKeepalivePop();maybeExit();return false}return true}Browser.mainLoop.running=false;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}out('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}function callUserCallback(func,synchronous){if(runtimeExited||ABORT){return}if(synchronous){func();return}try{func();maybeExit()}catch(e){handleException(e)}}function runtimeKeepalivePop(){runtimeKeepaliveCounter-=1}function safeSetTimeout(func,timeout){runtimeKeepalivePush();return setTimeout(function(){runtimeKeepalivePop();callUserCallback(func)},timeout)}var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining<expected){Module["setStatus"](message+" ("+(expected-remaining)+"/"+expected+")")}else{Module["setStatus"](message)}}else{Module["setStatus"]("")}}},runIter:function(func){if(ABORT)return;if(Module["preMainLoop"]){var preRet=Module["preMainLoop"]();if(preRet===false){return}}callUserCallback(func);if(Module["postMainLoop"])Module["postMainLoop"]()}},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function(){if(!Module["preloadPlugins"])Module["preloadPlugins"]=[];if(Browser.initted)return;Browser.initted=true;try{new Blob;Browser.hasBlobConstructor=true}catch(e){Browser.hasBlobConstructor=false;out("warning: no blob constructor, cannot create blobs with mimetypes")}Browser.BlobBuilder=typeof MozBlobBuilder!="undefined"?MozBlobBuilder:typeof WebKitBlobBuilder!="undefined"?WebKitBlobBuilder:!Browser.hasBlobConstructor?out("warning: no BlobBuilder"):null;Browser.URLObject=typeof window!="undefined"?window.URL?window.URL:window.webkitURL:undefined;if(!Module.noImageDecoding&&typeof Browser.URLObject=="undefined"){out("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");Module.noImageDecoding=true}var imagePlugin={};imagePlugin["canHandle"]=function imagePlugin_canHandle(name){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(name)};imagePlugin["handle"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=null;if(Browser.hasBlobConstructor){try{b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([new Uint8Array(byteArray).buffer],{type:Browser.getMimetype(name)})}}catch(e){warnOnce("Blob constructor present but fails: "+e+"; falling back to blob builder")}}if(!b){var bb=new Browser.BlobBuilder;bb.append(new Uint8Array(byteArray).buffer);b=bb.getBlob()}var url=Browser.URLObject.createObjectURL(b);var img=new Image;img.onload=(()=>{assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)});img.onerror=(event=>{out("Image "+url+" could not be decoded");if(onerror)onerror()});img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;preloadedAudios[name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",function(){finish(audio)},false);audio.onerror=function audio_onerror(event){if(done)return;out("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i<data.length;i++){leftchar=leftchar<<8|data[i];leftbits+=8;while(leftbits>=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout(function(){finish(audio)},1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||function(){};canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||function(){};canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},handledByPreloadPlugin:function(byteArray,fullname,finish,onerror){Browser.init();var handled=false;Module["preloadPlugins"].forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:typeof WebGL2RenderingContext!="undefined"?2:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null)||(canvasContainer["webkitRequestFullScreen"]?function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||function(){};CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeSetTimeout:function(func){return safeSetTimeout(func)},safeRequestAnimationFrame:function(func){runtimeKeepalivePush();return Browser.requestAnimationFrame(function(){runtimeKeepalivePop();callUserCallback(func)})},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(function(listener){listener(canvas.width,canvas.height)})},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=GROWABLE_HEAP_U32()[SDL.screen>>2];flags=flags|8388608;GROWABLE_HEAP_I32()[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=GROWABLE_HEAP_U32()[SDL.screen>>2];flags=flags&~8388608;GROWABLE_HEAP_I32()[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h<Module["forcedAspectRatio"]){w=Math.round(h*Module["forcedAspectRatio"])}else{h=Math.round(w/Module["forcedAspectRatio"])}}if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvas.parentNode&&typeof screen!="undefined"){var factor=Math.min(screen.width/w,screen.height/h);w=Math.round(w*factor);h=Math.round(h*factor)}if(Browser.resizeCanvas){if(canvas.width!=w)canvas.width=w;if(canvas.height!=h)canvas.height=h;if(typeof canvas.style!="undefined"){canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}else{if(canvas.width!=wNative)canvas.width=wNative;if(canvas.height!=hNative)canvas.height=hNative;if(typeof canvas.style!="undefined"){if(w!=wNative||h!=hNative){canvas.style.setProperty("width",w+"px","important");canvas.style.setProperty("height",h+"px","important")}else{canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}}}};function _emscripten_cancel_main_loop(){Browser.mainLoop.pause();Browser.mainLoop.func=null}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function _emscripten_console_error(str){console.error(UTF8ToString(str))}function _emscripten_force_exit(status){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(30,1,status);noExitRuntime=false;runtimeKeepaliveCounter=0;exit(status)}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}function __webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(ctx){return!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"))}function __webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(ctx){return!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"))}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],stringCache:{},stringiCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i<ret;i++){table[i]=null}return ret},getSource:function(shader,count,string,length){var source="";for(var i=0;i<count;++i){var len=length?GROWABLE_HEAP_I32()[length+i*4>>2]:-1;source+=UTF8ToString(GROWABLE_HEAP_I32()[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(webGLContextAttributes.renderViaOffscreenBackBuffer)webGLContextAttributes["preserveDrawingBuffer"]=true;if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=webGLContextAttributes.majorVersion>1?canvas.getContext("webgl2",webGLContextAttributes):canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},enableOffscreenFramebufferAttributes:function(webGLContextAttributes){webGLContextAttributes.renderViaOffscreenBackBuffer=true;webGLContextAttributes.preserveDrawingBuffer=true},createOffscreenFramebuffer:function(context){var gl=context.GLctx;var fbo=gl.createFramebuffer();gl.bindFramebuffer(36160,fbo);context.defaultFbo=fbo;context.defaultFboForbidBlitFramebuffer=false;if(gl.getContextAttributes().antialias){context.defaultFboForbidBlitFramebuffer=true}else{var firefoxMatch=navigator.userAgent.toLowerCase().match(/firefox\/(\d\d)/);if(firefoxMatch!=null){var firefoxVersion=firefoxMatch[1];context.defaultFboForbidBlitFramebuffer=firefoxVersion<67}}context.defaultColorTarget=gl.createTexture();context.defaultDepthTarget=gl.createRenderbuffer();GL.resizeOffscreenFramebuffer(context);gl.bindTexture(3553,context.defaultColorTarget);gl.texParameteri(3553,10241,9728);gl.texParameteri(3553,10240,9728);gl.texParameteri(3553,10242,33071);gl.texParameteri(3553,10243,33071);gl.texImage2D(3553,0,6408,gl.canvas.width,gl.canvas.height,0,6408,5121,null);gl.framebufferTexture2D(36160,36064,3553,context.defaultColorTarget,0);gl.bindTexture(3553,null);var depthTarget=gl.createRenderbuffer();gl.bindRenderbuffer(36161,context.defaultDepthTarget);gl.renderbufferStorage(36161,33189,gl.canvas.width,gl.canvas.height);gl.framebufferRenderbuffer(36160,36096,36161,context.defaultDepthTarget);gl.bindRenderbuffer(36161,null);var vertices=[-1,-1,-1,1,1,-1,1,1];var vb=gl.createBuffer();gl.bindBuffer(34962,vb);gl.bufferData(34962,new Float32Array(vertices),35044);gl.bindBuffer(34962,null);context.blitVB=vb;var vsCode="attribute vec2 pos;"+"varying lowp vec2 tex;"+"void main() { tex = pos * 0.5 + vec2(0.5,0.5); gl_Position = vec4(pos, 0.0, 1.0); }";var vs=gl.createShader(35633);gl.shaderSource(vs,vsCode);gl.compileShader(vs);var fsCode="varying lowp vec2 tex;"+"uniform sampler2D sampler;"+"void main() { gl_FragColor = texture2D(sampler, tex); }";var fs=gl.createShader(35632);gl.shaderSource(fs,fsCode);gl.compileShader(fs);var blitProgram=gl.createProgram();gl.attachShader(blitProgram,vs);gl.attachShader(blitProgram,fs);gl.linkProgram(blitProgram);context.blitProgram=blitProgram;context.blitPosLoc=gl.getAttribLocation(blitProgram,"pos");gl.useProgram(blitProgram);gl.uniform1i(gl.getUniformLocation(blitProgram,"sampler"),0);gl.useProgram(null);context.defaultVao=undefined;if(gl.createVertexArray){context.defaultVao=gl.createVertexArray();gl.bindVertexArray(context.defaultVao);gl.enableVertexAttribArray(context.blitPosLoc);gl.bindVertexArray(null)}},resizeOffscreenFramebuffer:function(context){var gl=context.GLctx;if(context.defaultColorTarget){var prevTextureBinding=gl.getParameter(32873);gl.bindTexture(3553,context.defaultColorTarget);gl.texImage2D(3553,0,6408,gl.drawingBufferWidth,gl.drawingBufferHeight,0,6408,5121,null);gl.bindTexture(3553,prevTextureBinding)}if(context.defaultDepthTarget){var prevRenderBufferBinding=gl.getParameter(36007);gl.bindRenderbuffer(36161,context.defaultDepthTarget);gl.renderbufferStorage(36161,33189,gl.drawingBufferWidth,gl.drawingBufferHeight);gl.bindRenderbuffer(36161,prevRenderBufferBinding)}},blitOffscreenFramebuffer:function(context){var gl=context.GLctx;var prevScissorTest=gl.getParameter(3089);if(prevScissorTest)gl.disable(3089);var prevFbo=gl.getParameter(36006);if(gl.blitFramebuffer&&!context.defaultFboForbidBlitFramebuffer){gl.bindFramebuffer(36008,context.defaultFbo);gl.bindFramebuffer(36009,null);gl.blitFramebuffer(0,0,gl.canvas.width,gl.canvas.height,0,0,gl.canvas.width,gl.canvas.height,16384,9728)}else{gl.bindFramebuffer(36160,null);var prevProgram=gl.getParameter(35725);gl.useProgram(context.blitProgram);var prevVB=gl.getParameter(34964);gl.bindBuffer(34962,context.blitVB);var prevActiveTexture=gl.getParameter(34016);gl.activeTexture(33984);var prevTextureBinding=gl.getParameter(32873);gl.bindTexture(3553,context.defaultColorTarget);var prevBlend=gl.getParameter(3042);if(prevBlend)gl.disable(3042);var prevCullFace=gl.getParameter(2884);if(prevCullFace)gl.disable(2884);var prevDepthTest=gl.getParameter(2929);if(prevDepthTest)gl.disable(2929);var prevStencilTest=gl.getParameter(2960);if(prevStencilTest)gl.disable(2960);function draw(){gl.vertexAttribPointer(context.blitPosLoc,2,5126,false,0,0);gl.drawArrays(5,0,4)}if(context.defaultVao){var prevVAO=gl.getParameter(34229);gl.bindVertexArray(context.defaultVao);draw();gl.bindVertexArray(prevVAO)}else{var prevVertexAttribPointer={buffer:gl.getVertexAttrib(context.blitPosLoc,34975),size:gl.getVertexAttrib(context.blitPosLoc,34339),stride:gl.getVertexAttrib(context.blitPosLoc,34340),type:gl.getVertexAttrib(context.blitPosLoc,34341),normalized:gl.getVertexAttrib(context.blitPosLoc,34922),pointer:gl.getVertexAttribOffset(context.blitPosLoc,34373)};var maxVertexAttribs=gl.getParameter(34921);var prevVertexAttribEnables=[];for(var i=0;i<maxVertexAttribs;++i){var prevEnabled=gl.getVertexAttrib(i,34338);var wantEnabled=i==context.blitPosLoc;if(prevEnabled&&!wantEnabled){gl.disableVertexAttribArray(i)}if(!prevEnabled&&wantEnabled){gl.enableVertexAttribArray(i)}prevVertexAttribEnables[i]=prevEnabled}draw();for(var i=0;i<maxVertexAttribs;++i){var prevEnabled=prevVertexAttribEnables[i];var nowEnabled=i==context.blitPosLoc;if(prevEnabled&&!nowEnabled){gl.enableVertexAttribArray(i)}if(!prevEnabled&&nowEnabled){gl.disableVertexAttribArray(i)}}gl.bindBuffer(34962,prevVertexAttribPointer.buffer);gl.vertexAttribPointer(context.blitPosLoc,prevVertexAttribPointer.size,prevVertexAttribPointer.type,prevVertexAttribPointer.normalized,prevVertexAttribPointer.stride,prevVertexAttribPointer.offset)}if(prevStencilTest)gl.enable(2960);if(prevDepthTest)gl.enable(2929);if(prevCullFace)gl.enable(2884);if(prevBlend)gl.enable(3042);gl.bindTexture(3553,prevTextureBinding);gl.activeTexture(prevActiveTexture);gl.bindBuffer(34962,prevVB);gl.useProgram(prevProgram)}gl.bindFramebuffer(36160,prevFbo);if(prevScissorTest)gl.enable(3089)},registerContext:function(ctx,webGLContextAttributes){var handle=_malloc(8);GROWABLE_HEAP_I32()[handle+4>>2]=_pthread_self();var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}if(webGLContextAttributes.renderViaOffscreenBackBuffer)GL.createOffscreenFramebuffer(context);return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents=="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);__webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);__webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(context.version>=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};function _emscripten_glActiveTexture(x0){GLctx["activeTexture"](x0)}function _emscripten_glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glBeginQuery(target,id){GLctx["beginQuery"](target,GL.queries[id])}function _emscripten_glBeginQueryEXT(target,id){GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.queries[id])}function _emscripten_glBeginTransformFeedback(x0){GLctx["beginTransformFeedback"](x0)}function _emscripten_glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}function _emscripten_glBindBuffer(target,buffer){if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _emscripten_glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _emscripten_glBindBufferRange(target,index,buffer,offset,ptrsize){GLctx["bindBufferRange"](target,index,GL.buffers[buffer],offset,ptrsize)}function _emscripten_glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,framebuffer?GL.framebuffers[framebuffer]:GL.currentContext.defaultFbo)}function _emscripten_glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _emscripten_glBindSampler(unit,sampler){GLctx["bindSampler"](unit,GL.samplers[sampler])}function _emscripten_glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _emscripten_glBindTransformFeedback(target,id){GLctx["bindTransformFeedback"](target,GL.transformFeedbacks[id])}function _emscripten_glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _emscripten_glBlendColor(x0,x1,x2,x3){GLctx["blendColor"](x0,x1,x2,x3)}function _emscripten_glBlendEquation(x0){GLctx["blendEquation"](x0)}function _emscripten_glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _emscripten_glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}function _emscripten_glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _emscripten_glBufferData(target,size,data,usage){if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,GROWABLE_HEAP_U8(),usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?GROWABLE_HEAP_U8().subarray(data,data+size):size,usage)}}function _emscripten_glBufferSubData(target,offset,size,data){if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,GROWABLE_HEAP_U8(),data,size);return}GLctx.bufferSubData(target,offset,GROWABLE_HEAP_U8().subarray(data,data+size))}function _emscripten_glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}function _emscripten_glClear(x0){GLctx["clear"](x0)}function _emscripten_glClearBufferfi(x0,x1,x2,x3){GLctx["clearBufferfi"](x0,x1,x2,x3)}function _emscripten_glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,GROWABLE_HEAP_F32(),value>>2)}function _emscripten_glClearBufferiv(buffer,drawbuffer,value){GLctx["clearBufferiv"](buffer,drawbuffer,GROWABLE_HEAP_I32(),value>>2)}function _emscripten_glClearBufferuiv(buffer,drawbuffer,value){GLctx["clearBufferuiv"](buffer,drawbuffer,GROWABLE_HEAP_U32(),value>>2)}function _emscripten_glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _emscripten_glClearDepthf(x0){GLctx["clearDepth"](x0)}function _emscripten_glClearStencil(x0){GLctx["clearStencil"](x0)}function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}function _emscripten_glClientWaitSync(sync,flags,timeoutLo,timeoutHi){return GLctx.clientWaitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _emscripten_glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _emscripten_glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _emscripten_glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,imageSize,data)}else{GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,GROWABLE_HEAP_U8(),data,imageSize)}return}GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?GROWABLE_HEAP_U8().subarray(data,data+imageSize):null)}function _emscripten_glCompressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexImage3D"](target,level,internalFormat,width,height,depth,border,imageSize,data)}else{GLctx["compressedTexImage3D"](target,level,internalFormat,width,height,depth,border,GROWABLE_HEAP_U8(),data,imageSize)}}function _emscripten_glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,GROWABLE_HEAP_U8(),data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?GROWABLE_HEAP_U8().subarray(data,data+imageSize):null)}function _emscripten_glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,GROWABLE_HEAP_U8(),data,imageSize)}}function _emscripten_glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _emscripten_glCopyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCopyTexSubImage3D(x0,x1,x2,x3,x4,x5,x6,x7,x8){GLctx["copyTexSubImage3D"](x0,x1,x2,x3,x4,x5,x6,x7,x8)}function _emscripten_glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _emscripten_glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _emscripten_glCullFace(x0){GLctx["cullFace"](x0)}function _emscripten_glDeleteBuffers(n,buffers){for(var i=0;i<n;i++){var id=GROWABLE_HEAP_I32()[buffers+i*4>>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _emscripten_glDeleteFramebuffers(n,framebuffers){for(var i=0;i<n;++i){var id=GROWABLE_HEAP_I32()[framebuffers+i*4>>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _emscripten_glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _emscripten_glDeleteQueries(n,ids){for(var i=0;i<n;i++){var id=GROWABLE_HEAP_I32()[ids+i*4>>2];var query=GL.queries[id];if(!query)continue;GLctx["deleteQuery"](query);GL.queries[id]=null}}function _emscripten_glDeleteQueriesEXT(n,ids){for(var i=0;i<n;i++){var id=GROWABLE_HEAP_I32()[ids+i*4>>2];var query=GL.queries[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.queries[id]=null}}function _emscripten_glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i<n;i++){var id=GROWABLE_HEAP_I32()[renderbuffers+i*4>>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _emscripten_glDeleteSamplers(n,samplers){for(var i=0;i<n;i++){var id=GROWABLE_HEAP_I32()[samplers+i*4>>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx["deleteSampler"](sampler);sampler.name=0;GL.samplers[id]=null}}function _emscripten_glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _emscripten_glDeleteSync(id){if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null}function _emscripten_glDeleteTextures(n,textures){for(var i=0;i<n;i++){var id=GROWABLE_HEAP_I32()[textures+i*4>>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _emscripten_glDeleteTransformFeedbacks(n,ids){for(var i=0;i<n;i++){var id=GROWABLE_HEAP_I32()[ids+i*4>>2];var transformFeedback=GL.transformFeedbacks[id];if(!transformFeedback)continue;GLctx["deleteTransformFeedback"](transformFeedback);transformFeedback.name=0;GL.transformFeedbacks[id]=null}}function _emscripten_glDeleteVertexArrays(n,vaos){for(var i=0;i<n;i++){var id=GROWABLE_HEAP_I32()[vaos+i*4>>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _emscripten_glDepthFunc(x0){GLctx["depthFunc"](x0)}function _emscripten_glDepthMask(flag){GLctx.depthMask(!!flag)}function _emscripten_glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}function _emscripten_glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glDisable(x0){GLctx["disable"](x0)}function _emscripten_glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _emscripten_glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _emscripten_glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}var tempFixedLengthArray=[];function _emscripten_glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i<n;i++){bufArray[i]=GROWABLE_HEAP_I32()[bufs+i*4>>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawRangeElements(mode,start,end,count,type,indices){_glDrawElements(mode,count,type,indices)}function _emscripten_glEnable(x0){GLctx["enable"](x0)}function _emscripten_glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _emscripten_glEndQuery(x0){GLctx["endQuery"](x0)}function _emscripten_glEndQueryEXT(target){GLctx.disjointTimerQueryExt["endQueryEXT"](target)}function _emscripten_glEndTransformFeedback(){GLctx["endTransformFeedback"]()}function _emscripten_glFenceSync(condition,flags){var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}else{return 0}}function _emscripten_glFinish(){GLctx["finish"]()}function _emscripten_glFlush(){GLctx["flush"]()}function _emscripten_glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _emscripten_glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _emscripten_glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _emscripten_glFrontFace(x0){GLctx["frontFace"](x0)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i<n;i++){var buffer=GLctx[createFunction]();var id=buffer&&GL.getNewId(objectTable);if(buffer){buffer.name=id;objectTable[id]=buffer}else{GL.recordError(1282)}GROWABLE_HEAP_I32()[buffers+i*4>>2]=id}}function _emscripten_glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _emscripten_glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _emscripten_glGenQueries(n,ids){__glGenObject(n,ids,"createQuery",GL.queries)}function _emscripten_glGenQueriesEXT(n,ids){for(var i=0;i<n;i++){var query=GLctx.disjointTimerQueryExt["createQueryEXT"]();if(!query){GL.recordError(1282);while(i<n)GROWABLE_HEAP_I32()[ids+i++*4>>2]=0;return}var id=GL.getNewId(GL.queries);query.name=id;GL.queries[id]=query;GROWABLE_HEAP_I32()[ids+i*4>>2]=id}}function _emscripten_glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _emscripten_glGenSamplers(n,samplers){__glGenObject(n,samplers,"createSampler",GL.samplers)}function _emscripten_glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _emscripten_glGenTransformFeedbacks(n,ids){__glGenObject(n,ids,"createTransformFeedback",GL.transformFeedbacks)}function _emscripten_glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _emscripten_glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function __glGetActiveAttribOrUniform(funcName,program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull;if(size)GROWABLE_HEAP_I32()[size>>2]=info.size;if(type)GROWABLE_HEAP_I32()[type>>2]=info.type}}function _emscripten_glGetActiveAttrib(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)}function _emscripten_glGetActiveUniform(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)}function _emscripten_glGetActiveUniformBlockName(program,uniformBlockIndex,bufSize,length,uniformBlockName){program=GL.programs[program];var result=GLctx["getActiveUniformBlockName"](program,uniformBlockIndex);if(!result)return;if(uniformBlockName&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(result,uniformBlockName,bufSize);if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull}else{if(length)GROWABLE_HEAP_I32()[length>>2]=0}}function _emscripten_glGetActiveUniformBlockiv(program,uniformBlockIndex,pname,params){if(!params){GL.recordError(1281);return}program=GL.programs[program];if(pname==35393){var name=GLctx["getActiveUniformBlockName"](program,uniformBlockIndex);GROWABLE_HEAP_I32()[params>>2]=name.length+1;return}var result=GLctx["getActiveUniformBlockParameter"](program,uniformBlockIndex,pname);if(result===null)return;if(pname==35395){for(var i=0;i<result.length;i++){GROWABLE_HEAP_I32()[params+i*4>>2]=result[i]}}else{GROWABLE_HEAP_I32()[params>>2]=result}}function _emscripten_glGetActiveUniformsiv(program,uniformCount,uniformIndices,pname,params){if(!params){GL.recordError(1281);return}if(uniformCount>0&&uniformIndices==0){GL.recordError(1281);return}program=GL.programs[program];var ids=[];for(var i=0;i<uniformCount;i++){ids.push(GROWABLE_HEAP_I32()[uniformIndices+i*4>>2])}var result=GLctx["getActiveUniforms"](program,ids,pname);if(!result)return;var len=result.length;for(var i=0;i<len;i++){GROWABLE_HEAP_I32()[params+i*4>>2]=result[i]}}function _emscripten_glGetAttachedShaders(program,maxCount,count,shaders){var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}GROWABLE_HEAP_I32()[count>>2]=len;for(var i=0;i<len;++i){var id=GL.shaders.indexOf(result[i]);GROWABLE_HEAP_I32()[shaders+i*4>>2]=id}}function _emscripten_glGetAttribLocation(program,name){return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}function writeI53ToI64(ptr,num){GROWABLE_HEAP_U32()[ptr>>2]=num;GROWABLE_HEAP_U32()[ptr+4>>2]=(num-GROWABLE_HEAP_U32()[ptr>>2])/4294967296}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i<result.length;++i){switch(type){case 0:GROWABLE_HEAP_I32()[p+i*4>>2]=result[i];break;case 2:GROWABLE_HEAP_F32()[p+i*4>>2]=result[i];break;case 4:GROWABLE_HEAP_I8()[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:GROWABLE_HEAP_I32()[p>>2]=ret;break;case 2:GROWABLE_HEAP_F32()[p>>2]=ret;break;case 4:GROWABLE_HEAP_I8()[p>>0]=ret?1:0;break}}function _emscripten_glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,4)}function _emscripten_glGetBufferParameteri64v(target,value,data){if(!data){GL.recordError(1281);return}writeI53ToI64(data,GLctx.getBufferParameter(target,value))}function _emscripten_glGetBufferParameteriv(target,value,data){if(!data){GL.recordError(1281);return}GROWABLE_HEAP_I32()[data>>2]=GLctx.getBufferParameter(target,value)}function _emscripten_glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function _emscripten_glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _emscripten_glGetFragDataLocation(program,name){return GLctx["getFragDataLocation"](GL.programs[program],UTF8ToString(name))}function _emscripten_glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}GROWABLE_HEAP_I32()[params>>2]=result}function emscriptenWebGLGetIndexed(target,index,data,type){if(!data){GL.recordError(1281);return}var result=GLctx["getIndexedParameter"](target,index);var ret;switch(typeof result){case"boolean":ret=result?1:0;break;case"number":ret=result;break;case"object":if(result===null){switch(target){case 35983:case 35368:ret=0;break;default:{GL.recordError(1280);return}}}else if(result instanceof WebGLBuffer){ret=result.name|0}else{GL.recordError(1280);return}break;default:GL.recordError(1280);return}switch(type){case 1:writeI53ToI64(data,ret);break;case 0:GROWABLE_HEAP_I32()[data>>2]=ret;break;case 2:GROWABLE_HEAP_F32()[data>>2]=ret;break;case 4:GROWABLE_HEAP_I8()[data>>0]=ret?1:0;break;default:throw"internal emscriptenWebGLGetIndexed() error, bad type: "+type}}function _emscripten_glGetInteger64i_v(target,index,data){emscriptenWebGLGetIndexed(target,index,data,1)}function _emscripten_glGetInteger64v(name_,p){emscriptenWebGLGet(name_,p,1)}function _emscripten_glGetIntegeri_v(target,index,data){emscriptenWebGLGetIndexed(target,index,data,0)}function _emscripten_glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _emscripten_glGetInternalformativ(target,internalformat,pname,bufSize,params){if(bufSize<0){GL.recordError(1281);return}if(!params){GL.recordError(1281);return}var ret=GLctx["getInternalformatParameter"](target,internalformat,pname);if(ret===null)return;for(var i=0;i<ret.length&&i<bufSize;++i){GROWABLE_HEAP_I32()[params+i*4>>2]=ret[i]}}function _emscripten_glGetProgramBinary(program,bufSize,length,binaryFormat,binary){GL.recordError(1282)}function _emscripten_glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";GROWABLE_HEAP_I32()[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i<GLctx.getProgramParameter(program,35718);++i){program.maxUniformLength=Math.max(program.maxUniformLength,GLctx.getActiveUniform(program,i).name.length+1)}}GROWABLE_HEAP_I32()[p>>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i<GLctx.getProgramParameter(program,35721);++i){program.maxAttributeLength=Math.max(program.maxAttributeLength,GLctx.getActiveAttrib(program,i).name.length+1)}}GROWABLE_HEAP_I32()[p>>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i<GLctx.getProgramParameter(program,35382);++i){program.maxUniformBlockNameLength=Math.max(program.maxUniformBlockNameLength,GLctx.getActiveUniformBlockName(program,i).length+1)}}GROWABLE_HEAP_I32()[p>>2]=program.maxUniformBlockNameLength}else{GROWABLE_HEAP_I32()[p>>2]=GLctx.getProgramParameter(program,pname)}}function _emscripten_glGetQueryObjecti64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;if(GL.currentContext.version<2){param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}else{param=GLctx["getQueryParameter"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}GROWABLE_HEAP_I32()[params>>2]=ret}function _emscripten_glGetQueryObjectui64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;if(GL.currentContext.version<2){param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}else{param=GLctx["getQueryParameter"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectuiv(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx["getQueryParameter"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}GROWABLE_HEAP_I32()[params>>2]=ret}function _emscripten_glGetQueryObjectuivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}GROWABLE_HEAP_I32()[params>>2]=ret}function _emscripten_glGetQueryiv(target,pname,params){if(!params){GL.recordError(1281);return}GROWABLE_HEAP_I32()[params>>2]=GLctx["getQuery"](target,pname)}function _emscripten_glGetQueryivEXT(target,pname,params){if(!params){GL.recordError(1281);return}GROWABLE_HEAP_I32()[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)}function _emscripten_glGetRenderbufferParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}GROWABLE_HEAP_I32()[params>>2]=GLctx.getRenderbufferParameter(target,pname)}function _emscripten_glGetSamplerParameterfv(sampler,pname,params){if(!params){GL.recordError(1281);return}GROWABLE_HEAP_F32()[params>>2]=GLctx["getSamplerParameter"](GL.samplers[sampler],pname)}function _emscripten_glGetSamplerParameteriv(sampler,pname,params){if(!params){GL.recordError(1281);return}GROWABLE_HEAP_I32()[params>>2]=GLctx["getSamplerParameter"](GL.samplers[sampler],pname)}function _emscripten_glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderPrecisionFormat(shaderType,precisionType,range,precision){var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);GROWABLE_HEAP_I32()[range>>2]=result.rangeMin;GROWABLE_HEAP_I32()[range+4>>2]=result.rangeMax;GROWABLE_HEAP_I32()[precision>>2]=result.precision}function _emscripten_glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;GROWABLE_HEAP_I32()[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;GROWABLE_HEAP_I32()[p>>2]=sourceLength}else{GROWABLE_HEAP_I32()[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(GL.currentContext.version>=2)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _emscripten_glGetStringi(name,index){if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));exts=exts.map(function(e){return stringToNewUTF8(e)});stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}}function _emscripten_glGetSynciv(sync,pname,bufSize,length,values){if(bufSize<0){GL.recordError(1281);return}if(!values){GL.recordError(1281);return}var ret=GLctx.getSyncParameter(GL.syncs[sync],pname);if(ret!==null){GROWABLE_HEAP_I32()[values>>2]=ret;if(length)GROWABLE_HEAP_I32()[length>>2]=1}}function _emscripten_glGetTexParameterfv(target,pname,params){if(!params){GL.recordError(1281);return}GROWABLE_HEAP_F32()[params>>2]=GLctx.getTexParameter(target,pname)}function _emscripten_glGetTexParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}GROWABLE_HEAP_I32()[params>>2]=GLctx.getTexParameter(target,pname)}function _emscripten_glGetTransformFeedbackVarying(program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx["getTransformFeedbackVarying"](program,index);if(!info)return;if(name&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(info.name,name,bufSize);if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull}else{if(length)GROWABLE_HEAP_I32()[length>>2]=0}if(size)GROWABLE_HEAP_I32()[size>>2]=info.size;if(type)GROWABLE_HEAP_I32()[type>>2]=info.type}function _emscripten_glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function _emscripten_glGetUniformIndices(program,uniformCount,uniformNames,uniformIndices){if(!uniformIndices){GL.recordError(1281);return}if(uniformCount>0&&(uniformNames==0||uniformIndices==0)){GL.recordError(1281);return}program=GL.programs[program];var names=[];for(var i=0;i<uniformCount;i++)names.push(UTF8ToString(GROWABLE_HEAP_I32()[uniformNames+i*4>>2]));var result=GLctx["getUniformIndices"](program,names);if(!result)return;var len=result.length;for(var i=0;i<len;i++){GROWABLE_HEAP_I32()[uniformIndices+i*4>>2]=result[i]}}function webglGetLeftBracePos(name){return name.slice(-1)=="]"&&name.lastIndexOf("[")}function webglPrepareUniformLocationsBeforeFirstUse(program){var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i<GLctx.getProgramParameter(program,35718);++i){var u=GLctx.getActiveUniform(program,i);var nm=u.name;var sz=u.size;var lb=webglGetLeftBracePos(nm);var arrayName=lb>0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j<sz;++j){uniformLocsById[id]=j;program.uniformArrayNamesById[id++]=arrayName}}}}function _emscripten_glGetUniformLocation(program,name){name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex<sizeAndId[0]){arrayIndex+=sizeAndId[1];if(uniformLocsById[arrayIndex]=uniformLocsById[arrayIndex]||GLctx.getUniformLocation(program,name)){return arrayIndex}}}else{GL.recordError(1281)}return-1}function webglGetUniformLocation(location){var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}}function emscriptenWebGLGetUniform(program,location,params,type){if(!params){GL.recordError(1281);return}program=GL.programs[program];webglPrepareUniformLocationsBeforeFirstUse(program);var data=GLctx.getUniform(program,webglGetUniformLocation(location));if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:GROWABLE_HEAP_I32()[params>>2]=data;break;case 2:GROWABLE_HEAP_F32()[params>>2]=data;break}}else{for(var i=0;i<data.length;i++){switch(type){case 0:GROWABLE_HEAP_I32()[params+i*4>>2]=data[i];break;case 2:GROWABLE_HEAP_F32()[params+i*4>>2]=data[i];break}}}}function _emscripten_glGetUniformfv(program,location,params){emscriptenWebGLGetUniform(program,location,params,2)}function _emscripten_glGetUniformiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function _emscripten_glGetUniformuiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function emscriptenWebGLGetVertexAttrib(index,pname,params,type){if(!params){GL.recordError(1281);return}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){GROWABLE_HEAP_I32()[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:GROWABLE_HEAP_I32()[params>>2]=data;break;case 2:GROWABLE_HEAP_F32()[params>>2]=data;break;case 5:GROWABLE_HEAP_I32()[params>>2]=Math.fround(data);break}}else{for(var i=0;i<data.length;i++){switch(type){case 0:GROWABLE_HEAP_I32()[params+i*4>>2]=data[i];break;case 2:GROWABLE_HEAP_F32()[params+i*4>>2]=data[i];break;case 5:GROWABLE_HEAP_I32()[params+i*4>>2]=Math.fround(data[i]);break}}}}function _emscripten_glGetVertexAttribIiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,0)}function _emscripten_glGetVertexAttribIuiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,0)}function _emscripten_glGetVertexAttribPointerv(index,pname,pointer){if(!pointer){GL.recordError(1281);return}GROWABLE_HEAP_I32()[pointer>>2]=GLctx.getVertexAttribOffset(index,pname)}function _emscripten_glGetVertexAttribfv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,2)}function _emscripten_glGetVertexAttribiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,5)}function _emscripten_glHint(x0,x1){GLctx["hint"](x0,x1)}function _emscripten_glInvalidateFramebuffer(target,numAttachments,attachments){var list=tempFixedLengthArray[numAttachments];for(var i=0;i<numAttachments;i++){list[i]=GROWABLE_HEAP_I32()[attachments+i*4>>2]}GLctx["invalidateFramebuffer"](target,list)}function _emscripten_glInvalidateSubFramebuffer(target,numAttachments,attachments,x,y,width,height){var list=tempFixedLengthArray[numAttachments];for(var i=0;i<numAttachments;i++){list[i]=GROWABLE_HEAP_I32()[attachments+i*4>>2]}GLctx["invalidateSubFramebuffer"](target,list,x,y,width,height)}function _emscripten_glIsBuffer(buffer){var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)}function _emscripten_glIsEnabled(x0){return GLctx["isEnabled"](x0)}function _emscripten_glIsFramebuffer(framebuffer){var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)}function _emscripten_glIsProgram(program){program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)}function _emscripten_glIsQuery(id){var query=GL.queries[id];if(!query)return 0;return GLctx["isQuery"](query)}function _emscripten_glIsQueryEXT(id){var query=GL.queries[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)}function _emscripten_glIsRenderbuffer(renderbuffer){var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)}function _emscripten_glIsSampler(id){var sampler=GL.samplers[id];if(!sampler)return 0;return GLctx["isSampler"](sampler)}function _emscripten_glIsShader(shader){var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)}function _emscripten_glIsSync(sync){return GLctx.isSync(GL.syncs[sync])}function _emscripten_glIsTexture(id){var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)}function _emscripten_glIsTransformFeedback(id){return GLctx["isTransformFeedback"](GL.transformFeedbacks[id])}function _emscripten_glIsVertexArray(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}function _emscripten_glLineWidth(x0){GLctx["lineWidth"](x0)}function _emscripten_glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function _emscripten_glPauseTransformFeedback(){GLctx["pauseTransformFeedback"]()}function _emscripten_glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _emscripten_glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}function _emscripten_glProgramBinary(program,binaryFormat,binary,length){GL.recordError(1280)}function _emscripten_glProgramParameteri(program,pname,value){GL.recordError(1280)}function _emscripten_glQueryCounterEXT(id,target){GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.queries[id],target)}function _emscripten_glReadBuffer(x0){GLctx["readBuffer"](x0)}function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1}function heapObjectForWebGLType(type){type-=5120;if(type==0)return GROWABLE_HEAP_I8();if(type==1)return GROWABLE_HEAP_U8();if(type==2)return GROWABLE_HEAP_I16();if(type==4)return GROWABLE_HEAP_I32();if(type==6)return GROWABLE_HEAP_F32();if(type==5||type==28922||type==28520||type==30779||type==30782)return GROWABLE_HEAP_U32();return GROWABLE_HEAP_U16()}function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<<shift;var sizePerPixel=__colorChannelsInGlTextureFormat(format)*byteSize;var bytes=computeUnpackAlignedImageSize(width,height,sizePerPixel,GL.unpackAlignment);return heap.subarray(pixels>>shift,pixels+bytes>>shift)}function _emscripten_glReadPixels(x,y,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _emscripten_glReleaseShaderCompiler(){}function _emscripten_glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _emscripten_glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _emscripten_glResumeTransformFeedback(){GLctx["resumeTransformFeedback"]()}function _emscripten_glSampleCoverage(value,invert){GLctx.sampleCoverage(value,!!invert)}function _emscripten_glSamplerParameterf(sampler,pname,param){GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameterfv(sampler,pname,params){var param=GROWABLE_HEAP_F32()[params>>2];GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameteri(sampler,pname,param){GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameteriv(sampler,pname,params){var param=GROWABLE_HEAP_I32()[params>>2];GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _emscripten_glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _emscripten_glShaderBinary(){GL.recordError(1280)}function _emscripten_glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _emscripten_glStencilFunc(x0,x1,x2){GLctx["stencilFunc"](x0,x1,x2)}function _emscripten_glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glStencilMask(x0){GLctx["stencilMask"](x0)}function _emscripten_glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}function _emscripten_glStencilOp(x0,x1,x2){GLctx["stencilOp"](x0,x1,x2)}function _emscripten_glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}function _emscripten_glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _emscripten_glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,null)}}function _emscripten_glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _emscripten_glTexParameterfv(target,pname,params){var param=GROWABLE_HEAP_F32()[params>>2];GLctx.texParameterf(target,pname,param)}function _emscripten_glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _emscripten_glTexParameteriv(target,pname,params){var param=GROWABLE_HEAP_I32()[params>>2];GLctx.texParameteri(target,pname,param)}function _emscripten_glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _emscripten_glTexStorage3D(x0,x1,x2,x3,x4,x5){GLctx["texStorage3D"](x0,x1,x2,x3,x4,x5)}function _emscripten_glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _emscripten_glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function _emscripten_glTransformFeedbackVaryings(program,count,varyings,bufferMode){program=GL.programs[program];var vars=[];for(var i=0;i<count;i++)vars.push(UTF8ToString(GROWABLE_HEAP_I32()[varyings+i*4>>2]));GLctx["transformFeedbackVaryings"](program,vars,bufferMode)}function _emscripten_glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}var miniTempWebGLFloatBuffers=[];function _emscripten_glUniform1fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1fv(webglGetUniformLocation(location),GROWABLE_HEAP_F32(),value>>2,count);return}if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i<count;++i){view[i]=GROWABLE_HEAP_F32()[value+4*i>>2]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}var __miniTempWebGLIntBuffers=[];function _emscripten_glUniform1iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),GROWABLE_HEAP_I32(),value>>2,count);return}if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i<count;++i){view[i]=GROWABLE_HEAP_I32()[value+4*i>>2]}}else{var view=GROWABLE_HEAP_I32().subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform1ui(location,v0){GLctx.uniform1ui(webglGetUniformLocation(location),v0)}function _emscripten_glUniform1uiv(location,count,value){count&&GLctx.uniform1uiv(webglGetUniformLocation(location),GROWABLE_HEAP_U32(),value>>2,count)}function _emscripten_glUniform2f(location,v0,v1){GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),GROWABLE_HEAP_F32(),value>>2,count*2);return}if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=GROWABLE_HEAP_F32()[value+4*i>>2];view[i+1]=GROWABLE_HEAP_F32()[value+(4*i+4)>>2]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform2i(location,v0,v1){GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),GROWABLE_HEAP_I32(),value>>2,count*2);return}if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=GROWABLE_HEAP_I32()[value+4*i>>2];view[i+1]=GROWABLE_HEAP_I32()[value+(4*i+4)>>2]}}else{var view=GROWABLE_HEAP_I32().subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform2ui(location,v0,v1){GLctx.uniform2ui(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2uiv(location,count,value){count&&GLctx.uniform2uiv(webglGetUniformLocation(location),GROWABLE_HEAP_U32(),value>>2,count*2)}function _emscripten_glUniform3f(location,v0,v1,v2){GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),GROWABLE_HEAP_F32(),value>>2,count*3);return}if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=GROWABLE_HEAP_F32()[value+4*i>>2];view[i+1]=GROWABLE_HEAP_F32()[value+(4*i+4)>>2];view[i+2]=GROWABLE_HEAP_F32()[value+(4*i+8)>>2]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform3i(location,v0,v1,v2){GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3iv(webglGetUniformLocation(location),GROWABLE_HEAP_I32(),value>>2,count*3);return}if(count<=96){var view=__miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=GROWABLE_HEAP_I32()[value+4*i>>2];view[i+1]=GROWABLE_HEAP_I32()[value+(4*i+4)>>2];view[i+2]=GROWABLE_HEAP_I32()[value+(4*i+8)>>2]}}else{var view=GROWABLE_HEAP_I32().subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform3ui(location,v0,v1,v2){GLctx.uniform3ui(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3uiv(location,count,value){count&&GLctx.uniform3uiv(webglGetUniformLocation(location),GROWABLE_HEAP_U32(),value>>2,count*3)}function _emscripten_glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),GROWABLE_HEAP_F32(),value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=GROWABLE_HEAP_F32();value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4iv(webglGetUniformLocation(location),GROWABLE_HEAP_I32(),value>>2,count*4);return}if(count<=72){var view=__miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=GROWABLE_HEAP_I32()[value+4*i>>2];view[i+1]=GROWABLE_HEAP_I32()[value+(4*i+4)>>2];view[i+2]=GROWABLE_HEAP_I32()[value+(4*i+8)>>2];view[i+3]=GROWABLE_HEAP_I32()[value+(4*i+12)>>2]}}else{var view=GROWABLE_HEAP_I32().subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform4ui(location,v0,v1,v2,v3){GLctx.uniform4ui(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4uiv(location,count,value){count&&GLctx.uniform4uiv(webglGetUniformLocation(location),GROWABLE_HEAP_U32(),value>>2,count*4)}function _emscripten_glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _emscripten_glUniformMatrix2fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=GROWABLE_HEAP_F32()[value+4*i>>2];view[i+1]=GROWABLE_HEAP_F32()[value+(4*i+4)>>2];view[i+2]=GROWABLE_HEAP_F32()[value+(4*i+8)>>2];view[i+3]=GROWABLE_HEAP_F32()[value+(4*i+12)>>2]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix2x3fv(location,count,transpose,value){count&&GLctx.uniformMatrix2x3fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*6)}function _emscripten_glUniformMatrix2x4fv(location,count,transpose,value){count&&GLctx.uniformMatrix2x4fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*8)}function _emscripten_glUniformMatrix3fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*9);return}if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=GROWABLE_HEAP_F32()[value+4*i>>2];view[i+1]=GROWABLE_HEAP_F32()[value+(4*i+4)>>2];view[i+2]=GROWABLE_HEAP_F32()[value+(4*i+8)>>2];view[i+3]=GROWABLE_HEAP_F32()[value+(4*i+12)>>2];view[i+4]=GROWABLE_HEAP_F32()[value+(4*i+16)>>2];view[i+5]=GROWABLE_HEAP_F32()[value+(4*i+20)>>2];view[i+6]=GROWABLE_HEAP_F32()[value+(4*i+24)>>2];view[i+7]=GROWABLE_HEAP_F32()[value+(4*i+28)>>2];view[i+8]=GROWABLE_HEAP_F32()[value+(4*i+32)>>2]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix3x2fv(location,count,transpose,value){count&&GLctx.uniformMatrix3x2fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*6)}function _emscripten_glUniformMatrix3x4fv(location,count,transpose,value){count&&GLctx.uniformMatrix3x4fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*12)}function _emscripten_glUniformMatrix4fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=GROWABLE_HEAP_F32();value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix4x2fv(location,count,transpose,value){count&&GLctx.uniformMatrix4x2fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*8)}function _emscripten_glUniformMatrix4x3fv(location,count,transpose,value){count&&GLctx.uniformMatrix4x3fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*12)}function _emscripten_glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _emscripten_glValidateProgram(program){GLctx.validateProgram(GL.programs[program])}function _emscripten_glVertexAttrib1f(x0,x1){GLctx["vertexAttrib1f"](x0,x1)}function _emscripten_glVertexAttrib1fv(index,v){GLctx.vertexAttrib1f(index,GROWABLE_HEAP_F32()[v>>2])}function _emscripten_glVertexAttrib2f(x0,x1,x2){GLctx["vertexAttrib2f"](x0,x1,x2)}function _emscripten_glVertexAttrib2fv(index,v){GLctx.vertexAttrib2f(index,GROWABLE_HEAP_F32()[v>>2],GROWABLE_HEAP_F32()[v+4>>2])}function _emscripten_glVertexAttrib3f(x0,x1,x2,x3){GLctx["vertexAttrib3f"](x0,x1,x2,x3)}function _emscripten_glVertexAttrib3fv(index,v){GLctx.vertexAttrib3f(index,GROWABLE_HEAP_F32()[v>>2],GROWABLE_HEAP_F32()[v+4>>2],GROWABLE_HEAP_F32()[v+8>>2])}function _emscripten_glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,GROWABLE_HEAP_F32()[v>>2],GROWABLE_HEAP_F32()[v+4>>2],GROWABLE_HEAP_F32()[v+8>>2],GROWABLE_HEAP_F32()[v+12>>2])}function _emscripten_glVertexAttribDivisor(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribI4i(x0,x1,x2,x3,x4){GLctx["vertexAttribI4i"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttribI4iv(index,v){GLctx.vertexAttribI4i(index,GROWABLE_HEAP_I32()[v>>2],GROWABLE_HEAP_I32()[v+4>>2],GROWABLE_HEAP_I32()[v+8>>2],GROWABLE_HEAP_I32()[v+12>>2])}function _emscripten_glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx["vertexAttribI4ui"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttribI4uiv(index,v){GLctx.vertexAttribI4ui(index,GROWABLE_HEAP_U32()[v>>2],GROWABLE_HEAP_U32()[v+4>>2],GROWABLE_HEAP_U32()[v+8>>2],GROWABLE_HEAP_U32()[v+12>>2])}function _emscripten_glVertexAttribIPointer(index,size,type,stride,ptr){GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _emscripten_glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _emscripten_glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _emscripten_glWaitSync(sync,flags,timeoutLo,timeoutHi){GLctx.waitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _emscripten_memcpy_big(dest,src,num){GROWABLE_HEAP_U8().copyWithin(dest,src,src+num)}function _emscripten_num_logical_cores(){return navigator["hardwareConcurrency"]}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(function(){var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i<numCallArgs;i++){var arg=outerArgs[2+i];GROWABLE_HEAP_F64()[b+i]=arg}return _emscripten_run_in_main_runtime_thread_js(index,serializedNumCallArgs,args,sync)})}var _emscripten_receive_on_main_thread_js_callArgs=[];function _emscripten_receive_on_main_thread_js(index,numCallArgs,args){_emscripten_receive_on_main_thread_js_callArgs.length=numCallArgs;var b=args>>3;for(var i=0;i<numCallArgs;i++){_emscripten_receive_on_main_thread_js_callArgs[i]=GROWABLE_HEAP_F64()[b+i]}var isEmAsmConst=index<0;var func=!isEmAsmConst?proxiedFunctionTable[index]:ASM_CONSTS[-index-1];return func.apply(null,_emscripten_receive_on_main_thread_js_callArgs)}function _emscripten_get_heap_max(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=GROWABLE_HEAP_U8().length;requestedSize=requestedSize>>>0;if(requestedSize<=oldSize){return false}var maxHeapSize=_emscripten_get_heap_max();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop){var browserIterationFunc=getWasmTableEntry(func);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop)}function _emscripten_supports_offscreencanvas(){return 0}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}function _emscripten_webgl_destroy_context(contextHandle){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(31,1,contextHandle);if(GL.currentContext==contextHandle)GL.currentContext=0;GL.deleteContext(contextHandle)}function _emscripten_webgl_do_commit_frame(){if(!GL.currentContext||!GL.currentContext.GLctx){return-3}if(GL.currentContext.defaultFbo){GL.blitOffscreenFramebuffer(GL.currentContext);return 0}if(!GL.currentContext.attributes.explicitSwapControl){return-3}return 0}function _emscripten_webgl_create_context_proxied(target,attributes){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(32,1,target,attributes);return _emscripten_webgl_do_create_context(target,attributes)}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence<y.precedence})},removeDeferredCalls:function(targetFunction){for(var i=0;i<JSEvents.deferredCalls.length;++i){if(JSEvents.deferredCalls[i].targetFunction==targetFunction){JSEvents.deferredCalls.splice(i,1);--i}}},canPerformEventHandlerRequests:function(){return JSEvents.inEventHandler&&JSEvents.currentEventHandler.allowsDeferredCalls},runDeferredCalls:function(){if(!JSEvents.canPerformEventHandlerRequests()){return}for(var i=0;i<JSEvents.deferredCalls.length;++i){var call=JSEvents.deferredCalls[i];JSEvents.deferredCalls.splice(i,1);--i;call.targetFunction.apply(null,call.argsList)}},eventHandlers:[],removeAllHandlersOnTarget:function(target,eventTypeString){for(var i=0;i<JSEvents.eventHandlers.length;++i){if(JSEvents.eventHandlers[i].target==target&&(!eventTypeString||eventTypeString==JSEvents.eventHandlers[i].eventTypeString)){JSEvents._removeHandler(i--)}}},_removeHandler:function(i){var h=JSEvents.eventHandlers[i];h.target.removeEventListener(h.eventTypeString,h.eventListenerFunc,h.useCapture);JSEvents.eventHandlers.splice(i,1)},registerOrRemoveHandler:function(eventHandler){var jsEventHandler=function jsEventHandler(event){++JSEvents.inEventHandler;JSEvents.currentEventHandler=eventHandler;JSEvents.runDeferredCalls();eventHandler.handlerFunc(event);JSEvents.runDeferredCalls();--JSEvents.inEventHandler};if(eventHandler.callbackfunc){eventHandler.eventListenerFunc=jsEventHandler;eventHandler.target.addEventListener(eventHandler.eventTypeString,jsEventHandler,eventHandler.useCapture);JSEvents.eventHandlers.push(eventHandler);JSEvents.registerRemoveEventListeners()}else{for(var i=0;i<JSEvents.eventHandlers.length;++i){if(JSEvents.eventHandlers[i].target==eventHandler.target&&JSEvents.eventHandlers[i].eventTypeString==eventHandler.eventTypeString){JSEvents._removeHandler(i--)}}}},queueEventHandlerOnThread_iiii:function(targetThread,eventHandlerFunc,eventTypeId,eventData,userData){withStackSave(function(){var varargs=stackAlloc(12);GROWABLE_HEAP_I32()[varargs>>2]=eventTypeId;GROWABLE_HEAP_I32()[varargs+4>>2]=eventData;GROWABLE_HEAP_I32()[varargs+8>>2]=userData;_emscripten_dispatch_to_thread_(targetThread,637534208,eventHandlerFunc,eventData,varargs)})},getTargetThreadForEventCallback:function(targetThread){switch(targetThread){case 1:return 0;case 2:return PThread.currentProxiedOperationCallerThread;default:return targetThread}},getNodeNameForTarget:function(target){if(!target)return"";if(target==window)return"#window";if(target==screen)return"#screen";return target&&target.nodeName?target.nodeName:""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function maybeCStringToJsString(cString){return cString>2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=GROWABLE_HEAP_I32()[a+(24>>2)];var contextAttributes={"alpha":!!GROWABLE_HEAP_I32()[a+(0>>2)],"depth":!!GROWABLE_HEAP_I32()[a+(4>>2)],"stencil":!!GROWABLE_HEAP_I32()[a+(8>>2)],"antialias":!!GROWABLE_HEAP_I32()[a+(12>>2)],"premultipliedAlpha":!!GROWABLE_HEAP_I32()[a+(16>>2)],"preserveDrawingBuffer":!!GROWABLE_HEAP_I32()[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!GROWABLE_HEAP_I32()[a+(28>>2)],majorVersion:GROWABLE_HEAP_I32()[a+(32>>2)],minorVersion:GROWABLE_HEAP_I32()[a+(36>>2)],enableExtensionsByDefault:GROWABLE_HEAP_I32()[a+(40>>2)],explicitSwapControl:GROWABLE_HEAP_I32()[a+(44>>2)],proxyContextToMainThread:GROWABLE_HEAP_I32()[a+(48>>2)],renderViaOffscreenBackBuffer:GROWABLE_HEAP_I32()[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(ENVIRONMENT_IS_PTHREAD){if(contextAttributes.proxyContextToMainThread===2||!canvas&&contextAttributes.proxyContextToMainThread===1){if(typeof OffscreenCanvas=="undefined"){GROWABLE_HEAP_I32()[attributes+52>>2]=1;GROWABLE_HEAP_I32()[attributes+20>>2]=1}return _emscripten_webgl_create_context_proxied(target,attributes)}}if(!canvas){return 0}if(contextAttributes.explicitSwapControl&&!contextAttributes.renderViaOffscreenBackBuffer){contextAttributes.renderViaOffscreenBackBuffer=true}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_init_context_attributes(attributes){var a=attributes>>2;for(var i=0;i<56>>2;++i){GROWABLE_HEAP_I32()[a+i]=0}GROWABLE_HEAP_I32()[a+(0>>2)]=GROWABLE_HEAP_I32()[a+(4>>2)]=GROWABLE_HEAP_I32()[a+(12>>2)]=GROWABLE_HEAP_I32()[a+(16>>2)]=GROWABLE_HEAP_I32()[a+(32>>2)]=GROWABLE_HEAP_I32()[a+(40>>2)]=1;if(ENVIRONMENT_IS_WORKER)GROWABLE_HEAP_I32()[attributes+48>>2]=1}function _emscripten_webgl_make_context_current_calling_thread(contextHandle){var success=GL.makeContextCurrent(contextHandle);if(success)GL.currentContextIsProxied=false;return success?0:-5}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(33,1,__environ,environ_buf);var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;GROWABLE_HEAP_I32()[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(34,1,penviron_count,penviron_buf_size);var strings=getEnvStrings();GROWABLE_HEAP_I32()[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});GROWABLE_HEAP_I32()[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(35,1,fd);try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(36,1,fd,pbuf);try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;GROWABLE_HEAP_I8()[pbuf>>0]=type;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=GROWABLE_HEAP_U32()[iov>>2];var len=GROWABLE_HEAP_U32()[iov+4>>2];iov+=8;var curr=FS.read(stream,GROWABLE_HEAP_I8(),ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return ret}function _fd_read(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(37,1,fd,iov,iovcnt,pnum);try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);GROWABLE_HEAP_I32()[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(38,1,fd,offset_low,offset_high,whence,newOffset);try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return 61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],GROWABLE_HEAP_I32()[newOffset>>2]=tempI64[0],GROWABLE_HEAP_I32()[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=GROWABLE_HEAP_U32()[iov>>2];var len=GROWABLE_HEAP_U32()[iov+4>>2];iov+=8;var curr=FS.write(stream,GROWABLE_HEAP_I8(),ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(39,1,fd,iov,iovcnt,pnum);try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);GROWABLE_HEAP_I32()[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _getTempRet0(){return getTempRet0()}function _getaddrinfo(node,service,hint,out){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(40,1,node,service,hint,out);var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);GROWABLE_HEAP_I32()[ai+4>>2]=family;GROWABLE_HEAP_I32()[ai+8>>2]=type;GROWABLE_HEAP_I32()[ai+12>>2]=proto;GROWABLE_HEAP_I32()[ai+24>>2]=canon;GROWABLE_HEAP_U32()[ai+20>>2]=sa;if(family===10){GROWABLE_HEAP_I32()[ai+16>>2]=28}else{GROWABLE_HEAP_I32()[ai+16>>2]=16}GROWABLE_HEAP_I32()[ai+28>>2]=0;return ai}if(hint){flags=GROWABLE_HEAP_I32()[hint>>2];family=GROWABLE_HEAP_I32()[hint+4>>2];type=GROWABLE_HEAP_I32()[hint+8>>2];proto=GROWABLE_HEAP_I32()[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&GROWABLE_HEAP_I32()[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);GROWABLE_HEAP_U32()[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);GROWABLE_HEAP_U32()[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);GROWABLE_HEAP_U32()[out>>2]=ai;return 0}var GodotRuntime={get_func:function(ptr){return wasmTable.get(ptr)},error:function(){err.apply(null,Array.from(arguments))},print:function(){out.apply(null,Array.from(arguments))},malloc:function(p_size){return _malloc(p_size)},free:function(p_ptr){_free(p_ptr)},getHeapValue:function(p_ptr,p_type){return getValue(p_ptr,p_type)},setHeapValue:function(p_ptr,p_value,p_type){setValue(p_ptr,p_value,p_type)},heapSub:function(p_heap,p_ptr,p_len){const bytes=p_heap.BYTES_PER_ELEMENT;return p_heap.subarray(p_ptr/bytes,p_ptr/bytes+p_len)},heapSlice:function(p_heap,p_ptr,p_len){const bytes=p_heap.BYTES_PER_ELEMENT;return p_heap.slice(p_ptr/bytes,p_ptr/bytes+p_len)},heapCopy:function(p_dst,p_src,p_ptr){const bytes=p_src.BYTES_PER_ELEMENT;return p_dst.set(p_src,p_ptr/bytes)},parseString:function(p_ptr){return UTF8ToString(p_ptr)},parseStringArray:function(p_ptr,p_size){const strings=[];const ptrs=GodotRuntime.heapSub(GROWABLE_HEAP_I32(),p_ptr,p_size);ptrs.forEach(function(ptr){strings.push(GodotRuntime.parseString(ptr))});return strings},strlen:function(p_str){return lengthBytesUTF8(p_str)},allocString:function(p_str){const length=GodotRuntime.strlen(p_str)+1;const c_str=GodotRuntime.malloc(length);stringToUTF8(p_str,c_str,length);return c_str},allocStringArray:function(p_strings){const size=p_strings.length;const c_ptr=GodotRuntime.malloc(size*4);for(let i=0;i<size;i++){GROWABLE_HEAP_I32()[(c_ptr>>2)+i]=GodotRuntime.allocString(p_strings[i])}return c_ptr},freeStringArray:function(p_ptr,p_len){for(let i=0;i<p_len;i++){GodotRuntime.free(GROWABLE_HEAP_I32()[(p_ptr>>2)+i])}GodotRuntime.free(p_ptr)},stringToHeap:function(p_str,p_ptr,p_len){return stringToUTF8Array(p_str,GROWABLE_HEAP_I8(),p_ptr,p_len)}};var GodotConfig={canvas:null,locale:"en",canvas_resize_policy:2,virtual_keyboard:false,persistent_drops:false,on_execute:null,on_exit:null,init_config:function(p_opts){GodotConfig.canvas_resize_policy=p_opts["canvasResizePolicy"];GodotConfig.canvas=p_opts["canvas"];GodotConfig.locale=p_opts["locale"]||GodotConfig.locale;GodotConfig.virtual_keyboard=p_opts["virtualKeyboard"];GodotConfig.persistent_drops=!!p_opts["persistentDrops"];GodotConfig.on_execute=p_opts["onExecute"];GodotConfig.on_exit=p_opts["onExit"];if(p_opts["focusCanvas"]){GodotConfig.canvas.focus()}},locate_file:function(file){return Module["locateFile"](file)},clear:function(){GodotConfig.canvas=null;GodotConfig.locale="en";GodotConfig.canvas_resize_policy=2;GodotConfig.virtual_keyboard=false;GodotConfig.persistent_drops=false;GodotConfig.on_execute=null;GodotConfig.on_exit=null}};var ERRNO_CODES={};var GodotFS={_idbfs:false,_syncing:false,_mount_points:[],is_persistent:function(){return GodotFS._idbfs?1:0},init:function(persistentPaths){GodotFS._idbfs=false;if(!Array.isArray(persistentPaths)){return Promise.reject(new Error("Persistent paths must be an array"))}if(!persistentPaths.length){return Promise.resolve()}GodotFS._mount_points=persistentPaths.slice();function createRecursive(dir){try{FS.stat(dir)}catch(e){if(e.errno!==ERRNO_CODES.ENOENT){throw e}FS.mkdirTree(dir)}}GodotFS._mount_points.forEach(function(path){createRecursive(path);FS.mount(IDBFS,{},path)});return new Promise(function(resolve,reject){FS.syncfs(true,function(err){if(err){GodotFS._mount_points=[];GodotFS._idbfs=false;GodotRuntime.print(`IndexedDB not available: ${err.message}`)}else{GodotFS._idbfs=true}resolve(err)})})},deinit:function(){GodotFS._mount_points.forEach(function(path){try{FS.unmount(path)}catch(e){GodotRuntime.print("Already unmounted",e)}if(GodotFS._idbfs&&IDBFS.dbs[path]){IDBFS.dbs[path].close();delete IDBFS.dbs[path]}});GodotFS._mount_points=[];GodotFS._idbfs=false;GodotFS._syncing=false},sync:function(){if(GodotFS._syncing){GodotRuntime.error("Already syncing!");return Promise.resolve()}GodotFS._syncing=true;return new Promise(function(resolve,reject){FS.syncfs(false,function(error){if(error){GodotRuntime.error(`Failed to save IDB file system: ${error.message}`)}GodotFS._syncing=false;resolve(error)})})},copy_to_fs:function(path,buffer){const idx=path.lastIndexOf("/");let dir="/";if(idx>0){dir=path.slice(0,idx)}try{FS.stat(dir)}catch(e){if(e.errno!==ERRNO_CODES.ENOENT){throw e}FS.mkdirTree(dir)}FS.writeFile(path,new Uint8Array(buffer))}};var GodotOS={request_quit:function(){},_async_cbs:[],_fs_sync_promise:null,atexit:function(p_promise_cb){GodotOS._async_cbs.push(p_promise_cb)},cleanup:function(exit_code){const cb=GodotConfig.on_exit;GodotFS.deinit();GodotConfig.clear();if(cb){cb(exit_code)}},finish_async:function(callback){GodotOS._fs_sync_promise.then(function(err){const promises=[];GodotOS._async_cbs.forEach(function(cb){promises.push(new Promise(cb))});return Promise.all(promises)}).then(function(){return GodotFS.sync()}).then(function(err){setTimeout(function(){callback()},0)})}};var GodotAudio={ctx:null,input:null,driver:null,interval:0,init:function(mix_rate,latency,onstatechange,onlatencyupdate){const opts={};if(mix_rate){opts["sampleRate"]=mix_rate}const ctx=new(window.AudioContext||window.webkitAudioContext)(opts);GodotAudio.ctx=ctx;ctx.onstatechange=function(){let state=0;switch(ctx.state){case"suspended":state=0;break;case"running":state=1;break;case"closed":state=2;break}onstatechange(state)};ctx.onstatechange();GodotAudio.interval=setInterval(function(){let computed_latency=0;if(ctx.baseLatency){computed_latency+=GodotAudio.ctx.baseLatency}if(ctx.outputLatency){computed_latency+=GodotAudio.ctx.outputLatency}onlatencyupdate(computed_latency)},1e3);GodotOS.atexit(GodotAudio.close_async);return ctx.destination.channelCount},create_input:function(callback){if(GodotAudio.input){return 0}function gotMediaInput(stream){try{GodotAudio.input=GodotAudio.ctx.createMediaStreamSource(stream);callback(GodotAudio.input)}catch(e){GodotRuntime.error("Failed creaating input.",e)}}if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){navigator.mediaDevices.getUserMedia({"audio":true}).then(gotMediaInput,function(e){GodotRuntime.error("Error getting user media.",e)})}else{if(!navigator.getUserMedia){navigator.getUserMedia=navigator.webkitGetUserMedia||navigator.mozGetUserMedia}if(!navigator.getUserMedia){GodotRuntime.error("getUserMedia not available.");return 1}navigator.getUserMedia({"audio":true},gotMediaInput,function(e){GodotRuntime.print(e)})}return 0},close_async:function(resolve,reject){const ctx=GodotAudio.ctx;GodotAudio.ctx=null;if(!ctx){resolve();return}if(GodotAudio.interval){clearInterval(GodotAudio.interval);GodotAudio.interval=0}if(GodotAudio.input){GodotAudio.input.disconnect();GodotAudio.input=null}let closed=Promise.resolve();if(GodotAudio.driver){closed=GodotAudio.driver.close()}closed.then(function(){return ctx.close()}).then(function(){ctx.onstatechange=null;resolve()}).catch(function(e){ctx.onstatechange=null;GodotRuntime.error("Error closing AudioContext",e);resolve()})}};function _godot_audio_capture_start(){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(41,1);return GodotAudio.create_input(function(input){input.connect(GodotAudio.driver.get_node())})}function _godot_audio_capture_stop(){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(42,1);if(GodotAudio.input){const tracks=GodotAudio.input["mediaStream"]["getTracks"]();for(let i=0;i<tracks.length;i++){tracks[i]["stop"]()}GodotAudio.input.disconnect();GodotAudio.input=null}}function _godot_audio_has_worklet(){return GodotAudio.ctx&&GodotAudio.ctx.audioWorklet?1:0}function _godot_audio_init(p_mix_rate,p_latency,p_state_change,p_latency_update){const statechange=GodotRuntime.get_func(p_state_change);const latencyupdate=GodotRuntime.get_func(p_latency_update);const mix_rate=GodotRuntime.getHeapValue(p_mix_rate,"i32");const channels=GodotAudio.init(mix_rate,p_latency,statechange,latencyupdate);GodotRuntime.setHeapValue(p_mix_rate,GodotAudio.ctx.sampleRate,"i32");return channels}function _godot_audio_is_available(){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(43,1);if(!(window.AudioContext||window.webkitAudioContext)){return 0}return 1}function _godot_audio_resume(){if(GodotAudio.ctx&&GodotAudio.ctx.state!=="running"){GodotAudio.ctx.resume()}}var GodotAudioWorklet={promise:null,worklet:null,ring_buffer:null,create:function(channels){const path=GodotConfig.locate_file("godot.audio.worklet.js");GodotAudioWorklet.promise=GodotAudio.ctx.audioWorklet.addModule(path).then(function(){GodotAudioWorklet.worklet=new AudioWorkletNode(GodotAudio.ctx,"godot-processor",{"outputChannelCount":[channels]});return Promise.resolve()});GodotAudio.driver=GodotAudioWorklet},start:function(in_buf,out_buf,state){GodotAudioWorklet.promise.then(function(){const node=GodotAudioWorklet.worklet;node.connect(GodotAudio.ctx.destination);node.port.postMessage({"cmd":"start","data":[state,in_buf,out_buf]});node.port.onmessage=function(event){GodotRuntime.error(event.data)}})},start_no_threads:function(p_out_buf,p_out_size,out_callback,p_in_buf,p_in_size,in_callback){function RingBuffer(){let wpos=0;let rpos=0;let pending_samples=0;const wbuf=new Float32Array(p_out_size);function send(port){if(pending_samples===0){return}const buffer=GodotRuntime.heapSub(GROWABLE_HEAP_F32(),p_out_buf,p_out_size);const size=buffer.length;const tot_sent=pending_samples;out_callback(wpos,pending_samples);if(wpos+pending_samples>=size){const high=size-wpos;wbuf.set(buffer.subarray(wpos,size));pending_samples-=high;wpos=0}if(pending_samples>0){wbuf.set(buffer.subarray(wpos,wpos+pending_samples),tot_sent-pending_samples)}port.postMessage({"cmd":"chunk","data":wbuf.subarray(0,tot_sent)});wpos+=pending_samples;pending_samples=0}this.receive=function(recv_buf){const buffer=GodotRuntime.heapSub(GROWABLE_HEAP_F32(),p_in_buf,p_in_size);const from=rpos;let to_write=recv_buf.length;let high=0;if(rpos+to_write>=p_in_size){high=p_in_size-rpos;buffer.set(recv_buf.subarray(0,high),rpos);to_write-=high;rpos=0}if(to_write){buffer.set(recv_buf.subarray(high,to_write),rpos)}in_callback(from,recv_buf.length);rpos+=to_write};this.consumed=function(size,port){pending_samples+=size;send(port)}}GodotAudioWorklet.ring_buffer=new RingBuffer;GodotAudioWorklet.promise.then(function(){const node=GodotAudioWorklet.worklet;const buffer=GodotRuntime.heapSlice(GROWABLE_HEAP_F32(),p_out_buf,p_out_size);node.connect(GodotAudio.ctx.destination);node.port.postMessage({"cmd":"start_nothreads","data":[buffer,p_in_size]});node.port.onmessage=function(event){if(!GodotAudioWorklet.worklet){return}if(event.data["cmd"]==="read"){const read=event.data["data"];GodotAudioWorklet.ring_buffer.consumed(read,GodotAudioWorklet.worklet.port)}else if(event.data["cmd"]==="input"){const buf=event.data["data"];if(buf.length>p_in_size){GodotRuntime.error("Input chunk is too big");return}GodotAudioWorklet.ring_buffer.receive(buf)}else{GodotRuntime.error(event.data)}}})},get_node:function(){return GodotAudioWorklet.worklet},close:function(){return new Promise(function(resolve,reject){if(GodotAudioWorklet.promise===null){return}GodotAudioWorklet.promise.then(function(){GodotAudioWorklet.worklet.port.postMessage({"cmd":"stop","data":null});GodotAudioWorklet.worklet.disconnect();GodotAudioWorklet.worklet=null;GodotAudioWorklet.promise=null;resolve()}).catch(function(err){})})}};function _godot_audio_worklet_create(channels){try{GodotAudioWorklet.create(channels)}catch(e){GodotRuntime.error("Error starting AudioDriverWorklet",e);return 1}return 0}function _godot_audio_worklet_start(p_in_buf,p_in_size,p_out_buf,p_out_size,p_state){const out_buffer=GodotRuntime.heapSub(GROWABLE_HEAP_F32(),p_out_buf,p_out_size);const in_buffer=GodotRuntime.heapSub(GROWABLE_HEAP_F32(),p_in_buf,p_in_size);const state=GodotRuntime.heapSub(GROWABLE_HEAP_I32(),p_state,4);GodotAudioWorklet.start(in_buffer,out_buffer,state)}function _godot_audio_worklet_state_add(p_state,p_idx,p_value){return Atomics.add(GROWABLE_HEAP_I32(),(p_state>>2)+p_idx,p_value)}function _godot_audio_worklet_state_get(p_state,p_idx){return Atomics.load(GROWABLE_HEAP_I32(),(p_state>>2)+p_idx)}function _godot_audio_worklet_state_wait(p_state,p_idx,p_expected,p_timeout){Atomics.wait(GROWABLE_HEAP_I32(),(p_state>>2)+p_idx,p_expected,p_timeout);return Atomics.load(GROWABLE_HEAP_I32(),(p_state>>2)+p_idx)}function _godot_js_config_canvas_id_get(p_ptr,p_ptr_max){GodotRuntime.stringToHeap(`#${GodotConfig.canvas.id}`,p_ptr,p_ptr_max)}function _godot_js_config_locale_get(p_ptr,p_ptr_max){GodotRuntime.stringToHeap(GodotConfig.locale,p_ptr,p_ptr_max)}var GodotDisplayCursor={shape:"auto",visible:true,cursors:{},set_style:function(style){GodotConfig.canvas.style.cursor=style},set_shape:function(shape){GodotDisplayCursor.shape=shape;let css=shape;if(shape in GodotDisplayCursor.cursors){const c=GodotDisplayCursor.cursors[shape];css=`url("${c.url}") ${c.x} ${c.y}, auto`}if(GodotDisplayCursor.visible){GodotDisplayCursor.set_style(css)}},clear:function(){GodotDisplayCursor.set_style("");GodotDisplayCursor.shape="auto";GodotDisplayCursor.visible=true;Object.keys(GodotDisplayCursor.cursors).forEach(function(key){URL.revokeObjectURL(GodotDisplayCursor.cursors[key]);delete GodotDisplayCursor.cursors[key]})},lockPointer:function(){const canvas=GodotConfig.canvas;if(canvas.requestPointerLock){canvas.requestPointerLock()}},releasePointer:function(){if(document.exitPointerLock){document.exitPointerLock()}},isPointerLocked:function(){return document.pointerLockElement===GodotConfig.canvas}};var GodotEventListeners={handlers:[],has:function(target,event,method,capture){return GodotEventListeners.handlers.findIndex(function(e){return e.target===target&&e.event===event&&e.method===method&&e.capture===capture})!==-1},add:function(target,event,method,capture){if(GodotEventListeners.has(target,event,method,capture)){return}function Handler(p_target,p_event,p_method,p_capture){this.target=p_target;this.event=p_event;this.method=p_method;this.capture=p_capture}GodotEventListeners.handlers.push(new Handler(target,event,method,capture));target.addEventListener(event,method,capture)},clear:function(){GodotEventListeners.handlers.forEach(function(h){h.target.removeEventListener(h.event,h.method,h.capture)});GodotEventListeners.handlers.length=0}};var GodotDisplayScreen={desired_size:[0,0],hidpi:true,getPixelRatio:function(){return GodotDisplayScreen.hidpi?window.devicePixelRatio||1:1},isFullscreen:function(){const elem=document.fullscreenElement||document.mozFullscreenElement||document.webkitFullscreenElement||document.msFullscreenElement;if(elem){return elem===GodotConfig.canvas}return document.fullscreen||document.mozFullScreen||document.webkitIsFullscreen},hasFullscreen:function(){return document.fullscreenEnabled||document.mozFullScreenEnabled||document.webkitFullscreenEnabled},requestFullscreen:function(){if(!GodotDisplayScreen.hasFullscreen()){return 1}const canvas=GodotConfig.canvas;try{const promise=(canvas.requestFullscreen||canvas.msRequestFullscreen||canvas.mozRequestFullScreen||canvas.mozRequestFullscreen||canvas.webkitRequestFullscreen).call(canvas);if(promise){promise.catch(function(){})}}catch(e){return 1}return 0},exitFullscreen:function(){if(!GodotDisplayScreen.isFullscreen()){return 0}try{const promise=document.exitFullscreen();if(promise){promise.catch(function(){})}}catch(e){return 1}return 0},_updateGL:function(){const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle);if(gl){GL.resizeOffscreenFramebuffer(gl)}},updateSize:function(){const isFullscreen=GodotDisplayScreen.isFullscreen();const wantsFullWindow=GodotConfig.canvas_resize_policy===2;const noResize=GodotConfig.canvas_resize_policy===0;const wwidth=GodotDisplayScreen.desired_size[0];const wheight=GodotDisplayScreen.desired_size[1];const canvas=GodotConfig.canvas;let width=wwidth;let height=wheight;if(noResize){if(canvas.width!==width||canvas.height!==height){GodotDisplayScreen.desired_size=[canvas.width,canvas.height];GodotDisplayScreen._updateGL();return 1}return 0}const scale=GodotDisplayScreen.getPixelRatio();if(isFullscreen||wantsFullWindow){width=window.innerWidth*scale;height=window.innerHeight*scale}const csw=`${width/scale}px`;const csh=`${height/scale}px`;if(canvas.style.width!==csw||canvas.style.height!==csh||canvas.width!==width||canvas.height!==height){canvas.width=width;canvas.height=height;canvas.style.width=csw;canvas.style.height=csh;GodotDisplayScreen._updateGL();return 1}return 0}};var GodotDisplayVK={textinput:null,textarea:null,available:function(){return GodotConfig.virtual_keyboard&&"ontouchstart"in window},init:function(input_cb){function create(what){const elem=document.createElement(what);elem.style.display="none";elem.style.position="absolute";elem.style.zIndex="-1";elem.style.background="transparent";elem.style.padding="0px";elem.style.margin="0px";elem.style.overflow="hidden";elem.style.width="0px";elem.style.height="0px";elem.style.border="0px";elem.style.outline="none";elem.readonly=true;elem.disabled=true;GodotEventListeners.add(elem,"input",function(evt){const c_str=GodotRuntime.allocString(elem.value);input_cb(c_str,elem.selectionEnd);GodotRuntime.free(c_str)},false);GodotEventListeners.add(elem,"blur",function(evt){elem.style.display="none";elem.readonly=true;elem.disabled=true},false);GodotConfig.canvas.insertAdjacentElement("beforebegin",elem);return elem}GodotDisplayVK.textinput=create("input");GodotDisplayVK.textarea=create("textarea");GodotDisplayVK.updateSize()},show:function(text,multiline,start,end){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}if(GodotDisplayVK.textinput.style.display!==""||GodotDisplayVK.textarea.style.display!==""){GodotDisplayVK.hide()}GodotDisplayVK.updateSize();const elem=multiline?GodotDisplayVK.textarea:GodotDisplayVK.textinput;elem.readonly=false;elem.disabled=false;elem.value=text;elem.style.display="block";elem.focus();elem.setSelectionRange(start,end)},hide:function(){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}[GodotDisplayVK.textinput,GodotDisplayVK.textarea].forEach(function(elem){elem.blur();elem.style.display="none";elem.value=""})},updateSize:function(){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}const rect=GodotConfig.canvas.getBoundingClientRect();function update(elem){elem.style.left=`${rect.left}px`;elem.style.top=`${rect.top}px`;elem.style.width=`${rect.width}px`;elem.style.height=`${rect.height}px`}update(GodotDisplayVK.textinput);update(GodotDisplayVK.textarea)},clear:function(){if(GodotDisplayVK.textinput){GodotDisplayVK.textinput.remove();GodotDisplayVK.textinput=null}if(GodotDisplayVK.textarea){GodotDisplayVK.textarea.remove();GodotDisplayVK.textarea=null}}};var GodotDisplay={window_icon:"",findDPI:function(){function testDPI(dpi){return window.matchMedia(`(max-resolution: ${dpi}dpi)`).matches}function bisect(low,high,func){const mid=parseInt((high-low)/2+low,10);if(high-low<=1){return func(high)?high:low}if(func(mid)){return bisect(low,mid,func)}return bisect(mid,high,func)}try{const dpi=bisect(0,800,testDPI);return dpi>=96?dpi:96}catch(e){return 96}}};function _godot_js_display_alert(p_text){window.alert(GodotRuntime.parseString(p_text))}function _godot_js_display_canvas_focus(){GodotConfig.canvas.focus()}function _godot_js_display_canvas_is_focused(){return document.activeElement===GodotConfig.canvas}function _godot_js_display_clipboard_get(callback){const func=GodotRuntime.get_func(callback);try{navigator.clipboard.readText().then(function(result){const ptr=GodotRuntime.allocString(result);func(ptr);GodotRuntime.free(ptr)}).catch(function(e){})}catch(e){}}function _godot_js_display_clipboard_set(p_text){const text=GodotRuntime.parseString(p_text);if(!navigator.clipboard||!navigator.clipboard.writeText){return 1}navigator.clipboard.writeText(text).catch(function(e){GodotRuntime.error("Setting OS clipboard is only possible from an input callback for the HTML5 plafrom. Exception:",e)});return 0}function _godot_js_display_cursor_is_hidden(){return!GodotDisplayCursor.visible}function _godot_js_display_cursor_is_locked(){return GodotDisplayCursor.isPointerLocked()?1:0}function _godot_js_display_cursor_lock_set(p_lock){if(p_lock){GodotDisplayCursor.lockPointer()}else{GodotDisplayCursor.releasePointer()}}function _godot_js_display_cursor_set_custom_shape(p_shape,p_ptr,p_len,p_hotspot_x,p_hotspot_y){const shape=GodotRuntime.parseString(p_shape);const old_shape=GodotDisplayCursor.cursors[shape];if(p_len>0){const png=new Blob([GodotRuntime.heapSlice(GROWABLE_HEAP_U8(),p_ptr,p_len)],{type:"image/png"});const url=URL.createObjectURL(png);GodotDisplayCursor.cursors[shape]={url:url,x:p_hotspot_x,y:p_hotspot_y}}else{delete GodotDisplayCursor.cursors[shape]}if(shape===GodotDisplayCursor.shape){GodotDisplayCursor.set_shape(GodotDisplayCursor.shape)}if(old_shape){URL.revokeObjectURL(old_shape.url)}}function _godot_js_display_cursor_set_shape(p_string){GodotDisplayCursor.set_shape(GodotRuntime.parseString(p_string))}function _godot_js_display_cursor_set_visible(p_visible){const visible=p_visible!==0;if(visible===GodotDisplayCursor.visible){return}GodotDisplayCursor.visible=visible;if(visible){GodotDisplayCursor.set_shape(GodotDisplayCursor.shape)}else{GodotDisplayCursor.set_style("none")}}function _godot_js_display_desired_size_set(width,height){GodotDisplayScreen.desired_size=[width,height];GodotDisplayScreen.updateSize()}function _godot_js_display_fullscreen_cb(callback){const canvas=GodotConfig.canvas;const func=GodotRuntime.get_func(callback);function change_cb(evt){if(evt.target===canvas){func(GodotDisplayScreen.isFullscreen())}}GodotEventListeners.add(document,"fullscreenchange",change_cb,false);GodotEventListeners.add(document,"mozfullscreenchange",change_cb,false);GodotEventListeners.add(document,"webkitfullscreenchange",change_cb,false)}function _godot_js_display_fullscreen_exit(){return GodotDisplayScreen.exitFullscreen()}function _godot_js_display_fullscreen_request(){return GodotDisplayScreen.requestFullscreen()}function _godot_js_display_glGetBufferSubData(target,offset,size,data){const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle);if(gl){gl.GLctx["getBufferSubData"](target,offset,GROWABLE_HEAP_U8(),data,size)}}function _godot_js_display_has_webgl(p_version){if(p_version!==1&&p_version!==2){return false}try{return!!document.createElement("canvas").getContext(p_version===2?"webgl2":"webgl")}catch(e){}return false}function _godot_js_display_is_swap_ok_cancel(){const win=["Windows","Win64","Win32","WinCE"];const plat=navigator.platform||"";if(win.indexOf(plat)!==-1){return 1}return 0}function _godot_js_display_notification_cb(callback,p_enter,p_exit,p_in,p_out){const canvas=GodotConfig.canvas;const func=GodotRuntime.get_func(callback);const notif=[p_enter,p_exit,p_in,p_out];["mouseover","mouseleave","focus","blur"].forEach(function(evt_name,idx){GodotEventListeners.add(canvas,evt_name,function(){func(notif[idx])},true)})}function _godot_js_display_pixel_ratio_get(){return GodotDisplayScreen.getPixelRatio()}function _godot_js_display_screen_dpi_get(){return GodotDisplay.findDPI()}function _godot_js_display_screen_size_get(width,height){const scale=GodotDisplayScreen.getPixelRatio();GodotRuntime.setHeapValue(width,window.screen.width*scale,"i32");GodotRuntime.setHeapValue(height,window.screen.height*scale,"i32")}function _godot_js_display_setup_canvas(p_width,p_height,p_fullscreen,p_hidpi){const canvas=GodotConfig.canvas;GodotEventListeners.add(canvas,"contextmenu",function(ev){ev.preventDefault()},false);GodotEventListeners.add(canvas,"webglcontextlost",function(ev){alert("WebGL context lost, please reload the page");ev.preventDefault()},false);GodotDisplayScreen.hidpi=!!p_hidpi;switch(GodotConfig.canvas_resize_policy){case 0:GodotDisplayScreen.desired_size=[canvas.width,canvas.height];break;case 1:GodotDisplayScreen.desired_size=[p_width,p_height];break;default:canvas.style.position="absolute";canvas.style.top=0;canvas.style.left=0;break}GodotDisplayScreen.updateSize();if(p_fullscreen){GodotDisplayScreen.requestFullscreen()}}function _godot_js_display_size_update(){const updated=GodotDisplayScreen.updateSize();if(updated){GodotDisplayVK.updateSize()}return updated}function _godot_js_display_touchscreen_is_available(){return"ontouchstart"in window}function _godot_js_display_vk_available(){return GodotDisplayVK.available()}function _godot_js_display_vk_cb(p_input_cb){const input_cb=GodotRuntime.get_func(p_input_cb);if(GodotDisplayVK.available()){GodotDisplayVK.init(input_cb)}}function _godot_js_display_vk_hide(){GodotDisplayVK.hide()}function _godot_js_display_vk_show(p_text,p_multiline,p_start,p_end){const text=GodotRuntime.parseString(p_text);const start=p_start>0?p_start:0;const end=p_end>0?p_end:start;GodotDisplayVK.show(text,p_multiline,start,end)}function _godot_js_display_window_blur_cb(callback){const func=GodotRuntime.get_func(callback);GodotEventListeners.add(window,"blur",function(){func()},false)}function _godot_js_display_window_icon_set(p_ptr,p_len){let link=document.getElementById("-gd-engine-icon");if(link===null){link=document.createElement("link");link.rel="icon";link.id="-gd-engine-icon";document.head.appendChild(link)}const old_icon=GodotDisplay.window_icon;const png=new Blob([GodotRuntime.heapSlice(GROWABLE_HEAP_U8(),p_ptr,p_len)],{type:"image/png"});GodotDisplay.window_icon=URL.createObjectURL(png);link.href=GodotDisplay.window_icon;if(old_icon){URL.revokeObjectURL(old_icon)}}function _godot_js_display_window_size_get(p_width,p_height){GodotRuntime.setHeapValue(p_width,GodotConfig.canvas.width,"i32");GodotRuntime.setHeapValue(p_height,GodotConfig.canvas.height,"i32")}function _godot_js_display_window_title_set(p_data){document.title=GodotRuntime.parseString(p_data)}function _godot_js_eval(p_js,p_use_global_ctx,p_union_ptr,p_byte_arr,p_byte_arr_write,p_callback){const js_code=GodotRuntime.parseString(p_js);let eval_ret=null;try{if(p_use_global_ctx){const global_eval=eval;eval_ret=global_eval(js_code)}else{eval_ret=eval(js_code)}}catch(e){GodotRuntime.error(e)}switch(typeof eval_ret){case"boolean":GodotRuntime.setHeapValue(p_union_ptr,eval_ret,"i32");return 1;case"number":GodotRuntime.setHeapValue(p_union_ptr,eval_ret,"double");return 3;case"string":GodotRuntime.setHeapValue(p_union_ptr,GodotRuntime.allocString(eval_ret),"*");return 4;case"object":if(eval_ret===null){break}if(ArrayBuffer.isView(eval_ret)&&!(eval_ret instanceof Uint8Array)){eval_ret=new Uint8Array(eval_ret.buffer)}else if(eval_ret instanceof ArrayBuffer){eval_ret=new Uint8Array(eval_ret)}if(eval_ret instanceof Uint8Array){const func=GodotRuntime.get_func(p_callback);const bytes_ptr=func(p_byte_arr,p_byte_arr_write,eval_ret.length);GROWABLE_HEAP_U8().set(eval_ret,bytes_ptr);return 20}break}return 0}var IDHandler={_last_id:0,_references:{},get:function(p_id){return IDHandler._references[p_id]},add:function(p_data){const id=++IDHandler._last_id;IDHandler._references[id]=p_data;return id},remove:function(p_id){delete IDHandler._references[p_id]}};var GodotFetch={onread:function(id,result){const obj=IDHandler.get(id);if(!obj){return}if(result.value){obj.chunks.push(result.value)}obj.reading=false;obj.done=result.done},onresponse:function(id,response){const obj=IDHandler.get(id);if(!obj){return}let chunked=false;response.headers.forEach(function(value,header){const v=value.toLowerCase().trim();const h=header.toLowerCase().trim();if(h==="transfer-encoding"&&v==="chunked"){chunked=true}});obj.status=response.status;obj.response=response;obj.reader=response.body.getReader();obj.chunked=chunked},onerror:function(id,err){GodotRuntime.error(err);const obj=IDHandler.get(id);if(!obj){return}obj.error=err},create:function(method,url,headers,body){const obj={request:null,response:null,reader:null,error:null,done:false,reading:false,status:0,chunks:[],bodySize:-1};const id=IDHandler.add(obj);const init={method:method,headers:headers,body:body};obj.request=fetch(url,init);obj.request.then(GodotFetch.onresponse.bind(null,id)).catch(GodotFetch.onerror.bind(null,id));return id},free:function(id){const obj=IDHandler.get(id);if(!obj){return}IDHandler.remove(id);if(!obj.request){return}obj.request.then(function(response){response.abort()}).catch(function(e){})},read:function(id){const obj=IDHandler.get(id);if(!obj){return}if(obj.reader&&!obj.reading){if(obj.done){obj.reader=null;return}obj.reading=true;obj.reader.read().then(GodotFetch.onread.bind(null,id)).catch(GodotFetch.onerror.bind(null,id))}}};function _godot_js_fetch_body_length_get(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return-1}return obj.bodySize}function _godot_js_fetch_create(p_method,p_url,p_headers,p_headers_size,p_body,p_body_size){const method=GodotRuntime.parseString(p_method);const url=GodotRuntime.parseString(p_url);const headers=GodotRuntime.parseStringArray(p_headers,p_headers_size);const body=p_body_size?GodotRuntime.heapSlice(GROWABLE_HEAP_I8(),p_body,p_body_size):null;return GodotFetch.create(method,url,headers.map(function(hv){const idx=hv.indexOf(":");if(idx<=0){return[]}return[hv.slice(0,idx).trim(),hv.slice(idx+1).trim()]}).filter(function(v){return v.length===2}),body)}function _godot_js_fetch_free(id){GodotFetch.free(id)}function _godot_js_fetch_http_status_get(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 0}return obj.status}function _godot_js_fetch_is_chunked(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return-1}return obj.chunked?1:0}function _godot_js_fetch_read_chunk(p_id,p_buf,p_buf_size){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 0}let to_read=p_buf_size;const chunks=obj.chunks;while(to_read&&chunks.length){const chunk=obj.chunks[0];if(chunk.length>to_read){GodotRuntime.heapCopy(GROWABLE_HEAP_I8(),chunk.slice(0,to_read),p_buf);chunks[0]=chunk.slice(to_read);to_read=0}else{GodotRuntime.heapCopy(GROWABLE_HEAP_I8(),chunk,p_buf);to_read-=chunk.length;chunks.pop()}}if(!chunks.length){GodotFetch.read(p_id)}return p_buf_size-to_read}function _godot_js_fetch_read_headers(p_id,p_parse_cb,p_ref){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 1}const cb=GodotRuntime.get_func(p_parse_cb);const arr=[];obj.response.headers.forEach(function(v,h){arr.push(`${h}:${v}`)});const c_ptr=GodotRuntime.allocStringArray(arr);cb(arr.length,c_ptr,p_ref);GodotRuntime.freeStringArray(c_ptr,arr.length);return 0}function _godot_js_fetch_state_get(p_id){const obj=IDHandler.get(p_id);if(!obj){return-1}if(obj.error){return-1}if(!obj.response){return 0}if(obj.reader){return 1}if(obj.done){return 2}return-1}var GodotInputGamepads={samples:[],get_pads:function(){try{const pads=navigator.getGamepads();if(pads){return pads}return[]}catch(e){return[]}},get_samples:function(){return GodotInputGamepads.samples},get_sample:function(index){const samples=GodotInputGamepads.samples;return index<samples.length?samples[index]:null},sample:function(){const pads=GodotInputGamepads.get_pads();const samples=[];for(let i=0;i<pads.length;i++){const pad=pads[i];if(!pad){samples.push(null);continue}const s={standard:pad.mapping==="standard",buttons:[],axes:[],connected:pad.connected};for(let b=0;b<pad.buttons.length;b++){s.buttons.push(pad.buttons[b].value)}for(let a=0;a<pad.axes.length;a++){s.axes.push(pad.axes[a])}samples.push(s)}GodotInputGamepads.samples=samples},init:function(onchange){GodotInputGamepads.samples=[];function add(pad){const guid=GodotInputGamepads.get_guid(pad);const c_id=GodotRuntime.allocString(pad.id);const c_guid=GodotRuntime.allocString(guid);onchange(pad.index,1,c_id,c_guid);GodotRuntime.free(c_id);GodotRuntime.free(c_guid)}const pads=GodotInputGamepads.get_pads();for(let i=0;i<pads.length;i++){if(pads[i]){add(pads[i])}}GodotEventListeners.add(window,"gamepadconnected",function(evt){if(evt.gamepad){add(evt.gamepad)}},false);GodotEventListeners.add(window,"gamepaddisconnected",function(evt){if(evt.gamepad){onchange(evt.gamepad.index,0)}},false)},get_guid:function(pad){if(pad.mapping){return pad.mapping}const ua=navigator.userAgent;let os="Unknown";if(ua.indexOf("Android")>=0){os="Android"}else if(ua.indexOf("Linux")>=0){os="Linux"}else if(ua.indexOf("iPhone")>=0){os="iOS"}else if(ua.indexOf("Macintosh")>=0){os="MacOSX"}else if(ua.indexOf("Windows")>=0){os="Windows"}const id=pad.id;const exp1=/vendor: ([0-9a-f]{4}) product: ([0-9a-f]{4})/i;const exp2=/^([0-9a-f]+)-([0-9a-f]+)-/i;let vendor="";let product="";if(exp1.test(id)){const match=exp1.exec(id);vendor=match[1].padStart(4,"0");product=match[2].padStart(4,"0")}else if(exp2.test(id)){const match=exp2.exec(id);vendor=match[1].padStart(4,"0");product=match[2].padStart(4,"0")}if(!vendor||!product){return`${os}Unknown`}return os+vendor+product}};var GodotInputDragDrop={promises:[],pending_files:[],add_entry:function(entry){if(entry.isDirectory){GodotInputDragDrop.add_dir(entry)}else if(entry.isFile){GodotInputDragDrop.add_file(entry)}else{GodotRuntime.error("Unrecognized entry...",entry)}},add_dir:function(entry){GodotInputDragDrop.promises.push(new Promise(function(resolve,reject){const reader=entry.createReader();reader.readEntries(function(entries){for(let i=0;i<entries.length;i++){GodotInputDragDrop.add_entry(entries[i])}resolve()})}))},add_file:function(entry){GodotInputDragDrop.promises.push(new Promise(function(resolve,reject){entry.file(function(file){const reader=new FileReader;reader.onload=function(){const f={"path":file.relativePath||file.webkitRelativePath,"name":file.name,"type":file.type,"size":file.size,"data":reader.result};if(!f["path"]){f["path"]=f["name"]}GodotInputDragDrop.pending_files.push(f);resolve()};reader.onerror=function(){GodotRuntime.print("Error reading file");reject()};reader.readAsArrayBuffer(file)},function(err){GodotRuntime.print("Error!");reject()})}))},process:function(resolve,reject){if(GodotInputDragDrop.promises.length===0){resolve();return}GodotInputDragDrop.promises.pop().then(function(){setTimeout(function(){GodotInputDragDrop.process(resolve,reject)},0)})},_process_event:function(ev,callback){ev.preventDefault();if(ev.dataTransfer.items){for(let i=0;i<ev.dataTransfer.items.length;i++){const item=ev.dataTransfer.items[i];let entry=null;if("getAsEntry"in item){entry=item.getAsEntry()}else if("webkitGetAsEntry"in item){entry=item.webkitGetAsEntry()}if(entry){GodotInputDragDrop.add_entry(entry)}}}else{GodotRuntime.error("File upload not supported")}new Promise(GodotInputDragDrop.process).then(function(){const DROP=`/tmp/drop-${parseInt(Math.random()*(1<<30),10)}/`;const drops=[];const files=[];FS.mkdir(DROP.slice(0,-1));GodotInputDragDrop.pending_files.forEach(elem=>{const path=elem["path"];GodotFS.copy_to_fs(DROP+path,elem["data"]);let idx=path.indexOf("/");if(idx===-1){drops.push(DROP+path)}else{const sub=path.substr(0,idx);idx=sub.indexOf("/");if(idx<0&&drops.indexOf(DROP+sub)===-1){drops.push(DROP+sub)}}files.push(DROP+path)});GodotInputDragDrop.promises=[];GodotInputDragDrop.pending_files=[];callback(drops);if(GodotConfig.persistent_drops){GodotOS.atexit(function(resolve,reject){GodotInputDragDrop.remove_drop(files,DROP);resolve()})}else{GodotInputDragDrop.remove_drop(files,DROP)}})},remove_drop:function(files,drop_path){const dirs=[drop_path.substr(0,drop_path.length-1)];files.forEach(function(file){FS.unlink(file);let dir=file.replace(drop_path,"");let idx=dir.lastIndexOf("/");while(idx>0){dir=dir.substr(0,idx);if(dirs.indexOf(drop_path+dir)===-1){dirs.push(drop_path+dir)}idx=dir.lastIndexOf("/")}});dirs.sort(function(a,b){const al=(a.match(/\//g)||[]).length;const bl=(b.match(/\//g)||[]).length;if(al>bl){return-1}else if(al<bl){return 1}return 0}).forEach(function(dir){FS.rmdir(dir)})},handler:function(callback){return function(ev){GodotInputDragDrop._process_event(ev,callback)}}};var GodotInput={getModifiers:function(evt){return evt.shiftKey+0+(evt.altKey+0<<1)+(evt.ctrlKey+0<<2)+(evt.metaKey+0<<3)},computePosition:function(evt,rect){const canvas=GodotConfig.canvas;const rw=canvas.width/rect.width;const rh=canvas.height/rect.height;const x=(evt.clientX-rect.x)*rw;const y=(evt.clientY-rect.y)*rh;return[x,y]}};function _godot_js_input_drop_files_cb(callback){const func=GodotRuntime.get_func(callback);const dropFiles=function(files){const args=files||[];if(!args.length){return}const argc=args.length;const argv=GodotRuntime.allocStringArray(args);func(argv,argc);GodotRuntime.freeStringArray(argv,argc)};const canvas=GodotConfig.canvas;GodotEventListeners.add(canvas,"dragover",function(ev){ev.preventDefault()},false);GodotEventListeners.add(canvas,"drop",GodotInputDragDrop.handler(dropFiles))}function _godot_js_input_gamepad_cb(change_cb){const onchange=GodotRuntime.get_func(change_cb);GodotInputGamepads.init(onchange)}function _godot_js_input_gamepad_sample(){GodotInputGamepads.sample();return 0}function _godot_js_input_gamepad_sample_count(){return GodotInputGamepads.get_samples().length}function _godot_js_input_gamepad_sample_get(p_index,r_btns,r_btns_num,r_axes,r_axes_num,r_standard){const sample=GodotInputGamepads.get_sample(p_index);if(!sample||!sample.connected){return 1}const btns=sample.buttons;const btns_len=btns.length<16?btns.length:16;for(let i=0;i<btns_len;i++){GodotRuntime.setHeapValue(r_btns+(i<<2),btns[i],"float")}GodotRuntime.setHeapValue(r_btns_num,btns_len,"i32");const axes=sample.axes;const axes_len=axes.length<10?axes.length:10;for(let i=0;i<axes_len;i++){GodotRuntime.setHeapValue(r_axes+(i<<2),axes[i],"float")}GodotRuntime.setHeapValue(r_axes_num,axes_len,"i32");const is_standard=sample.standard?1:0;GodotRuntime.setHeapValue(r_standard,is_standard,"i32");return 0}function _godot_js_input_key_cb(callback,code,key){const func=GodotRuntime.get_func(callback);function key_cb(pressed,evt){const modifiers=GodotInput.getModifiers(evt);GodotRuntime.stringToHeap(evt.code,code,32);GodotRuntime.stringToHeap(evt.key,key,32);func(pressed,evt.repeat,modifiers);evt.preventDefault()}GodotEventListeners.add(GodotConfig.canvas,"keydown",key_cb.bind(null,1),false);GodotEventListeners.add(GodotConfig.canvas,"keyup",key_cb.bind(null,0),false)}function _godot_js_input_mouse_button_cb(callback){const func=GodotRuntime.get_func(callback);const canvas=GodotConfig.canvas;function button_cb(p_pressed,evt){const rect=canvas.getBoundingClientRect();const pos=GodotInput.computePosition(evt,rect);const modifiers=GodotInput.getModifiers(evt);if(p_pressed){GodotConfig.canvas.focus()}if(func(p_pressed,evt.button,pos[0],pos[1],modifiers)){evt.preventDefault()}}GodotEventListeners.add(canvas,"mousedown",button_cb.bind(null,1),false);GodotEventListeners.add(window,"mouseup",button_cb.bind(null,0),false)}function _godot_js_input_mouse_move_cb(callback){const func=GodotRuntime.get_func(callback);const canvas=GodotConfig.canvas;function move_cb(evt){const rect=canvas.getBoundingClientRect();const pos=GodotInput.computePosition(evt,rect);const rw=canvas.width/rect.width;const rh=canvas.height/rect.height;const rel_pos_x=evt.movementX*rw;const rel_pos_y=evt.movementY*rh;const modifiers=GodotInput.getModifiers(evt);func(pos[0],pos[1],rel_pos_x,rel_pos_y,modifiers)}GodotEventListeners.add(window,"mousemove",move_cb,false)}function _godot_js_input_mouse_wheel_cb(callback){const func=GodotRuntime.get_func(callback);function wheel_cb(evt){if(func(evt["deltaX"]||0,evt["deltaY"]||0)){evt.preventDefault()}}GodotEventListeners.add(GodotConfig.canvas,"wheel",wheel_cb,false)}function _godot_js_input_paste_cb(callback){const func=GodotRuntime.get_func(callback);GodotEventListeners.add(window,"paste",function(evt){const text=evt.clipboardData.getData("text");const ptr=GodotRuntime.allocString(text);func(ptr);GodotRuntime.free(ptr)},false)}function _godot_js_input_touch_cb(callback,ids,coords){const func=GodotRuntime.get_func(callback);const canvas=GodotConfig.canvas;function touch_cb(type,evt){if(type===0){GodotConfig.canvas.focus()}const rect=canvas.getBoundingClientRect();const touches=evt.changedTouches;for(let i=0;i<touches.length;i++){const touch=touches[i];const pos=GodotInput.computePosition(touch,rect);GodotRuntime.setHeapValue(coords+i*2*8,pos[0],"double");GodotRuntime.setHeapValue(coords+(i*2+1)*8,pos[1],"double");GodotRuntime.setHeapValue(ids+i*4,touch.identifier,"i32")}func(type,touches.length);if(evt.cancelable){evt.preventDefault()}}GodotEventListeners.add(canvas,"touchstart",touch_cb.bind(null,0),false);GodotEventListeners.add(canvas,"touchend",touch_cb.bind(null,1),false);GodotEventListeners.add(canvas,"touchcancel",touch_cb.bind(null,1),false);GodotEventListeners.add(canvas,"touchmove",touch_cb.bind(null,2),false)}function _godot_js_input_vibrate_handheld(p_duration_ms){if(typeof navigator.vibrate!=="function"){GodotRuntime.print("This browser does not support vibration.")}else{navigator.vibrate(p_duration_ms)}}function _godot_js_os_download_buffer(p_ptr,p_size,p_name,p_mime){const buf=GodotRuntime.heapSlice(GROWABLE_HEAP_I8(),p_ptr,p_size);const name=GodotRuntime.parseString(p_name);const mime=GodotRuntime.parseString(p_mime);const blob=new Blob([buf],{type:mime});const url=window.URL.createObjectURL(blob);const a=document.createElement("a");a.href=url;a.download=name;a.style.display="none";document.body.appendChild(a);a.click();a.remove();window.URL.revokeObjectURL(url)}function _godot_js_os_execute(p_json){const json_args=GodotRuntime.parseString(p_json);const args=JSON.parse(json_args);if(GodotConfig.on_execute){GodotConfig.on_execute(args);return 0}return 1}function _godot_js_os_finish_async(p_callback){const func=GodotRuntime.get_func(p_callback);GodotOS.finish_async(func)}function _godot_js_os_fs_is_persistent(){return GodotFS.is_persistent()}function _godot_js_os_fs_sync(callback){const func=GodotRuntime.get_func(callback);GodotOS._fs_sync_promise=GodotFS.sync();GodotOS._fs_sync_promise.then(function(err){func()})}function _godot_js_os_hw_concurrency_get(){return navigator.hardwareConcurrency||1}function _godot_js_os_request_quit_cb(p_callback){GodotOS.request_quit=GodotRuntime.get_func(p_callback)}function _godot_js_os_shell_open(p_uri){window.open(GodotRuntime.parseString(p_uri),"_blank")}var GodotPWA={hasUpdate:false,updateState:function(cb,reg){if(!reg){return}if(!reg.active){return}if(reg.waiting){GodotPWA.hasUpdate=true;cb()}GodotEventListeners.add(reg,"updatefound",function(){const installing=reg.installing;GodotEventListeners.add(installing,"statechange",function(){if(installing.state==="installed"){GodotPWA.hasUpdate=true;cb()}})})}};function _godot_js_pwa_cb(p_update_cb){if("serviceWorker"in navigator){const cb=GodotRuntime.get_func(p_update_cb);navigator.serviceWorker.getRegistration().then(GodotPWA.updateState.bind(null,cb))}}function _godot_js_pwa_update(){if("serviceWorker"in navigator&&GodotPWA.hasUpdate){navigator.serviceWorker.getRegistration().then(function(reg){if(!reg||!reg.waiting){return}reg.waiting.postMessage("update")});return 0}return 1}var GodotRTCDataChannel={connect:function(p_id,p_on_open,p_on_message,p_on_error,p_on_close){const ref=IDHandler.get(p_id);if(!ref){return}ref.binaryType="arraybuffer";ref.onopen=function(event){p_on_open()};ref.onclose=function(event){p_on_close()};ref.onerror=function(event){p_on_error()};ref.onmessage=function(event){let buffer;let is_string=0;if(event.data instanceof ArrayBuffer){buffer=new Uint8Array(event.data)}else if(event.data instanceof Blob){GodotRuntime.error("Blob type not supported");return}else if(typeof event.data==="string"){is_string=1;const enc=new TextEncoder("utf-8");buffer=new Uint8Array(enc.encode(event.data))}else{GodotRuntime.error("Unknown message type");return}const len=buffer.length*buffer.BYTES_PER_ELEMENT;const out=GodotRuntime.malloc(len);GROWABLE_HEAP_U8().set(buffer,out);p_on_message(out,len,is_string);GodotRuntime.free(out)}},close:function(p_id){const ref=IDHandler.get(p_id);if(!ref){return}ref.onopen=null;ref.onmessage=null;ref.onerror=null;ref.onclose=null;ref.close()},get_prop:function(p_id,p_prop,p_def){const ref=IDHandler.get(p_id);return ref&&ref[p_prop]!==undefined?ref[p_prop]:p_def}};function _godot_js_rtc_datachannel_close(p_id){const ref=IDHandler.get(p_id);if(!ref){return}GodotRTCDataChannel.close(p_id)}function _godot_js_rtc_datachannel_connect(p_id,p_ref,p_on_open,p_on_message,p_on_error,p_on_close){const onopen=GodotRuntime.get_func(p_on_open).bind(null,p_ref);const onmessage=GodotRuntime.get_func(p_on_message).bind(null,p_ref);const onerror=GodotRuntime.get_func(p_on_error).bind(null,p_ref);const onclose=GodotRuntime.get_func(p_on_close).bind(null,p_ref);GodotRTCDataChannel.connect(p_id,onopen,onmessage,onerror,onclose)}function _godot_js_rtc_datachannel_destroy(p_id){GodotRTCDataChannel.close(p_id);IDHandler.remove(p_id)}function _godot_js_rtc_datachannel_get_buffered_amount(p_id){return GodotRTCDataChannel.get_prop(p_id,"bufferedAmount",0)}function _godot_js_rtc_datachannel_id_get(p_id){return GodotRTCDataChannel.get_prop(p_id,"id",65535)}function _godot_js_rtc_datachannel_is_negotiated(p_id){return GodotRTCDataChannel.get_prop(p_id,"negotiated",65535)}function _godot_js_rtc_datachannel_is_ordered(p_id){return GodotRTCDataChannel.get_prop(p_id,"ordered",true)}function _godot_js_rtc_datachannel_label_get(p_id){const ref=IDHandler.get(p_id);if(!ref||!ref.label){return 0}return GodotRuntime.allocString(ref.label)}function _godot_js_rtc_datachannel_max_packet_lifetime_get(p_id){const ref=IDHandler.get(p_id);if(!ref){return 65535}if(ref["maxPacketLifeTime"]!==undefined){return ref["maxPacketLifeTime"]}else if(ref["maxRetransmitTime"]!==undefined){return ref["maxRetransmitTime"]}return 65535}function _godot_js_rtc_datachannel_max_retransmits_get(p_id){return GodotRTCDataChannel.get_prop(p_id,"maxRetransmits",65535)}function _godot_js_rtc_datachannel_protocol_get(p_id){const ref=IDHandler.get(p_id);if(!ref||!ref.protocol){return 0}return GodotRuntime.allocString(ref.protocol)}function _godot_js_rtc_datachannel_ready_state_get(p_id){const ref=IDHandler.get(p_id);if(!ref){return 3}switch(ref.readyState){case"connecting":return 0;case"open":return 1;case"closing":return 2;case"closed":default:return 3}}function _godot_js_rtc_datachannel_send(p_id,p_buffer,p_length,p_raw){const ref=IDHandler.get(p_id);if(!ref){return 1}const bytes_array=new Uint8Array(p_length);for(let i=0;i<p_length;i++){bytes_array[i]=GodotRuntime.getHeapValue(p_buffer+i,"i8")}if(p_raw){ref.send(bytes_array.buffer)}else{const string=new TextDecoder("utf-8").decode(bytes_array);ref.send(string)}return 0}var GodotRTCPeerConnection={onstatechange:function(p_id,p_conn,callback,event){const ref=IDHandler.get(p_id);if(!ref){return}let state;switch(p_conn.iceConnectionState){case"new":state=0;break;case"checking":state=1;break;case"connected":case"completed":state=2;break;case"disconnected":state=3;break;case"failed":state=4;break;case"closed":default:state=5;break}callback(state)},onicecandidate:function(p_id,callback,event){const ref=IDHandler.get(p_id);if(!ref||!event.candidate){return}const c=event.candidate;const candidate_str=GodotRuntime.allocString(c.candidate);const mid_str=GodotRuntime.allocString(c.sdpMid);callback(mid_str,c.sdpMLineIndex,candidate_str);GodotRuntime.free(candidate_str);GodotRuntime.free(mid_str)},ondatachannel:function(p_id,callback,event){const ref=IDHandler.get(p_id);if(!ref){return}const cid=IDHandler.add(event.channel);callback(cid)},onsession:function(p_id,callback,session){const ref=IDHandler.get(p_id);if(!ref){return}const type_str=GodotRuntime.allocString(session.type);const sdp_str=GodotRuntime.allocString(session.sdp);callback(type_str,sdp_str);GodotRuntime.free(type_str);GodotRuntime.free(sdp_str)},onerror:function(p_id,callback,error){const ref=IDHandler.get(p_id);if(!ref){return}GodotRuntime.error(error);callback()}};function _godot_js_rtc_pc_close(p_id){const ref=IDHandler.get(p_id);if(!ref){return}ref.close()}function _godot_js_rtc_pc_create(p_config,p_ref,p_on_state_change,p_on_candidate,p_on_datachannel){const onstatechange=GodotRuntime.get_func(p_on_state_change).bind(null,p_ref);const oncandidate=GodotRuntime.get_func(p_on_candidate).bind(null,p_ref);const ondatachannel=GodotRuntime.get_func(p_on_datachannel).bind(null,p_ref);const config=JSON.parse(GodotRuntime.parseString(p_config));let conn=null;try{conn=new RTCPeerConnection(config)}catch(e){GodotRuntime.error(e);return 0}const base=GodotRTCPeerConnection;const id=IDHandler.add(conn);conn.oniceconnectionstatechange=base.onstatechange.bind(null,id,conn,onstatechange);conn.onicecandidate=base.onicecandidate.bind(null,id,oncandidate);conn.ondatachannel=base.ondatachannel.bind(null,id,ondatachannel);return id}function _godot_js_rtc_pc_datachannel_create(p_id,p_label,p_config){try{const ref=IDHandler.get(p_id);if(!ref){return 0}const label=GodotRuntime.parseString(p_label);const config=JSON.parse(GodotRuntime.parseString(p_config));const channel=ref.createDataChannel(label,config);return IDHandler.add(channel)}catch(e){GodotRuntime.error(e);return 0}}function _godot_js_rtc_pc_destroy(p_id){const ref=IDHandler.get(p_id);if(!ref){return}ref.oniceconnectionstatechange=null;ref.onicecandidate=null;ref.ondatachannel=null;IDHandler.remove(p_id)}function _godot_js_rtc_pc_ice_candidate_add(p_id,p_mid_name,p_mline_idx,p_sdp){const ref=IDHandler.get(p_id);if(!ref){return}const sdpMidName=GodotRuntime.parseString(p_mid_name);const sdpName=GodotRuntime.parseString(p_sdp);ref.addIceCandidate(new RTCIceCandidate({"candidate":sdpName,"sdpMid":sdpMidName,"sdpMlineIndex":p_mline_idx}))}function _godot_js_rtc_pc_local_description_set(p_id,p_type,p_sdp,p_obj,p_on_error){const ref=IDHandler.get(p_id);if(!ref){return}const type=GodotRuntime.parseString(p_type);const sdp=GodotRuntime.parseString(p_sdp);const onerror=GodotRuntime.get_func(p_on_error).bind(null,p_obj);ref.setLocalDescription({"sdp":sdp,"type":type}).catch(function(error){GodotRTCPeerConnection.onerror(p_id,onerror,error)})}function _godot_js_rtc_pc_offer_create(p_id,p_obj,p_on_session,p_on_error){const ref=IDHandler.get(p_id);if(!ref){return}const onsession=GodotRuntime.get_func(p_on_session).bind(null,p_obj);const onerror=GodotRuntime.get_func(p_on_error).bind(null,p_obj);ref.createOffer().then(function(session){GodotRTCPeerConnection.onsession(p_id,onsession,session)}).catch(function(error){GodotRTCPeerConnection.onerror(p_id,onerror,error)})}function _godot_js_rtc_pc_remote_description_set(p_id,p_type,p_sdp,p_obj,p_session_created,p_on_error){const ref=IDHandler.get(p_id);if(!ref){return}const type=GodotRuntime.parseString(p_type);const sdp=GodotRuntime.parseString(p_sdp);const onerror=GodotRuntime.get_func(p_on_error).bind(null,p_obj);const onsession=GodotRuntime.get_func(p_session_created).bind(null,p_obj);ref.setRemoteDescription({"sdp":sdp,"type":type}).then(function(){if(type!=="offer"){return Promise.resolve()}return ref.createAnswer().then(function(session){GodotRTCPeerConnection.onsession(p_id,onsession,session)})}).catch(function(error){GodotRTCPeerConnection.onerror(p_id,onerror,error)})}var GodotWebSocket={_onopen:function(p_id,callback,event){const ref=IDHandler.get(p_id);if(!ref){return}const c_str=GodotRuntime.allocString(ref.protocol);callback(c_str);GodotRuntime.free(c_str)},_onmessage:function(p_id,callback,event){const ref=IDHandler.get(p_id);if(!ref){return}let buffer;let is_string=0;if(event.data instanceof ArrayBuffer){buffer=new Uint8Array(event.data)}else if(event.data instanceof Blob){GodotRuntime.error("Blob type not supported");return}else if(typeof event.data==="string"){is_string=1;const enc=new TextEncoder("utf-8");buffer=new Uint8Array(enc.encode(event.data))}else{GodotRuntime.error("Unknown message type");return}const len=buffer.length*buffer.BYTES_PER_ELEMENT;const out=GodotRuntime.malloc(len);GROWABLE_HEAP_U8().set(buffer,out);callback(out,len,is_string);GodotRuntime.free(out)},_onerror:function(p_id,callback,event){const ref=IDHandler.get(p_id);if(!ref){return}callback()},_onclose:function(p_id,callback,event){const ref=IDHandler.get(p_id);if(!ref){return}const c_str=GodotRuntime.allocString(event.reason);callback(event.code,c_str,event.wasClean?1:0);GodotRuntime.free(c_str)},send:function(p_id,p_data){const ref=IDHandler.get(p_id);if(!ref||ref.readyState!==ref.OPEN){return 1}ref.send(p_data);return 0},bufferedAmount:function(p_id){const ref=IDHandler.get(p_id);if(!ref){return 0}return ref.bufferedAmount},create:function(socket,p_on_open,p_on_message,p_on_error,p_on_close){const id=IDHandler.add(socket);socket.onopen=GodotWebSocket._onopen.bind(null,id,p_on_open);socket.onmessage=GodotWebSocket._onmessage.bind(null,id,p_on_message);socket.onerror=GodotWebSocket._onerror.bind(null,id,p_on_error);socket.onclose=GodotWebSocket._onclose.bind(null,id,p_on_close);return id},close:function(p_id,p_code,p_reason){const ref=IDHandler.get(p_id);if(ref&&ref.readyState<ref.CLOSING){const code=p_code;const reason=GodotRuntime.parseString(p_reason);ref.close(code,reason)}},destroy:function(p_id){const ref=IDHandler.get(p_id);if(!ref){return}GodotWebSocket.close(p_id,3001,"destroyed");IDHandler.remove(p_id);ref.onopen=null;ref.onmessage=null;ref.onerror=null;ref.onclose=null}};function _godot_js_websocket_buffered_amount(p_id){return GodotWebSocket.bufferedAmount(p_id)}function _godot_js_websocket_close(p_id,p_code,p_reason){const code=p_code;const reason=GodotRuntime.parseString(p_reason);GodotWebSocket.close(p_id,code,reason)}function _godot_js_websocket_create(p_ref,p_url,p_proto,p_on_open,p_on_message,p_on_error,p_on_close){const on_open=GodotRuntime.get_func(p_on_open).bind(null,p_ref);const on_message=GodotRuntime.get_func(p_on_message).bind(null,p_ref);const on_error=GodotRuntime.get_func(p_on_error).bind(null,p_ref);const on_close=GodotRuntime.get_func(p_on_close).bind(null,p_ref);const url=GodotRuntime.parseString(p_url);const protos=GodotRuntime.parseString(p_proto);let socket=null;try{if(protos){socket=new WebSocket(url,protos.split(","))}else{socket=new WebSocket(url)}}catch(e){return 0}socket.binaryType="arraybuffer";return GodotWebSocket.create(socket,on_open,on_message,on_error,on_close)}function _godot_js_websocket_destroy(p_id){GodotWebSocket.destroy(p_id)}function _godot_js_websocket_send(p_id,p_buf,p_buf_len,p_raw){const bytes_array=new Uint8Array(p_buf_len);let i=0;for(i=0;i<p_buf_len;i++){bytes_array[i]=GodotRuntime.getHeapValue(p_buf+i,"i8")}let out=bytes_array.buffer;if(!p_raw){out=new TextDecoder("utf-8").decode(bytes_array)}return GodotWebSocket.send(p_id,out)}var GodotJSWrapper={proxies:null,MyProxy:function(val){const id=IDHandler.add(this);GodotJSWrapper.proxies.set(val,id);let refs=1;this.ref=function(){refs++};this.unref=function(){refs--;if(refs===0){IDHandler.remove(id);GodotJSWrapper.proxies.delete(val)}};this.get_val=function(){return val};this.get_id=function(){return id}},get_proxied:function(val){const id=GodotJSWrapper.proxies.get(val);if(id===undefined){const proxy=new GodotJSWrapper.MyProxy(val);return proxy.get_id()}IDHandler.get(id).ref();return id},get_proxied_value:function(id){const proxy=IDHandler.get(id);if(proxy===undefined){return undefined}return proxy.get_val()},variant2js:function(type,val){switch(type){case 0:return null;case 1:return!!GodotRuntime.getHeapValue(val,"i64");case 2:return GodotRuntime.getHeapValue(val,"i64");case 3:return GodotRuntime.getHeapValue(val,"double");case 4:return GodotRuntime.parseString(GodotRuntime.getHeapValue(val,"*"));case 17:return GodotJSWrapper.get_proxied_value(GodotRuntime.getHeapValue(val,"i64"));default:return undefined}},js2variant:function(p_val,p_exchange){if(p_val===undefined||p_val===null){return 0}const type=typeof p_val;if(type==="boolean"){GodotRuntime.setHeapValue(p_exchange,p_val,"i64");return 1}else if(type==="number"){if(Number.isInteger(p_val)){GodotRuntime.setHeapValue(p_exchange,p_val,"i64");return 2}GodotRuntime.setHeapValue(p_exchange,p_val,"double");return 3}else if(type==="string"){const c_str=GodotRuntime.allocString(p_val);GodotRuntime.setHeapValue(p_exchange,c_str,"*");return 4}const id=GodotJSWrapper.get_proxied(p_val);GodotRuntime.setHeapValue(p_exchange,id,"i64");return 17}};function _godot_js_wrapper_create_cb(p_ref,p_func){const func=GodotRuntime.get_func(p_func);let id=0;const cb=function(){if(!GodotJSWrapper.get_proxied_value(id)){return}const args=Array.from(arguments);func(p_ref,GodotJSWrapper.get_proxied(args),args.length)};id=GodotJSWrapper.get_proxied(cb);return id}function _godot_js_wrapper_create_object(p_object,p_args,p_argc,p_convert_callback,p_exchange,p_lock,p_free_lock_callback){const name=GodotRuntime.parseString(p_object);if(typeof window[name]==="undefined"){return-1}const convert=GodotRuntime.get_func(p_convert_callback);const freeLock=GodotRuntime.get_func(p_free_lock_callback);const args=new Array(p_argc);for(let i=0;i<p_argc;i++){const type=convert(p_args,i,p_exchange,p_lock);const lock=GodotRuntime.getHeapValue(p_lock,"*");args[i]=GodotJSWrapper.variant2js(type,p_exchange);if(lock){freeLock(p_lock,type)}}try{const res=new window[name](...args);return GodotJSWrapper.js2variant(res,p_exchange)}catch(e){GodotRuntime.error(`Error calling constructor ${name} with args:`,args,"error:",e);return-1}}function _godot_js_wrapper_interface_get(p_name){const name=GodotRuntime.parseString(p_name);if(typeof window[name]!=="undefined"){return GodotJSWrapper.get_proxied(window[name])}return 0}function _godot_js_wrapper_object_call(p_id,p_method,p_args,p_argc,p_convert_callback,p_exchange,p_lock,p_free_lock_callback){const obj=GodotJSWrapper.get_proxied_value(p_id);if(obj===undefined){return-1}const method=GodotRuntime.parseString(p_method);const convert=GodotRuntime.get_func(p_convert_callback);const freeLock=GodotRuntime.get_func(p_free_lock_callback);const args=new Array(p_argc);for(let i=0;i<p_argc;i++){const type=convert(p_args,i,p_exchange,p_lock);const lock=GodotRuntime.getHeapValue(p_lock,"*");args[i]=GodotJSWrapper.variant2js(type,p_exchange);if(lock){freeLock(p_lock,type)}}try{const res=obj[method](...args);return GodotJSWrapper.js2variant(res,p_exchange)}catch(e){GodotRuntime.error(`Error calling method ${method} on:`,obj,"error:",e);return-1}}function _godot_js_wrapper_object_get(p_id,p_exchange,p_prop){const obj=GodotJSWrapper.get_proxied_value(p_id);if(obj===undefined){return 0}if(p_prop){const prop=GodotRuntime.parseString(p_prop);try{return GodotJSWrapper.js2variant(obj[prop],p_exchange)}catch(e){GodotRuntime.error(`Error getting variable ${prop} on object`,obj);return 0}}return GodotJSWrapper.js2variant(obj,p_exchange)}function _godot_js_wrapper_object_getvar(p_id,p_type,p_exchange){const obj=GodotJSWrapper.get_proxied_value(p_id);if(obj===undefined){return-1}const prop=GodotJSWrapper.variant2js(p_type,p_exchange);if(prop===undefined||prop===null){return-1}try{return GodotJSWrapper.js2variant(obj[prop],p_exchange)}catch(e){GodotRuntime.error(`Error getting variable ${prop} on object`,obj,e);return-1}}function _godot_js_wrapper_object_set(p_id,p_name,p_type,p_exchange){const obj=GodotJSWrapper.get_proxied_value(p_id);if(obj===undefined){return}const name=GodotRuntime.parseString(p_name);try{obj[name]=GodotJSWrapper.variant2js(p_type,p_exchange)}catch(e){GodotRuntime.error(`Error setting variable ${name} on object`,obj)}}function _godot_js_wrapper_object_setvar(p_id,p_key_type,p_key_ex,p_val_type,p_val_ex){const obj=GodotJSWrapper.get_proxied_value(p_id);if(obj===undefined){return-1}const key=GodotJSWrapper.variant2js(p_key_type,p_key_ex);try{obj[key]=GodotJSWrapper.variant2js(p_val_type,p_val_ex);return 0}catch(e){GodotRuntime.error(`Error setting variable ${key} on object`,obj);return-1}}function _godot_js_wrapper_object_unref(p_id){const proxy=IDHandler.get(p_id);if(proxy!==undefined){proxy.unref()}}function _setTempRet0(val){setTempRet0(val)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=GROWABLE_HEAP_I32()[tm+40>>2];var date={tm_sec:GROWABLE_HEAP_I32()[tm>>2],tm_min:GROWABLE_HEAP_I32()[tm+4>>2],tm_hour:GROWABLE_HEAP_I32()[tm+8>>2],tm_mday:GROWABLE_HEAP_I32()[tm+12>>2],tm_mon:GROWABLE_HEAP_I32()[tm+16>>2],tm_year:GROWABLE_HEAP_I32()[tm+20>>2],tm_wday:GROWABLE_HEAP_I32()[tm+24>>2],tm_yday:GROWABLE_HEAP_I32()[tm+28>>2],tm_isdst:GROWABLE_HEAP_I32()[tm+32>>2],tm_gmtoff:GROWABLE_HEAP_I32()[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length<digits){str=character[0]+str}return str}function leadingNulls(value,digits){return leadingSomething(value,digits,"0")}function compareByDay(date1,date2){function sgn(value){return value<0?-1:value>0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}PThread.init();var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var preloadedImages={};var preloadedAudios={};var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i+1)}var __miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){__miniTempWebGLIntBuffers[i]=__miniTempWebGLIntBuffersStorage.subarray(0,i+1)}Module["request_quit"]=function(){GodotOS.request_quit()};Module["onExit"]=GodotOS.cleanup;GodotOS._fs_sync_promise=Promise.resolve();Module["initConfig"]=GodotConfig.init_config;Module["initFS"]=GodotFS.init;Module["copyToFS"]=GodotFS.copy_to_fs;ERRNO_CODES={"EPERM":63,"ENOENT":44,"ESRCH":71,"EINTR":27,"EIO":29,"ENXIO":60,"E2BIG":1,"ENOEXEC":45,"EBADF":8,"ECHILD":12,"EAGAIN":6,"EWOULDBLOCK":6,"ENOMEM":48,"EACCES":2,"EFAULT":21,"ENOTBLK":105,"EBUSY":10,"EEXIST":20,"EXDEV":75,"ENODEV":43,"ENOTDIR":54,"EISDIR":31,"EINVAL":28,"ENFILE":41,"EMFILE":33,"ENOTTY":59,"ETXTBSY":74,"EFBIG":22,"ENOSPC":51,"ESPIPE":70,"EROFS":69,"EMLINK":34,"EPIPE":64,"EDOM":18,"ERANGE":68,"ENOMSG":49,"EIDRM":24,"ECHRNG":106,"EL2NSYNC":156,"EL3HLT":107,"EL3RST":108,"ELNRNG":109,"EUNATCH":110,"ENOCSI":111,"EL2HLT":112,"EDEADLK":16,"ENOLCK":46,"EBADE":113,"EBADR":114,"EXFULL":115,"ENOANO":104,"EBADRQC":103,"EBADSLT":102,"EDEADLOCK":16,"EBFONT":101,"ENOSTR":100,"ENODATA":116,"ETIME":117,"ENOSR":118,"ENONET":119,"ENOPKG":120,"EREMOTE":121,"ENOLINK":47,"EADV":122,"ESRMNT":123,"ECOMM":124,"EPROTO":65,"EMULTIHOP":36,"EDOTDOT":125,"EBADMSG":9,"ENOTUNIQ":126,"EBADFD":127,"EREMCHG":128,"ELIBACC":129,"ELIBBAD":130,"ELIBSCN":131,"ELIBMAX":132,"ELIBEXEC":133,"ENOSYS":52,"ENOTEMPTY":55,"ENAMETOOLONG":37,"ELOOP":32,"EOPNOTSUPP":138,"EPFNOSUPPORT":139,"ECONNRESET":15,"ENOBUFS":42,"EAFNOSUPPORT":5,"EPROTOTYPE":67,"ENOTSOCK":57,"ENOPROTOOPT":50,"ESHUTDOWN":140,"ECONNREFUSED":14,"EADDRINUSE":3,"ECONNABORTED":13,"ENETUNREACH":40,"ENETDOWN":38,"ETIMEDOUT":73,"EHOSTDOWN":142,"EHOSTUNREACH":23,"EINPROGRESS":26,"EALREADY":7,"EDESTADDRREQ":17,"EMSGSIZE":35,"EPROTONOSUPPORT":66,"ESOCKTNOSUPPORT":137,"EADDRNOTAVAIL":4,"ENETRESET":39,"EISCONN":30,"ENOTCONN":53,"ETOOMANYREFS":141,"EUSERS":136,"EDQUOT":19,"ESTALE":72,"ENOTSUP":138,"ENOMEDIUM":148,"EILSEQ":25,"EOVERFLOW":61,"ECANCELED":11,"ENOTRECOVERABLE":56,"EOWNERDEAD":62,"ESTRPIPE":135};GodotOS.atexit(function(resolve,reject){GodotDisplayCursor.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotEventListeners.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotDisplayVK.clear();resolve()});GodotJSWrapper.proxies=new Map;var proxiedFunctionTable=[null,exitOnMainThread,pthreadCreateProxied,___syscall_accept4,___syscall_bind,___syscall_chdir,___syscall_chmod,___syscall_connect,___syscall_faccessat,___syscall_fcntl64,___syscall_getcwd,___syscall_getdents64,___syscall_ioctl,___syscall_listen,___syscall_lstat64,___syscall_mkdirat,___syscall_newfstatat,___syscall_openat,___syscall_poll,___syscall_readlinkat,___syscall_recvfrom,___syscall_renameat,___syscall_rmdir,___syscall_sendto,___syscall_socket,___syscall_stat64,___syscall_statfs64,___syscall_symlink,___syscall_unlinkat,_tzset_impl,_emscripten_force_exit,_emscripten_webgl_destroy_context,_emscripten_webgl_create_context_proxied,_environ_get,_environ_sizes_get,_fd_close,_fd_fdstat_get,_fd_read,_fd_seek,_fd_write,_getaddrinfo,_godot_audio_capture_start,_godot_audio_capture_stop,_godot_audio_is_available];function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"Sf":___call_sighandler,"dg":___emscripten_init_main_thread_js,"w":___emscripten_thread_cleanup,"Uf":___pthread_create_js,"Hf":___syscall_accept4,"Gf":___syscall_bind,"wg":___syscall_chdir,"vg":___syscall_chmod,"Ff":___syscall_connect,"yg":___syscall_faccessat,"i":___syscall_fcntl64,"jg":___syscall_getcwd,"Rf":___syscall_getdents64,"y":___syscall_ioctl,"Ef":___syscall_listen,"$f":___syscall_lstat64,"Zf":___syscall_mkdirat,"_f":___syscall_newfstatat,"z":___syscall_openat,"Xf":___syscall_poll,"Qf":___syscall_readlinkat,"Df":___syscall_recvfrom,"Mf":___syscall_renameat,"Nf":___syscall_rmdir,"Cf":___syscall_sendto,"u":___syscall_socket,"ag":___syscall_stat64,"Lf":___syscall_statfs64,"Kf":___syscall_symlink,"Of":___syscall_unlinkat,"tg":__dlinit,"B":__dlopen_js,"ug":__dlsym_js,"A":__emscripten_date_now,"Vf":__emscripten_default_pthread_stack_size,"og":__emscripten_get_now_is_monotonic,"Wf":__emscripten_notify_task_queue,"Wg":__emscripten_proxied_gl_context_activated_from_main_browser_thread,"cg":__emscripten_set_offscreencanvas_size,"Bf":__emscripten_throw_longjmp,"qg":__gmtime_js,"rg":__localtime_js,"sg":__tzset_js,"e":_abort,"Sa":_emscripten_cancel_main_loop,"x":_emscripten_check_blocking_allowed,"Yg":_emscripten_console_error,"Dg":_emscripten_force_exit,"d":_emscripten_get_now,"ne":_emscripten_glActiveTexture,"me":_emscripten_glAttachShader,"lb":_emscripten_glBeginQuery,"Db":_emscripten_glBeginQueryEXT,"Ua":_emscripten_glBeginTransformFeedback,"le":_emscripten_glBindAttribLocation,"ke":_emscripten_glBindBuffer,"Qa":_emscripten_glBindBufferBase,"Ra":_emscripten_glBindBufferRange,"je":_emscripten_glBindFramebuffer,"ie":_emscripten_glBindRenderbuffer,"X":_emscripten_glBindSampler,"he":_emscripten_glBindTexture,"P":_emscripten_glBindTransformFeedback,"Za":_emscripten_glBindVertexArray,"ge":_emscripten_glBlendColor,"fe":_emscripten_glBlendEquation,"ee":_emscripten_glBlendEquationSeparate,"de":_emscripten_glBlendFunc,"ce":_emscripten_glBlendFuncSeparate,"ab":_emscripten_glBlitFramebuffer,"be":_emscripten_glBufferData,"ae":_emscripten_glBufferSubData,"$d":_emscripten_glCheckFramebufferStatus,"_d":_emscripten_glClear,"sa":_emscripten_glClearBufferfi,"ta":_emscripten_glClearBufferfv,"va":_emscripten_glClearBufferiv,"ua":_emscripten_glClearBufferuiv,"Zd":_emscripten_glClearColor,"Yd":_emscripten_glClearDepthf,"Xd":_emscripten_glClearStencil,"ea":_emscripten_glClientWaitSync,"Wd":_emscripten_glColorMask,"Vd":_emscripten_glCompileShader,"Ud":_emscripten_glCompressedTexImage2D,"qb":_emscripten_glCompressedTexImage3D,"Td":_emscripten_glCompressedTexSubImage2D,"pb":_emscripten_glCompressedTexSubImage3D,"qa":_emscripten_glCopyBufferSubData,"Sd":_emscripten_glCopyTexImage2D,"Rd":_emscripten_glCopyTexSubImage2D,"rb":_emscripten_glCopyTexSubImage3D,"Qd":_emscripten_glCreateProgram,"Pd":_emscripten_glCreateShader,"Od":_emscripten_glCullFace,"Nd":_emscripten_glDeleteBuffers,"Md":_emscripten_glDeleteFramebuffers,"Ld":_emscripten_glDeleteProgram,"nb":_emscripten_glDeleteQueries,"Fb":_emscripten_glDeleteQueriesEXT,"Kd":_emscripten_glDeleteRenderbuffers,"Z":_emscripten_glDeleteSamplers,"Jd":_emscripten_glDeleteShader,"fa":_emscripten_glDeleteSync,"Id":_emscripten_glDeleteTextures,"O":_emscripten_glDeleteTransformFeedbacks,"Ya":_emscripten_glDeleteVertexArrays,"Hd":_emscripten_glDepthFunc,"Gd":_emscripten_glDepthMask,"Fd":_emscripten_glDepthRangef,"Ed":_emscripten_glDetachShader,"Dd":_emscripten_glDisable,"Cd":_emscripten_glDisableVertexAttribArray,"Bd":_emscripten_glDrawArrays,"ja":_emscripten_glDrawArraysInstanced,"hb":_emscripten_glDrawBuffers,"Ad":_emscripten_glDrawElements,"ia":_emscripten_glDrawElementsInstanced,"ub":_emscripten_glDrawRangeElements,"zd":_emscripten_glEnable,"yd":_emscripten_glEnableVertexAttribArray,"kb":_emscripten_glEndQuery,"Cb":_emscripten_glEndQueryEXT,"Ta":_emscripten_glEndTransformFeedback,"ha":_emscripten_glFenceSync,"xd":_emscripten_glFinish,"wd":_emscripten_glFlush,"vd":_emscripten_glFramebufferRenderbuffer,"ud":_emscripten_glFramebufferTexture2D,"_a":_emscripten_glFramebufferTextureLayer,"td":_emscripten_glFrontFace,"sd":_emscripten_glGenBuffers,"qd":_emscripten_glGenFramebuffers,"ob":_emscripten_glGenQueries,"Gb":_emscripten_glGenQueriesEXT,"pd":_emscripten_glGenRenderbuffers,"_":_emscripten_glGenSamplers,"od":_emscripten_glGenTextures,"N":_emscripten_glGenTransformFeedbacks,"Xa":_emscripten_glGenVertexArrays,"rd":_emscripten_glGenerateMipmap,"nd":_emscripten_glGetActiveAttrib,"md":_emscripten_glGetActiveUniform,"la":_emscripten_glGetActiveUniformBlockName,"ma":_emscripten_glGetActiveUniformBlockiv,"oa":_emscripten_glGetActiveUniformsiv,"ld":_emscripten_glGetAttachedShaders,"kd":_emscripten_glGetAttribLocation,"jd":_emscripten_glGetBooleanv,"$":_emscripten_glGetBufferParameteri64v,"id":_emscripten_glGetBufferParameteriv,"hd":_emscripten_glGetError,"gd":_emscripten_glGetFloatv,"Fa":_emscripten_glGetFragDataLocation,"fd":_emscripten_glGetFramebufferAttachmentParameteriv,"aa":_emscripten_glGetInteger64i_v,"ca":_emscripten_glGetInteger64v,"Va":_emscripten_glGetIntegeri_v,"ed":_emscripten_glGetIntegerv,"C":_emscripten_glGetInternalformativ,"J":_emscripten_glGetProgramBinary,"cd":_emscripten_glGetProgramInfoLog,"dd":_emscripten_glGetProgramiv,"xb":_emscripten_glGetQueryObjecti64vEXT,"zb":_emscripten_glGetQueryObjectivEXT,"wb":_emscripten_glGetQueryObjectui64vEXT,"ib":_emscripten_glGetQueryObjectuiv,"yb":_emscripten_glGetQueryObjectuivEXT,"jb":_emscripten_glGetQueryiv,"Ab":_emscripten_glGetQueryivEXT,"bd":_emscripten_glGetRenderbufferParameteriv,"R":_emscripten_glGetSamplerParameterfv,"S":_emscripten_glGetSamplerParameteriv,"$c":_emscripten_glGetShaderInfoLog,"_c":_emscripten_glGetShaderPrecisionFormat,"Zc":_emscripten_glGetShaderSource,"ad":_emscripten_glGetShaderiv,"Yc":_emscripten_glGetString,"ra":_emscripten_glGetStringi,"ba":_emscripten_glGetSynciv,"Xc":_emscripten_glGetTexParameterfv,"Wc":_emscripten_glGetTexParameteriv,"Oa":_emscripten_glGetTransformFeedbackVarying,"na":_emscripten_glGetUniformBlockIndex,"pa":_emscripten_glGetUniformIndices,"Tc":_emscripten_glGetUniformLocation,"Vc":_emscripten_glGetUniformfv,"Uc":_emscripten_glGetUniformiv,"Ga":_emscripten_glGetUniformuiv,"Ma":_emscripten_glGetVertexAttribIiv,"La":_emscripten_glGetVertexAttribIuiv,"Qc":_emscripten_glGetVertexAttribPointerv,"Sc":_emscripten_glGetVertexAttribfv,"Rc":_emscripten_glGetVertexAttribiv,"Pc":_emscripten_glHint,"G":_emscripten_glInvalidateFramebuffer,"F":_emscripten_glInvalidateSubFramebuffer,"Oc":_emscripten_glIsBuffer,"Nc":_emscripten_glIsEnabled,"Mc":_emscripten_glIsFramebuffer,"Lc":_emscripten_glIsProgram,"mb":_emscripten_glIsQuery,"Eb":_emscripten_glIsQueryEXT,"Kc":_emscripten_glIsRenderbuffer,"Y":_emscripten_glIsSampler,"Jc":_emscripten_glIsShader,"ga":_emscripten_glIsSync,"Ic":_emscripten_glIsTexture,"M":_emscripten_glIsTransformFeedback,"Wa":_emscripten_glIsVertexArray,"Hc":_emscripten_glLineWidth,"Gc":_emscripten_glLinkProgram,"L":_emscripten_glPauseTransformFeedback,"Fc":_emscripten_glPixelStorei,"Ec":_emscripten_glPolygonOffset,"I":_emscripten_glProgramBinary,"H":_emscripten_glProgramParameteri,"Bb":_emscripten_glQueryCounterEXT,"vb":_emscripten_glReadBuffer,"Dc":_emscripten_glReadPixels,"Cc":_emscripten_glReleaseShaderCompiler,"Ac":_emscripten_glRenderbufferStorage,"$a":_emscripten_glRenderbufferStorageMultisample,"K":_emscripten_glResumeTransformFeedback,"zc":_emscripten_glSampleCoverage,"U":_emscripten_glSamplerParameterf,"T":_emscripten_glSamplerParameterfv,"W":_emscripten_glSamplerParameteri,"V":_emscripten_glSamplerParameteriv,"yc":_emscripten_glScissor,"xc":_emscripten_glShaderBinary,"wc":_emscripten_glShaderSource,"vc":_emscripten_glStencilFunc,"uc":_emscripten_glStencilFuncSeparate,"tc":_emscripten_glStencilMask,"sc":_emscripten_glStencilMaskSeparate,"rc":_emscripten_glStencilOp,"qc":_emscripten_glStencilOpSeparate,"pc":_emscripten_glTexImage2D,"tb":_emscripten_glTexImage3D,"oc":_emscripten_glTexParameterf,"nc":_emscripten_glTexParameterfv,"mc":_emscripten_glTexParameteri,"lc":_emscripten_glTexParameteriv,"E":_emscripten_glTexStorage2D,"D":_emscripten_glTexStorage3D,"kc":_emscripten_glTexSubImage2D,"sb":_emscripten_glTexSubImage3D,"Pa":_emscripten_glTransformFeedbackVaryings,"jc":_emscripten_glUniform1f,"ic":_emscripten_glUniform1fv,"hc":_emscripten_glUniform1i,"gc":_emscripten_glUniform1iv,"Ea":_emscripten_glUniform1ui,"Aa":_emscripten_glUniform1uiv,"fc":_emscripten_glUniform2f,"ec":_emscripten_glUniform2fv,"dc":_emscripten_glUniform2i,"cc":_emscripten_glUniform2iv,"Da":_emscripten_glUniform2ui,"za":_emscripten_glUniform2uiv,"bc":_emscripten_glUniform3f,"ac":_emscripten_glUniform3fv,"$b":_emscripten_glUniform3i,"_b":_emscripten_glUniform3iv,"Ca":_emscripten_glUniform3ui,"ya":_emscripten_glUniform3uiv,"Zb":_emscripten_glUniform4f,"Yb":_emscripten_glUniform4fv,"Xb":_emscripten_glUniform4i,"Wb":_emscripten_glUniform4iv,"Ba":_emscripten_glUniform4ui,"wa":_emscripten_glUniform4uiv,"ka":_emscripten_glUniformBlockBinding,"Vb":_emscripten_glUniformMatrix2fv,"gb":_emscripten_glUniformMatrix2x3fv,"eb":_emscripten_glUniformMatrix2x4fv,"Ub":_emscripten_glUniformMatrix3fv,"fb":_emscripten_glUniformMatrix3x2fv,"cb":_emscripten_glUniformMatrix3x4fv,"Tb":_emscripten_glUniformMatrix4fv,"db":_emscripten_glUniformMatrix4x2fv,"bb":_emscripten_glUniformMatrix4x3fv,"Sb":_emscripten_glUseProgram,"Rb":_emscripten_glValidateProgram,"Qb":_emscripten_glVertexAttrib1f,"Pb":_emscripten_glVertexAttrib1fv,"Ob":_emscripten_glVertexAttrib2f,"Nb":_emscripten_glVertexAttrib2fv,"Mb":_emscripten_glVertexAttrib3f,"Lb":_emscripten_glVertexAttrib3fv,"Kb":_emscripten_glVertexAttrib4f,"Jb":_emscripten_glVertexAttrib4fv,"Q":_emscripten_glVertexAttribDivisor,"Ka":_emscripten_glVertexAttribI4i,"Ia":_emscripten_glVertexAttribI4iv,"Ja":_emscripten_glVertexAttribI4ui,"Ha":_emscripten_glVertexAttribI4uiv,"Na":_emscripten_glVertexAttribIPointer,"Ib":_emscripten_glVertexAttribPointer,"Hb":_emscripten_glViewport,"da":_emscripten_glWaitSync,"mg":_emscripten_memcpy_big,"Jf":_emscripten_num_logical_cores,"bg":_emscripten_receive_on_main_thread_js,"If":_emscripten_resize_heap,"xa":_emscripten_set_main_loop,"Xg":_emscripten_supports_offscreencanvas,"ng":_emscripten_unwind_to_js_event_loop,"Se":_emscripten_webgl_destroy_context,"oe":_emscripten_webgl_do_commit_frame,"qe":_emscripten_webgl_do_create_context,"mf":_emscripten_webgl_init_context_attributes,"pe":_emscripten_webgl_make_context_current_calling_thread,"fg":_environ_get,"gg":_environ_sizes_get,"Tf":_exit,"h":_fd_close,"eg":_fd_fdstat_get,"lg":_fd_read,"yf":_fd_seek,"kg":_fd_write,"b":_getTempRet0,"Zg":_getaddrinfo,"Fg":_godot_audio_capture_start,"ig":_godot_audio_capture_stop,"Qe":_godot_audio_has_worklet,"ph":_godot_audio_init,"qh":_godot_audio_is_available,"Pg":_godot_audio_resume,"Fe":_godot_audio_worklet_create,"oh":_godot_audio_worklet_start,"q":_godot_audio_worklet_state_add,"o":_godot_audio_worklet_state_get,"kf":_godot_audio_worklet_state_wait,"He":_godot_js_config_canvas_id_get,"Bg":_godot_js_config_locale_get,"Oe":_godot_js_display_alert,"uf":_godot_js_display_canvas_focus,"vf":_godot_js_display_canvas_is_focused,"pf":_godot_js_display_clipboard_get,"qf":_godot_js_display_clipboard_set,"xf":_godot_js_display_cursor_is_hidden,"wf":_godot_js_display_cursor_is_locked,"k":_godot_js_display_cursor_lock_set,"v":_godot_js_display_cursor_set_custom_shape,"Pf":_godot_js_display_cursor_set_shape,"m":_godot_js_display_cursor_set_visible,"xg":_godot_js_display_desired_size_set,"bf":_godot_js_display_fullscreen_cb,"Yf":_godot_js_display_fullscreen_exit,"hg":_godot_js_display_fullscreen_request,"dh":_godot_js_display_glGetBufferSubData,"p":_godot_js_display_has_webgl,"nf":_godot_js_display_is_swap_ok_cancel,"$e":_godot_js_display_notification_cb,"Te":_godot_js_display_pixel_ratio_get,"Ue":_godot_js_display_screen_dpi_get,"zg":_godot_js_display_screen_size_get,"of":_godot_js_display_setup_canvas,"Ag":_godot_js_display_size_update,"tf":_godot_js_display_touchscreen_is_available,"Ze":_godot_js_display_vk_available,"_e":_godot_js_display_vk_cb,"Xe":_godot_js_display_vk_hide,"Ye":_godot_js_display_vk_show,"af":_godot_js_display_window_blur_cb,"Me":_godot_js_display_window_icon_set,"pg":_godot_js_display_window_size_get,"Ne":_godot_js_display_window_title_set,"Hg":_godot_js_eval,"Tg":_godot_js_fetch_body_length_get,"Vg":_godot_js_fetch_create,"re":_godot_js_fetch_free,"Rg":_godot_js_fetch_http_status_get,"Ug":_godot_js_fetch_is_chunked,"Sg":_godot_js_fetch_read_chunk,"Qg":_godot_js_fetch_read_headers,"n":_godot_js_fetch_state_get,"cf":_godot_js_input_drop_files_cb,"ef":_godot_js_input_gamepad_cb,"Ve":_godot_js_input_gamepad_sample,"sf":_godot_js_input_gamepad_sample_count,"rf":_godot_js_input_gamepad_sample_get,"ff":_godot_js_input_key_cb,"lf":_godot_js_input_mouse_button_cb,"jf":_godot_js_input_mouse_move_cb,"hf":_godot_js_input_mouse_wheel_cb,"df":_godot_js_input_paste_cb,"gf":_godot_js_input_touch_cb,"Ke":_godot_js_input_vibrate_handheld,"Gg":_godot_js_os_download_buffer,"Re":_godot_js_os_execute,"Cg":_godot_js_os_finish_async,"Ge":_godot_js_os_fs_is_persistent,"We":_godot_js_os_fs_sync,"Pe":_godot_js_os_hw_concurrency_get,"Ie":_godot_js_os_request_quit_cb,"Le":_godot_js_os_shell_open,"Ee":_godot_js_pwa_cb,"Je":_godot_js_pwa_update,"De":_godot_js_rtc_datachannel_close,"mh":_godot_js_rtc_datachannel_connect,"jh":_godot_js_rtc_datachannel_destroy,"nh":_godot_js_rtc_datachannel_get_buffered_amount,"ze":_godot_js_rtc_datachannel_id_get,"we":_godot_js_rtc_datachannel_is_negotiated,"Ae":_godot_js_rtc_datachannel_is_ordered,"lh":_godot_js_rtc_datachannel_label_get,"ye":_godot_js_rtc_datachannel_max_packet_lifetime_get,"xe":_godot_js_rtc_datachannel_max_retransmits_get,"kh":_godot_js_rtc_datachannel_protocol_get,"Ce":_godot_js_rtc_datachannel_ready_state_get,"Be":_godot_js_rtc_datachannel_send,"ih":_godot_js_rtc_pc_close,"ch":_godot_js_rtc_pc_create,"bh":_godot_js_rtc_pc_datachannel_create,"ve":_godot_js_rtc_pc_destroy,"eh":_godot_js_rtc_pc_ice_candidate_add,"gh":_godot_js_rtc_pc_local_description_set,"hh":_godot_js_rtc_pc_offer_create,"fh":_godot_js_rtc_pc_remote_description_set,"ue":_godot_js_websocket_buffered_amount,"$g":_godot_js_websocket_close,"_g":_godot_js_websocket_create,"te":_godot_js_websocket_destroy,"ah":_godot_js_websocket_send,"Kg":_godot_js_wrapper_create_cb,"Ig":_godot_js_wrapper_create_object,"Jg":_godot_js_wrapper_interface_get,"Lg":_godot_js_wrapper_object_call,"Ng":_godot_js_wrapper_object_get,"Bc":_godot_js_wrapper_object_getvar,"Og":_godot_js_wrapper_object_set,"Mg":_godot_js_wrapper_object_setvar,"Eg":_godot_js_wrapper_object_unref,"l":invoke_ii,"j":invoke_iii,"Af":invoke_iiii,"s":invoke_iiiii,"zf":invoke_iiiiiii,"g":invoke_vi,"f":invoke_vii,"t":invoke_viii,"r":invoke_viiiiiii,"a":wasmMemory||Module["wasmMemory"],"c":_setTempRet0,"se":_strftime};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["rh"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["sh"]).apply(null,arguments)};var __Z13godot_js_mainiPPc=Module["__Z13godot_js_mainiPPc"]=function(){return(__Z13godot_js_mainiPPc=Module["__Z13godot_js_mainiPPc"]=Module["asm"]["th"]).apply(null,arguments)};var _emscripten_webgl_commit_frame=Module["_emscripten_webgl_commit_frame"]=function(){return(_emscripten_webgl_commit_frame=Module["_emscripten_webgl_commit_frame"]=Module["asm"]["uh"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["vh"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["wh"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["xh"]).apply(null,arguments)};var _htons=Module["_htons"]=function(){return(_htons=Module["_htons"]=Module["asm"]["yh"]).apply(null,arguments)};var _ntohs=Module["_ntohs"]=function(){return(_ntohs=Module["_ntohs"]=Module["asm"]["zh"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["Ah"]).apply(null,arguments)};var _emscripten_tls_init=Module["_emscripten_tls_init"]=function(){return(_emscripten_tls_init=Module["_emscripten_tls_init"]=Module["asm"]["Bh"]).apply(null,arguments)};var _emscripten_builtin_memalign=Module["_emscripten_builtin_memalign"]=function(){return(_emscripten_builtin_memalign=Module["_emscripten_builtin_memalign"]=Module["asm"]["Ch"]).apply(null,arguments)};var _emscripten_webgl_get_current_context=Module["_emscripten_webgl_get_current_context"]=function(){return(_emscripten_webgl_get_current_context=Module["_emscripten_webgl_get_current_context"]=Module["asm"]["Dh"]).apply(null,arguments)};var _emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=function(){return(_emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=Module["asm"]["Eh"]).apply(null,arguments)};var ___stdio_exit=Module["___stdio_exit"]=function(){return(___stdio_exit=Module["___stdio_exit"]=Module["asm"]["Fh"]).apply(null,arguments)};var ___funcs_on_exit=Module["___funcs_on_exit"]=function(){return(___funcs_on_exit=Module["___funcs_on_exit"]=Module["asm"]["Gh"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["Hh"]).apply(null,arguments)};var __emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=function(){return(__emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=Module["asm"]["Ih"]).apply(null,arguments)};var _htonl=Module["_htonl"]=function(){return(_htonl=Module["_htonl"]=Module["asm"]["Kh"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["Lh"]).apply(null,arguments)};var __emscripten_proxy_execute_task_queue=Module["__emscripten_proxy_execute_task_queue"]=function(){return(__emscripten_proxy_execute_task_queue=Module["__emscripten_proxy_execute_task_queue"]=Module["asm"]["Mh"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["Nh"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["Oh"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["Ph"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["Qh"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["Rh"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["Sh"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["Th"]).apply(null,arguments)};var __emscripten_allow_main_runtime_queued_calls=Module["__emscripten_allow_main_runtime_queued_calls"]=1849404;function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}Module["cwrap"]=cwrap;Module["callMain"]=callMain;Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;Module["PThread"]=PThread;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}var calledMain=false;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];args=args||[];var argc=args.length+1;var argv=stackAlloc((argc+1)*4);GROWABLE_HEAP_I32()[argv>>2]=allocateUTF8OnStack(thisProgram);for(var i=1;i<argc;i++){GROWABLE_HEAP_I32()[(argv>>2)+i]=allocateUTF8OnStack(args[i-1])}GROWABLE_HEAP_I32()[(argv>>2)+argc]=0;try{var ret=entryFunction(argc,argv);exit(ret,true);return ret}catch(e){return handleException(e)}finally{calledMain=true}}function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){readyPromiseResolve(Module);initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}if(!keepRuntimeAlive()){exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=false;if(Module["noInitialRun"])shouldRunNow=false;run();
+
+
+ return Godot.ready
+}
+);
+})();
+if (typeof exports === 'object' && typeof module === 'object')
+ module.exports = Godot;
+else if (typeof define === 'function' && define['amd'])
+ define([], function() { return Godot; });
+else if (typeof exports === 'object')
+ exports["Godot"] = Godot;
+
+const Preloader = /** @constructor */ function () { // eslint-disable-line no-unused-vars
+ function getTrackedResponse(response, load_status) {
+ function onloadprogress(reader, controller) {
+ return reader.read().then(function (result) {
+ if (load_status.done) {
+ return Promise.resolve();
+ }
+ if (result.value) {
+ controller.enqueue(result.value);
+ load_status.loaded += result.value.length;
+ }
+ if (!result.done) {
+ return onloadprogress(reader, controller);
+ }
+ load_status.done = true;
+ return Promise.resolve();
+ });
+ }
+ const reader = response.body.getReader();
+ return new Response(new ReadableStream({
+ start: function (controller) {
+ onloadprogress(reader, controller).then(function () {
+ controller.close();
+ });
+ },
+ }), { headers: response.headers });
+ }
+
+ function loadFetch(file, tracker, fileSize, raw) {
+ tracker[file] = {
+ total: fileSize || 0,
+ loaded: 0,
+ done: false,
+ };
+ return fetch(file).then(function (response) {
+ if (!response.ok) {
+ return Promise.reject(new Error(`Failed loading file '${file}'`));
+ }
+ const tr = getTrackedResponse(response, tracker[file]);
+ if (raw) {
+ return Promise.resolve(tr);
+ }
+ return tr.arrayBuffer();
+ });
+ }
+
+ function retry(func, attempts = 1) {
+ function onerror(err) {
+ if (attempts <= 1) {
+ return Promise.reject(err);
+ }
+ return new Promise(function (resolve, reject) {
+ setTimeout(function () {
+ retry(func, attempts - 1).then(resolve).catch(reject);
+ }, 1000);
+ });
+ }
+ return func().catch(onerror);
+ }
+
+ const DOWNLOAD_ATTEMPTS_MAX = 4;
+ const loadingFiles = {};
+ const lastProgress = { loaded: 0, total: 0 };
+ let progressFunc = null;
+
+ const animateProgress = function () {
+ let loaded = 0;
+ let total = 0;
+ let totalIsValid = true;
+ let progressIsFinal = true;
+
+ Object.keys(loadingFiles).forEach(function (file) {
+ const stat = loadingFiles[file];
+ if (!stat.done) {
+ progressIsFinal = false;
+ }
+ if (!totalIsValid || stat.total === 0) {
+ totalIsValid = false;
+ total = 0;
+ } else {
+ total += stat.total;
+ }
+ loaded += stat.loaded;
+ });
+ if (loaded !== lastProgress.loaded || total !== lastProgress.total) {
+ lastProgress.loaded = loaded;
+ lastProgress.total = total;
+ if (typeof progressFunc === 'function') {
+ progressFunc(loaded, total);
+ }
+ }
+ if (!progressIsFinal) {
+ requestAnimationFrame(animateProgress);
+ }
+ };
+
+ this.animateProgress = animateProgress;
+
+ this.setProgressFunc = function (callback) {
+ progressFunc = callback;
+ };
+
+ this.loadPromise = function (file, fileSize, raw = false) {
+ return retry(loadFetch.bind(null, file, loadingFiles, fileSize, raw), DOWNLOAD_ATTEMPTS_MAX);
+ };
+
+ this.preloadedFiles = [];
+ this.preload = function (pathOrBuffer, destPath, fileSize) {
+ let buffer = null;
+ if (typeof pathOrBuffer === 'string') {
+ const me = this;
+ return this.loadPromise(pathOrBuffer, fileSize).then(function (buf) {
+ me.preloadedFiles.push({
+ path: destPath || pathOrBuffer,
+ buffer: buf,
+ });
+ return Promise.resolve();
+ });
+ } else if (pathOrBuffer instanceof ArrayBuffer) {
+ buffer = new Uint8Array(pathOrBuffer);
+ } else if (ArrayBuffer.isView(pathOrBuffer)) {
+ buffer = new Uint8Array(pathOrBuffer.buffer);
+ }
+ if (buffer) {
+ this.preloadedFiles.push({
+ path: destPath,
+ buffer: pathOrBuffer,
+ });
+ return Promise.resolve();
+ }
+ return Promise.reject(new Error('Invalid object for preloading'));
+ };
+};
+
+/**
+ * An object used to configure the Engine instance based on godot export options, and to override those in custom HTML
+ * templates if needed.
+ *
+ * @header Engine configuration
+ * @summary The Engine configuration object. This is just a typedef, create it like a regular object, e.g.:
+ *
+ * ``const MyConfig = { executable: 'godot', unloadAfterInit: false }``
+ *
+ * @typedef {Object} EngineConfig
+ */
+const EngineConfig = {}; // eslint-disable-line no-unused-vars
+
+/**
+ * @struct
+ * @constructor
+ * @ignore
+ */
+const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-vars
+ const cfg = /** @lends {InternalConfig.prototype} */ {
+ /**
+ * Whether the unload the engine automatically after the instance is initialized.
+ *
+ * @memberof EngineConfig
+ * @default
+ * @type {boolean}
+ */
+ unloadAfterInit: true,
+ /**
+ * The HTML DOM Canvas object to use.
+ *
+ * By default, the first canvas element in the document will be used is none is specified.
+ *
+ * @memberof EngineConfig
+ * @default
+ * @type {?HTMLCanvasElement}
+ */
+ canvas: null,
+ /**
+ * The name of the WASM file without the extension. (Set by Godot Editor export process).
+ *
+ * @memberof EngineConfig
+ * @default
+ * @type {string}
+ */
+ executable: '',
+ /**
+ * An alternative name for the game pck to load. The executable name is used otherwise.
+ *
+ * @memberof EngineConfig
+ * @default
+ * @type {?string}
+ */
+ mainPack: null,
+ /**
+ * Specify a language code to select the proper localization for the game.
+ *
+ * The browser locale will be used if none is specified. See complete list of
+ * :ref:`supported locales <doc_locales>`.
+ *
+ * @memberof EngineConfig
+ * @type {?string}
+ * @default
+ */
+ locale: null,
+ /**
+ * The canvas resize policy determines how the canvas should be resized by Godot.
+ *
+ * ``0`` means Godot won't do any resizing. This is useful if you want to control the canvas size from
+ * javascript code in your template.
+ *
+ * ``1`` means Godot will resize the canvas on start, and when changing window size via engine functions.
+ *
+ * ``2`` means Godot will adapt the canvas size to match the whole browser window.
+ *
+ * @memberof EngineConfig
+ * @type {number}
+ * @default
+ */
+ canvasResizePolicy: 2,
+ /**
+ * The arguments to be passed as command line arguments on startup.
+ *
+ * See :ref:`command line tutorial <doc_command_line_tutorial>`.
+ *
+ * **Note**: :js:meth:`startGame <Engine.prototype.startGame>` will always add the ``--main-pack`` argument.
+ *
+ * @memberof EngineConfig
+ * @type {Array<string>}
+ * @default
+ */
+ args: [],
+ /**
+ * When enabled, the game canvas will automatically grab the focus when the engine starts.
+ *
+ * @memberof EngineConfig
+ * @type {boolean}
+ * @default
+ */
+ focusCanvas: true,
+ /**
+ * When enabled, this will turn on experimental virtual keyboard support on mobile.
+ *
+ * @memberof EngineConfig
+ * @type {boolean}
+ * @default
+ */
+ experimentalVK: false,
+ /**
+ * The progressive web app service worker to install.
+ * @memberof EngineConfig
+ * @default
+ * @type {string}
+ */
+ serviceWorker: '',
+ /**
+ * @ignore
+ * @type {Array.<string>}
+ */
+ persistentPaths: ['/userfs'],
+ /**
+ * @ignore
+ * @type {boolean}
+ */
+ persistentDrops: false,
+ /**
+ * @ignore
+ * @type {Array.<string>}
+ */
+ gdnativeLibs: [],
+ /**
+ * @ignore
+ * @type {Array.<string>}
+ */
+ fileSizes: [],
+ /**
+ * A callback function for handling Godot's ``OS.execute`` calls.
+ *
+ * This is for example used in the Web Editor template to switch between project manager and editor, and for running the game.
+ *
+ * @callback EngineConfig.onExecute
+ * @param {string} path The path that Godot's wants executed.
+ * @param {Array.<string>} args The arguments of the "command" to execute.
+ */
+ /**
+ * @ignore
+ * @type {?function(string, Array.<string>)}
+ */
+ onExecute: null,
+ /**
+ * A callback function for being notified when the Godot instance quits.
+ *
+ * **Note**: This function will not be called if the engine crashes or become unresponsive.
+ *
+ * @callback EngineConfig.onExit
+ * @param {number} status_code The status code returned by Godot on exit.
+ */
+ /**
+ * @ignore
+ * @type {?function(number)}
+ */
+ onExit: null,
+ /**
+ * A callback function for displaying download progress.
+ *
+ * The function is called once per frame while downloading files, so the usage of ``requestAnimationFrame()``
+ * is not necessary.
+ *
+ * If the callback function receives a total amount of bytes as 0, this means that it is impossible to calculate.
+ * Possible reasons include:
+ *
+ * - Files are delivered with server-side chunked compression
+ * - Files are delivered with server-side compression on Chromium
+ * - Not all file downloads have started yet (usually on servers without multi-threading)
+ *
+ * @callback EngineConfig.onProgress
+ * @param {number} current The current amount of downloaded bytes so far.
+ * @param {number} total The total amount of bytes to be downloaded.
+ */
+ /**
+ * @ignore
+ * @type {?function(number, number)}
+ */
+ onProgress: null,
+ /**
+ * A callback function for handling the standard output stream. This method should usually only be used in debug pages.
+ *
+ * By default, ``console.log()`` is used.
+ *
+ * @callback EngineConfig.onPrint
+ * @param {...*} [var_args] A variadic number of arguments to be printed.
+ */
+ /**
+ * @ignore
+ * @type {?function(...*)}
+ */
+ onPrint: function () {
+ console.log.apply(console, Array.from(arguments)); // eslint-disable-line no-console
+ },
+ /**
+ * A callback function for handling the standard error stream. This method should usually only be used in debug pages.
+ *
+ * By default, ``console.error()`` is used.
+ *
+ * @callback EngineConfig.onPrintError
+ * @param {...*} [var_args] A variadic number of arguments to be printed as errors.
+ */
+ /**
+ * @ignore
+ * @type {?function(...*)}
+ */
+ onPrintError: function (var_args) {
+ console.error.apply(console, Array.from(arguments)); // eslint-disable-line no-console
+ },
+ };
+
+ /**
+ * @ignore
+ * @struct
+ * @constructor
+ * @param {EngineConfig} opts
+ */
+ function Config(opts) {
+ this.update(opts);
+ }
+
+ Config.prototype = cfg;
+
+ /**
+ * @ignore
+ * @param {EngineConfig} opts
+ */
+ Config.prototype.update = function (opts) {
+ const config = opts || {};
+ // NOTE: We must explicitly pass the default, accessing it via
+ // the key will fail due to closure compiler renames.
+ function parse(key, def) {
+ if (typeof (config[key]) === 'undefined') {
+ return def;
+ }
+ return config[key];
+ }
+ // Module config
+ this.unloadAfterInit = parse('unloadAfterInit', this.unloadAfterInit);
+ this.onPrintError = parse('onPrintError', this.onPrintError);
+ this.onPrint = parse('onPrint', this.onPrint);
+ this.onProgress = parse('onProgress', this.onProgress);
+
+ // Godot config
+ this.canvas = parse('canvas', this.canvas);
+ this.executable = parse('executable', this.executable);
+ this.mainPack = parse('mainPack', this.mainPack);
+ this.locale = parse('locale', this.locale);
+ this.canvasResizePolicy = parse('canvasResizePolicy', this.canvasResizePolicy);
+ this.persistentPaths = parse('persistentPaths', this.persistentPaths);
+ this.persistentDrops = parse('persistentDrops', this.persistentDrops);
+ this.experimentalVK = parse('experimentalVK', this.experimentalVK);
+ this.focusCanvas = parse('focusCanvas', this.focusCanvas);
+ this.serviceWorker = parse('serviceWorker', this.serviceWorker);
+ this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs);
+ this.fileSizes = parse('fileSizes', this.fileSizes);
+ this.args = parse('args', this.args);
+ this.onExecute = parse('onExecute', this.onExecute);
+ this.onExit = parse('onExit', this.onExit);
+ };
+
+ /**
+ * @ignore
+ * @param {string} loadPath
+ * @param {Response} response
+ */
+ Config.prototype.getModuleConfig = function (loadPath, response) {
+ let r = response;
+ return {
+ 'print': this.onPrint,
+ 'printErr': this.onPrintError,
+ 'thisProgram': this.executable,
+ 'noExitRuntime': true,
+ 'dynamicLibraries': [`${loadPath}.side.wasm`],
+ 'instantiateWasm': function (imports, onSuccess) {
+ function done(result) {
+ onSuccess(result['instance'], result['module']);
+ }
+ if (typeof (WebAssembly.instantiateStreaming) !== 'undefined') {
+ WebAssembly.instantiateStreaming(Promise.resolve(r), imports).then(done);
+ } else {
+ r.arrayBuffer().then(function (buffer) {
+ WebAssembly.instantiate(buffer, imports).then(done);
+ });
+ }
+ r = null;
+ return {};
+ },
+ 'locateFile': function (path) {
+ if (path.endsWith('.worker.js')) {
+ return `${loadPath}.worker.js`;
+ } else if (path.endsWith('.audio.worklet.js')) {
+ return `${loadPath}.audio.worklet.js`;
+ } else if (path.endsWith('.js')) {
+ return `${loadPath}.js`;
+ } else if (path.endsWith('.side.wasm')) {
+ return `${loadPath}.side.wasm`;
+ } else if (path.endsWith('.wasm')) {
+ return `${loadPath}.wasm`;
+ }
+ return path;
+ },
+ };
+ };
+
+ /**
+ * @ignore
+ * @param {function()} cleanup
+ */
+ Config.prototype.getGodotConfig = function (cleanup) {
+ // Try to find a canvas
+ if (!(this.canvas instanceof HTMLCanvasElement)) {
+ const nodes = document.getElementsByTagName('canvas');
+ if (nodes.length && nodes[0] instanceof HTMLCanvasElement) {
+ this.canvas = nodes[0];
+ }
+ if (!this.canvas) {
+ throw new Error('No canvas found in page');
+ }
+ }
+ // Canvas can grab focus on click, or key events won't work.
+ if (this.canvas.tabIndex < 0) {
+ this.canvas.tabIndex = 0;
+ }
+
+ // Browser locale, or custom one if defined.
+ let locale = this.locale;
+ if (!locale) {
+ locale = navigator.languages ? navigator.languages[0] : navigator.language;
+ locale = locale.split('.')[0];
+ }
+ locale = locale.replace('-', '_');
+ const onExit = this.onExit;
+
+ // Godot configuration.
+ return {
+ 'canvas': this.canvas,
+ 'canvasResizePolicy': this.canvasResizePolicy,
+ 'locale': locale,
+ 'persistentDrops': this.persistentDrops,
+ 'virtualKeyboard': this.experimentalVK,
+ 'focusCanvas': this.focusCanvas,
+ 'onExecute': this.onExecute,
+ 'onExit': function (p_code) {
+ cleanup(); // We always need to call the cleanup callback to free memory.
+ if (typeof (onExit) === 'function') {
+ onExit(p_code);
+ }
+ },
+ };
+ };
+ return new Config(initConfig);
+};
+
+/**
+ * Projects exported for the Web expose the :js:class:`Engine` class to the JavaScript environment, that allows
+ * fine control over the engine's start-up process.
+ *
+ * This API is built in an asynchronous manner and requires basic understanding
+ * of `Promises <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises>`__.
+ *
+ * @module Engine
+ * @header HTML5 shell class reference
+ */
+const Engine = (function () {
+ const preloader = new Preloader();
+
+ let loadPromise = null;
+ let loadPath = '';
+ let initPromise = null;
+
+ /**
+ * @classdesc The ``Engine`` class provides methods for loading and starting exported projects on the Web. For default export
+ * settings, this is already part of the exported HTML page. To understand practical use of the ``Engine`` class,
+ * see :ref:`Custom HTML page for Web export <doc_customizing_html5_shell>`.
+ *
+ * @description Create a new Engine instance with the given configuration.
+ *
+ * @global
+ * @constructor
+ * @param {EngineConfig} initConfig The initial config for this instance.
+ */
+ function Engine(initConfig) { // eslint-disable-line no-shadow
+ this.config = new InternalConfig(initConfig);
+ this.rtenv = null;
+ }
+
+ /**
+ * Load the engine from the specified base path.
+ *
+ * @param {string} basePath Base path of the engine to load.
+ * @param {number=} [size=0] The file size if known.
+ * @returns {Promise} A Promise that resolves once the engine is loaded.
+ *
+ * @function Engine.load
+ */
+ Engine.load = function (basePath, size) {
+ if (loadPromise == null) {
+ loadPath = basePath;
+ loadPromise = preloader.loadPromise(`${loadPath}.wasm`, size, true);
+ requestAnimationFrame(preloader.animateProgress);
+ }
+ return loadPromise;
+ };
+
+ /**
+ * Unload the engine to free memory.
+ *
+ * This method will be called automatically depending on the configuration. See :js:attr:`unloadAfterInit`.
+ *
+ * @function Engine.unload
+ */
+ Engine.unload = function () {
+ loadPromise = null;
+ };
+
+ /**
+ * Check whether WebGL is available. Optionally, specify a particular version of WebGL to check for.
+ *
+ * @param {number=} [majorVersion=1] The major WebGL version to check for.
+ * @returns {boolean} If the given major version of WebGL is available.
+ * @function Engine.isWebGLAvailable
+ */
+ Engine.isWebGLAvailable = function (majorVersion = 1) {
+ try {
+ return !!document.createElement('canvas').getContext(['webgl', 'webgl2'][majorVersion - 1]);
+ } catch (e) { /* Not available */ }
+ return false;
+ };
+
+ /**
+ * Safe Engine constructor, creates a new prototype for every new instance to avoid prototype pollution.
+ * @ignore
+ * @constructor
+ */
+ function SafeEngine(initConfig) {
+ const proto = /** @lends Engine.prototype */ {
+ /**
+ * Initialize the engine instance. Optionally, pass the base path to the engine to load it,
+ * if it hasn't been loaded yet. See :js:meth:`Engine.load`.
+ *
+ * @param {string=} basePath Base path of the engine to load.
+ * @return {Promise} A ``Promise`` that resolves once the engine is loaded and initialized.
+ */
+ init: function (basePath) {
+ if (initPromise) {
+ return initPromise;
+ }
+ if (loadPromise == null) {
+ if (!basePath) {
+ initPromise = Promise.reject(new Error('A base path must be provided when calling `init` and the engine is not loaded.'));
+ return initPromise;
+ }
+ Engine.load(basePath, this.config.fileSizes[`${basePath}.wasm`]);
+ }
+ const me = this;
+ function doInit(promise) {
+ // Care! Promise chaining is bogus with old emscripten versions.
+ // This caused a regression with the Mono build (which uses an older emscripten version).
+ // Make sure to test that when refactoring.
+ return new Promise(function (resolve, reject) {
+ promise.then(function (response) {
+ const cloned = new Response(response.clone().body, { 'headers': [['content-type', 'application/wasm']] });
+ Godot(me.config.getModuleConfig(loadPath, cloned)).then(function (module) {
+ const paths = me.config.persistentPaths;
+ module['initFS'](paths).then(function (err) {
+ me.rtenv = module;
+ if (me.config.unloadAfterInit) {
+ Engine.unload();
+ }
+ resolve();
+ });
+ });
+ });
+ });
+ }
+ preloader.setProgressFunc(this.config.onProgress);
+ initPromise = doInit(loadPromise);
+ return initPromise;
+ },
+
+ /**
+ * Load a file so it is available in the instance's file system once it runs. Must be called **before** starting the
+ * instance.
+ *
+ * If not provided, the ``path`` is derived from the URL of the loaded file.
+ *
+ * @param {string|ArrayBuffer} file The file to preload.
+ *
+ * If a ``string`` the file will be loaded from that path.
+ *
+ * If an ``ArrayBuffer`` or a view on one, the buffer will used as the content of the file.
+ *
+ * @param {string=} path Path by which the file will be accessible. Required, if ``file`` is not a string.
+ *
+ * @returns {Promise} A Promise that resolves once the file is loaded.
+ */
+ preloadFile: function (file, path) {
+ return preloader.preload(file, path, this.config.fileSizes[file]);
+ },
+
+ /**
+ * Start the engine instance using the given override configuration (if any).
+ * :js:meth:`startGame <Engine.prototype.startGame>` can be used in typical cases instead.
+ *
+ * This will initialize the instance if it is not initialized. For manual initialization, see :js:meth:`init <Engine.prototype.init>`.
+ * The engine must be loaded beforehand.
+ *
+ * Fails if a canvas cannot be found on the page, or not specified in the configuration.
+ *
+ * @param {EngineConfig} override An optional configuration override.
+ * @return {Promise} Promise that resolves once the engine started.
+ */
+ start: function (override) {
+ this.config.update(override);
+ const me = this;
+ return me.init().then(function () {
+ if (!me.rtenv) {
+ return Promise.reject(new Error('The engine must be initialized before it can be started'));
+ }
+
+ let config = {};
+ try {
+ config = me.config.getGodotConfig(function () {
+ me.rtenv = null;
+ });
+ } catch (e) {
+ return Promise.reject(e);
+ }
+ // Godot configuration.
+ me.rtenv['initConfig'](config);
+
+ // Preload GDNative libraries.
+ const libs = [];
+ me.config.gdnativeLibs.forEach(function (lib) {
+ libs.push(me.rtenv['loadDynamicLibrary'](lib, { 'loadAsync': true }));
+ });
+ return Promise.all(libs).then(function () {
+ return new Promise(function (resolve, reject) {
+ preloader.preloadedFiles.forEach(function (file) {
+ me.rtenv['copyToFS'](file.path, file.buffer);
+ });
+ preloader.preloadedFiles.length = 0; // Clear memory
+ me.rtenv['callMain'](me.config.args);
+ initPromise = null;
+ if (me.config.serviceWorker && 'serviceWorker' in navigator) {
+ navigator.serviceWorker.register(me.config.serviceWorker);
+ }
+ resolve();
+ });
+ });
+ });
+ },
+
+ /**
+ * Start the game instance using the given configuration override (if any).
+ *
+ * This will initialize the instance if it is not initialized. For manual initialization, see :js:meth:`init <Engine.prototype.init>`.
+ *
+ * This will load the engine if it is not loaded, and preload the main pck.
+ *
+ * This method expects the initial config (or the override) to have both the :js:attr:`executable` and :js:attr:`mainPack`
+ * properties set (normally done by the editor during export).
+ *
+ * @param {EngineConfig} override An optional configuration override.
+ * @return {Promise} Promise that resolves once the game started.
+ */
+ startGame: function (override) {
+ this.config.update(override);
+ // Add main-pack argument.
+ const exe = this.config.executable;
+ const pack = this.config.mainPack || `${exe}.pck`;
+ this.config.args = ['--main-pack', pack].concat(this.config.args);
+ // Start and init with execName as loadPath if not inited.
+ const me = this;
+ return Promise.all([
+ this.init(exe),
+ this.preloadFile(pack, pack),
+ ]).then(function () {
+ return me.start.apply(me);
+ });
+ },
+
+ /**
+ * Create a file at the specified ``path`` with the passed as ``buffer`` in the instance's file system.
+ *
+ * @param {string} path The location where the file will be created.
+ * @param {ArrayBuffer} buffer The content of the file.
+ */
+ copyToFS: function (path, buffer) {
+ if (this.rtenv == null) {
+ throw new Error('Engine must be inited before copying files');
+ }
+ this.rtenv['copyToFS'](path, buffer);
+ },
+
+ /**
+ * Request that the current instance quit.
+ *
+ * This is akin the user pressing the close button in the window manager, and will
+ * have no effect if the engine has crashed, or is stuck in a loop.
+ *
+ */
+ requestQuit: function () {
+ if (this.rtenv) {
+ this.rtenv['request_quit']();
+ }
+ },
+ };
+
+ Engine.prototype = proto;
+ // Closure compiler exported instance methods.
+ Engine.prototype['init'] = Engine.prototype.init;
+ Engine.prototype['preloadFile'] = Engine.prototype.preloadFile;
+ Engine.prototype['start'] = Engine.prototype.start;
+ Engine.prototype['startGame'] = Engine.prototype.startGame;
+ Engine.prototype['copyToFS'] = Engine.prototype.copyToFS;
+ Engine.prototype['requestQuit'] = Engine.prototype.requestQuit;
+ // Also expose static methods as instance methods
+ Engine.prototype['load'] = Engine.load;
+ Engine.prototype['unload'] = Engine.unload;
+ Engine.prototype['isWebGLAvailable'] = Engine.isWebGLAvailable;
+ return new Engine(initConfig);
+ }
+
+ // Closure compiler exported static methods.
+ SafeEngine['load'] = Engine.load;
+ SafeEngine['unload'] = Engine.unload;
+ SafeEngine['isWebGLAvailable'] = Engine.isWebGLAvailable;
+
+ return SafeEngine;
+}());
+if (typeof window !== 'undefined') {
+ window['Engine'] = Engine;
+}
diff --git a/lite_music.wav b/index.pck
index fbb17cf..61f9a22 100644
--- a/lite_music.wav
+++ b/index.pck
Binary files differ
diff --git a/index.png b/index.png
new file mode 100644
index 0000000..6b436b2
--- /dev/null
+++ b/index.png
Binary files differ
diff --git a/index.wasm b/index.wasm
new file mode 100644
index 0000000..d9116dd
--- /dev/null
+++ b/index.wasm
Binary files differ
diff --git a/index.worker.js b/index.worker.js
new file mode 100644
index 0000000..f8bbc7b
--- /dev/null
+++ b/index.worker.js
@@ -0,0 +1 @@
+"use strict";var Module={};var initializedJS=false;var pendingNotifiedProxyingQueues=[];function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=((info,receiveInstance)=>{var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports});self.onmessage=(e=>{try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob=="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}Godot(Module).then(function(instance){Module=instance})}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInit();if(!initializedJS){pendingNotifiedProxyingQueues.forEach(queue=>{Module["executeNotifiedProxyingQueue"](queue)});pendingNotifiedProxyingQueues=[];initializedJS=true}try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(Module["keepRuntimeAlive"]()){Module["PThread"].setExitStatus(result)}else{Module["__emscripten_thread_exit"](result)}}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processProxyingQueue"){if(initializedJS){Module["executeNotifiedProxyingQueue"](e.data.queue)}else{pendingNotifiedProxyingQueues.push(e.data.queue)}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);if(Module["__emscripten_thread_crashed"]){Module["__emscripten_thread_crashed"]()}throw ex}});
diff --git a/light.png b/light.png
deleted file mode 100644
index 02a6db5..0000000
--- a/light.png
+++ /dev/null
Binary files differ
diff --git a/light.png.import b/light.png.import
deleted file mode 100644
index a6a492c..0000000
--- a/light.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/light.png-06e94102f0cce323cff7daad56cf3030.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://light.png"
-dest_files=[ "res://.import/light.png-06e94102f0cce323cff7daad56cf3030.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/light2.png b/light2.png
deleted file mode 100644
index d881238..0000000
--- a/light2.png
+++ /dev/null
Binary files differ
diff --git a/light2.png.import b/light2.png.import
deleted file mode 100644
index 8346d66..0000000
--- a/light2.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/light2.png-dee1bf19f8401eaf91e919d393d086f5.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://light2.png"
-dest_files=[ "res://.import/light2.png-dee1bf19f8401eaf91e919d393d086f5.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/lite_music.wav.import b/lite_music.wav.import
deleted file mode 100644
index 37b8651..0000000
--- a/lite_music.wav.import
+++ /dev/null
@@ -1,21 +0,0 @@
-[remap]
-
-importer="wav"
-type="AudioStreamSample"
-path="res://.import/lite_music.wav-8612a26230fdd6c75b9675c384a0f642.sample"
-
-[deps]
-
-source_file="res://lite_music.wav"
-dest_files=[ "res://.import/lite_music.wav-8612a26230fdd6c75b9675c384a0f642.sample" ]
-
-[params]
-
-force/8_bit=false
-force/mono=false
-force/max_rate=false
-force/max_rate_hz=44100
-edit/trim=false
-edit/normalize=false
-edit/loop=false
-compress/mode=0
diff --git a/motion_box.wav b/motion_box.wav
deleted file mode 100644
index fd9b973..0000000
--- a/motion_box.wav
+++ /dev/null
Binary files differ
diff --git a/motion_box.wav.import b/motion_box.wav.import
deleted file mode 100644
index 5ea14b3..0000000
--- a/motion_box.wav.import
+++ /dev/null
@@ -1,21 +0,0 @@
-[remap]
-
-importer="wav"
-type="AudioStreamSample"
-path="res://.import/motion_box.wav-738ca3888318f2d49b69099483b8cbb2.sample"
-
-[deps]
-
-source_file="res://motion_box.wav"
-dest_files=[ "res://.import/motion_box.wav-738ca3888318f2d49b69099483b8cbb2.sample" ]
-
-[params]
-
-force/8_bit=false
-force/mono=false
-force/max_rate=false
-force/max_rate_hz=44100
-edit/trim=false
-edit/normalize=false
-edit/loop=false
-compress/mode=0
diff --git a/pause.png b/pause.png
deleted file mode 100644
index d7d7b05..0000000
--- a/pause.png
+++ /dev/null
Binary files differ
diff --git a/pause.png.import b/pause.png.import
deleted file mode 100644
index 8aa515a..0000000
--- a/pause.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/pause.png-fae43b08edb08fdf891c9b1e11f62ed7.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://pause.png"
-dest_files=[ "res://.import/pause.png-fae43b08edb08fdf891c9b1e11f62ed7.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/project.godot b/project.godot
deleted file mode 100644
index 47f6832..0000000
--- a/project.godot
+++ /dev/null
@@ -1,172 +0,0 @@
-; Engine configuration file.
-; It's best edited using the editor UI and not directly,
-; since the parameters that go here are not all obvious.
-;
-; Format:
-; [section] ; section goes between []
-; param=value ; assign values to parameters
-
-config_version=4
-
-[application]
-
-config/name="sokoban"
-run/main_scene="res://StartScreen.tscn"
-config/use_custom_user_dir=true
-config/custom_user_dir_name="sokoban"
-boot_splash/image="res://icon.png"
-boot_splash/use_filter=false
-boot_splash/bg_color=Color( 0.141176, 0.141176, 0.141176, 0 )
-config/icon="res://icon.png"
-config/windows_native_icon="res://icon.ico"
-
-[autoload]
-
-Music="*res://Music.tscn"
-SoundFx="*res://SoundFX.tscn"
-Utils="*res://Utils.gd"
-MainInstances="*res://MainInstances.gd"
-globalsettings="*res://globalsettings.gd"
-SaveLoad="*res://Save_Load.gd"
-
-[debug]
-
-gdscript/warnings/narrowing_conversion=false
-gdscript/warnings/return_value_discarded=false
-
-[display]
-
-window/size/width=320
-window/size/height=320
-window/size/fullscreen=true
-window/size/test_width=1280
-window/size/test_height=720
-window/stretch/mode="2d"
-window/stretch/aspect="expand"
-
-[importer_defaults]
-
-texture={
-"compress/bptc_ldr": 0,
-"compress/hdr_mode": 0,
-"compress/lossy_quality": 0.7,
-"compress/mode": 0,
-"compress/normal_map": 0,
-"detect_3d": false,
-"flags/anisotropic": false,
-"flags/filter": false,
-"flags/mipmaps": false,
-"flags/repeat": 0,
-"flags/srgb": 2,
-"process/HDR_as_SRGB": false,
-"process/fix_alpha_border": true,
-"process/invert_color": false,
-"process/normal_map_invert_y": false,
-"process/premult_alpha": false,
-"size_limit": 0,
-"stream": false,
-"svg/scale": 1.0
-}
-
-[input]
-
-ui_accept={
-"deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777221,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777222,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
- ]
-}
-ui_select={
-"deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":3,"pressure":0.0,"pressed":false,"script":null)
- ]
-}
-ui_left={
-"deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
-, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
- ]
-}
-ui_right={
-"deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
-, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
- ]
-}
-ui_up={
-"deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
-, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
- ]
-}
-ui_down={
-"deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
-, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
- ]
-}
-level_reload={
-"deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":5,"pressure":0.0,"pressed":false,"script":null)
- ]
-}
-undo_last_move={
-"deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":90,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":true,"meta":true,"command":true,"pressed":false,"scancode":90,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
- ]
-}
-prtscrn={
-"deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":81,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
- ]
-}
-scrollup={
-"deadzone": 0.5,
-"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":4,"pressed":false,"doubleclick":false,"script":null)
- ]
-}
-scrolldown={
-"deadzone": 0.5,
-"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":5,"pressed":false,"doubleclick":false,"script":null)
- ]
-}
-next={
-"deadzone": 0.5,
-"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":92,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
- ]
-}
-
-[layer_names]
-
-2d_physics/layer_1="player"
-2d_physics/layer_2="box"
-
-[physics]
-
-common/enable_pause_aware_picking=true
-
-[rendering]
-
-quality/driver/driver_name="GLES2"
-quality/intended_usage/framebuffer_allocation=1
-quality/intended_usage/framebuffer_allocation.mobile=1
-threads/thread_model=2
-vram_compression/import_etc=true
-vram_compression/import_etc2=false
-quality/filters/anisotropic_filter_level=1
-environment/default_environment="res://default_env.tres"
diff --git a/settings.png b/settings.png
deleted file mode 100644
index 1d90f42..0000000
--- a/settings.png
+++ /dev/null
Binary files differ
diff --git a/settings.png.import b/settings.png.import
deleted file mode 100644
index 2faf385..0000000
--- a/settings.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/settings.png-ca1e7ab13a25083bf00852ad7dcec7ad.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://settings.png"
-dest_files=[ "res://.import/settings.png-ca1e7ab13a25083bf00852ad7dcec7ad.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/settingshover.png b/settingshover.png
deleted file mode 100644
index 1c25443..0000000
--- a/settingshover.png
+++ /dev/null
Binary files differ
diff --git a/settingshover.png.import b/settingshover.png.import
deleted file mode 100644
index c1b2cbd..0000000
--- a/settingshover.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/settingshover.png-2d84828ae06b96cd0a80e736fdacc9de.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://settingshover.png"
-dest_files=[ "res://.import/settingshover.png-2d84828ae06b96cd0a80e736fdacc9de.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/smallfont.tres b/smallfont.tres
deleted file mode 100644
index 644d717..0000000
--- a/smallfont.tres
+++ /dev/null
@@ -1,7 +0,0 @@
-[gd_resource type="DynamicFont" load_steps=2 format=2]
-
-[ext_resource path="res://04B_19__.TTF" type="DynamicFontData" id=1]
-
-[resource]
-size = 7
-font_data = ExtResource( 1 )
diff --git a/sokobanner.png b/sokobanner.png
deleted file mode 100644
index 3c1a0a1..0000000
--- a/sokobanner.png
+++ /dev/null
Binary files differ
diff --git a/sokobanner.png.import b/sokobanner.png.import
deleted file mode 100644
index c2161c5..0000000
--- a/sokobanner.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/sokobanner.png-f71309c3ebf55cd42f10170ef398c183.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://sokobanner.png"
-dest_files=[ "res://.import/sokobanner.png-f71309c3ebf55cd42f10170ef398c183.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/sound.wav b/sound.wav
deleted file mode 100644
index 037b743..0000000
--- a/sound.wav
+++ /dev/null
Binary files differ
diff --git a/sound.wav.import b/sound.wav.import
deleted file mode 100644
index b03a40e..0000000
--- a/sound.wav.import
+++ /dev/null
@@ -1,21 +0,0 @@
-[remap]
-
-importer="wav"
-type="AudioStreamSample"
-path="res://.import/sound.wav-26df8465d7a854262785830b78357950.sample"
-
-[deps]
-
-source_file="res://sound.wav"
-dest_files=[ "res://.import/sound.wav-26df8465d7a854262785830b78357950.sample" ]
-
-[params]
-
-force/8_bit=false
-force/mono=false
-force/max_rate=false
-force/max_rate_hz=44100
-edit/trim=false
-edit/normalize=false
-edit/loop=false
-compress/mode=0
diff --git a/spot.png b/spot.png
deleted file mode 100644
index c2b3fa9..0000000
--- a/spot.png
+++ /dev/null
Binary files differ
diff --git a/spot.png.import b/spot.png.import
deleted file mode 100644
index aac3111..0000000
--- a/spot.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/spot.png-36b4dfbff4efeea17ec3137d266ffc4a.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://spot.png"
-dest_files=[ "res://.import/spot.png-36b4dfbff4efeea17ec3137d266ffc4a.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/submodules/.gdignore b/submodules/.gdignore
deleted file mode 100644
index e69de29..0000000
--- a/submodules/.gdignore
+++ /dev/null
diff --git a/submodules/gdcli b/submodules/gdcli
deleted file mode 160000
-Subproject 6040364dae05d331f8d6c9d3d52186df1d0399c
diff --git a/swayshader.tres b/swayshader.tres
deleted file mode 100644
index 7ad80e1..0000000
--- a/swayshader.tres
+++ /dev/null
@@ -1,58 +0,0 @@
-[gd_resource type="ShaderMaterial" load_steps=2 format=2]
-
-[sub_resource type="Shader" id=1]
-code = "// original wind shader from https://github.com/Maujoe/godot-simple-wind-shader-2d/tree/master/assets/maujoe.simple_wind_shader_2d
-// original script modified by HungryProton so that the assets are moving differently : https://pastebin.com/VL3AfV8D
-//
-// speed - The speed of the wind movement.
-// minStrength - The minimal strength of the wind movement.
-// maxStrength - The maximal strength of the wind movement.
-// strengthScale - Scalefactor for the wind strength.
-// interval - The time between minimal and maximal strength changes.
-// detail - The detail (number of waves) of the wind movement.
-// distortion - The strength of geometry distortion.
-// heightOffset - The height where the wind begins to move. By default 0.0.
-
-shader_type canvas_item;
-render_mode blend_mix;
-
-// Wind settings.
-uniform float speed = 1.0;
-uniform float minStrength : hint_range(0.0, 1.0) = 0.05;
-uniform float maxStrength : hint_range(0.0, 1.0) = 0.01;
-uniform float strengthScale = 100.0;
-uniform float interval = 3.5;
-uniform float detail = 1.0;
-uniform float distortion : hint_range(0.0, 1.0);
-uniform float heightOffset : hint_range(0.0, 1.0);
-
-// With the offset value, you can if you want different moves for each asset. Just put a random value (1, 2, 3) in the editor. Don't forget to mark the material as unique if you use this
-uniform float offset = 0;
-
-
-float getWind(vec2 vertex, vec2 uv, float time){
- float diff = pow(maxStrength - minStrength, 2.0);
- float strength = clamp(minStrength + diff + sin(time / interval) * diff, minStrength, maxStrength) * strengthScale;
- float wind = (sin(time) + cos(time * detail)) * strength * max(0.0, (1.0-uv.y) - heightOffset);
-
- return wind;
-}
-
-void vertex() {
- vec4 pos = WORLD_MATRIX * vec4(0.0, 0.0, 0.0, 1.0);
- float time = TIME * speed + offset;
- //float time = TIME * speed + pos.x * pos.y ; not working when moving...
- VERTEX.x += getWind(VERTEX.xy, UV, time);
-}"
-
-[resource]
-shader = SubResource( 1 )
-shader_param/speed = 1.0
-shader_param/minStrength = 0.206
-shader_param/maxStrength = 0.01
-shader_param/strengthScale = 100.0
-shader_param/interval = 5.0
-shader_param/detail = 0.5
-shader_param/distortion = 0.0
-shader_param/heightOffset = 0.5
-shader_param/offset = 0.0
diff --git a/theme.tres b/theme.tres
deleted file mode 100644
index 081b167..0000000
--- a/theme.tres
+++ /dev/null
@@ -1,71 +0,0 @@
-[gd_resource type="Theme" load_steps=14 format=2]
-
-[ext_resource path="res://04B_19__.TTF" type="DynamicFontData" id=1]
-[ext_resource path="res://transparency.png" type="Texture" id=2]
-[ext_resource path="res://ButtonHoverStylebox.tres" type="StyleBox" id=3]
-[ext_resource path="res://ButtonStylebox.tres" type="StyleBox" id=4]
-[ext_resource path="res://font.tres" type="DynamicFont" id=5]
-[ext_resource path="res://unchecked_box.png" type="Texture" id=6]
-[ext_resource path="res://checked_box.png" type="Texture" id=7]
-[ext_resource path="res://focus_box.tres" type="StyleBox" id=8]
-
-[sub_resource type="StyleBoxEmpty" id=1]
-
-[sub_resource type="StyleBoxEmpty" id=5]
-
-[sub_resource type="DynamicFont" id=3]
-size = 14
-extra_spacing_top = 3
-extra_spacing_char = 1
-font_data = ExtResource( 1 )
-
-[sub_resource type="StyleBoxEmpty" id=6]
-
-[sub_resource type="StyleBoxFlat" id=4]
-bg_color = Color( 0.3009, 0.59, 0.3009, 1 )
-
-[resource]
-default_font = ExtResource( 5 )
-Button/colors/font_color = Color( 1, 1, 1, 1 )
-Button/colors/font_color_disabled = Color( 0.901961, 0.901961, 0.901961, 0 )
-Button/colors/font_color_focus = Color( 1, 1, 1, 1 )
-Button/colors/font_color_hover = Color( 0, 0, 0, 1 )
-Button/colors/font_color_pressed = Color( 0, 0, 0, 1 )
-Button/styles/disabled = SubResource( 1 )
-Button/styles/focus = ExtResource( 8 )
-Button/styles/hover = ExtResource( 3 )
-Button/styles/normal = ExtResource( 4 )
-Button/styles/pressed = ExtResource( 3 )
-CheckBox/colors/font_color = Color( 1, 1, 1, 1 )
-CheckBox/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 )
-CheckBox/colors/font_color_focus = Color( 1, 1, 1, 1 )
-CheckBox/colors/font_color_hover = Color( 0, 0, 0, 1 )
-CheckBox/colors/font_color_hover_pressed = Color( 0, 0, 0, 1 )
-CheckBox/colors/font_color_pressed = Color( 1, 1, 1, 1 )
-CheckBox/constants/check_vadjust = 0
-CheckBox/constants/hseparation = 9
-CheckBox/fonts/font = ExtResource( 5 )
-CheckBox/icons/checked = ExtResource( 7 )
-CheckBox/icons/checked_disabled = null
-CheckBox/icons/radio_checked = null
-CheckBox/icons/radio_checked_disabled = null
-CheckBox/icons/radio_unchecked = null
-CheckBox/icons/radio_unchecked_disabled = null
-CheckBox/icons/unchecked = ExtResource( 6 )
-CheckBox/icons/unchecked_disabled = null
-CheckBox/styles/disabled = SubResource( 5 )
-CheckBox/styles/focus = ExtResource( 8 )
-CheckBox/styles/hover = ExtResource( 3 )
-CheckBox/styles/hover_pressed = ExtResource( 3 )
-CheckBox/styles/normal = ExtResource( 4 )
-CheckBox/styles/pressed = ExtResource( 4 )
-LineEdit/colors/font_color_uneditable = Color( 0.878431, 0.878431, 0.878431, 0 )
-LineEdit/fonts/font = SubResource( 3 )
-LineEdit/styles/focus = ExtResource( 8 )
-LineEdit/styles/normal = ExtResource( 4 )
-LineEdit/styles/read_only = SubResource( 6 )
-ProgressBar/colors/font_color = Color( 1, 1, 1, 1 )
-ProgressBar/colors/font_color_shadow = Color( 0, 0, 0, 1 )
-ProgressBar/styles/bg = ExtResource( 4 )
-ProgressBar/styles/fg = SubResource( 4 )
-SpinBox/icons/updown = ExtResource( 2 )
diff --git a/tilemap.png b/tilemap.png
deleted file mode 100644
index f73ed2b..0000000
--- a/tilemap.png
+++ /dev/null
Binary files differ
diff --git a/tilemap.png.import b/tilemap.png.import
deleted file mode 100644
index 0cdbd51..0000000
--- a/tilemap.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/tilemap.png-838486f2ee5f5764f6a08fbb86e9df3c.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://tilemap.png"
-dest_files=[ "res://.import/tilemap.png-838486f2ee5f5764f6a08fbb86e9df3c.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/tilemap.tres b/tilemap.tres
deleted file mode 100644
index 32330f9..0000000
--- a/tilemap.tres
+++ /dev/null
@@ -1,490 +0,0 @@
-[gd_resource type="TileSet" load_steps=54 format=2]
-
-[ext_resource path="res://tilemap_normal.png" type="Texture" id=1]
-[ext_resource path="res://tilemap.png" type="Texture" id=2]
-
-[sub_resource type="ConvexPolygonShape2D" id=95]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=96]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=97]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=98]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=99]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=100]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=101]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=102]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=103]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=104]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=105]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=106]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=107]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=108]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=109]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=110]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=111]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=112]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=113]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=114]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=115]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=116]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=117]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=118]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=119]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=120]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=121]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=122]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=123]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=124]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=125]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=126]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=127]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=128]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=129]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=130]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=131]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=132]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=133]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=135]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=136]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=137]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=138]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=139]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=140]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=141]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=142]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=143]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=144]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=145]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[sub_resource type="ConvexPolygonShape2D" id=146]
-points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
-
-[resource]
-1/name = "tilemap.png 1"
-1/texture = ExtResource( 2 )
-1/normal_map = ExtResource( 1 )
-1/tex_offset = Vector2( 0, 0 )
-1/modulate = Color( 1, 1, 1, 1 )
-1/region = Rect2( 0, 0, 208, 96 )
-1/tile_mode = 1
-1/autotile/bitmask_mode = 1
-1/autotile/bitmask_flags = [ Vector2( 0, 0 ), 432, Vector2( 0, 1 ), 438, Vector2( 0, 2 ), 54, Vector2( 0, 3 ), 48, Vector2( 1, 0 ), 504, Vector2( 1, 1 ), 511, Vector2( 1, 2 ), 63, Vector2( 1, 3 ), 56, Vector2( 2, 0 ), 216, Vector2( 2, 1 ), 219, Vector2( 2, 2 ), 27, Vector2( 2, 3 ), 24, Vector2( 3, 0 ), 144, Vector2( 3, 1 ), 146, Vector2( 3, 2 ), 18, Vector2( 3, 3 ), 16, Vector2( 4, 0 ), 255, Vector2( 4, 1 ), 507, Vector2( 5, 0 ), 447, Vector2( 5, 1 ), 510, Vector2( 5, 2 ), 191, Vector2( 5, 3 ), 506, Vector2( 6, 0 ), 254, Vector2( 6, 1 ), 446, Vector2( 6, 2 ), 442, Vector2( 6, 3 ), 190, Vector2( 7, 0 ), 443, Vector2( 7, 1 ), 251, Vector2( 7, 2 ), 250, Vector2( 7, 3 ), 187, Vector2( 7, 4 ), 178, Vector2( 7, 5 ), 50, Vector2( 8, 0 ), 182, Vector2( 8, 1 ), 434, Vector2( 8, 2 ), 248, Vector2( 8, 3 ), 59, Vector2( 8, 4 ), 154, Vector2( 8, 5 ), 26, Vector2( 9, 0 ), 155, Vector2( 9, 1 ), 218, Vector2( 9, 2 ), 440, Vector2( 9, 3 ), 62, Vector2( 10, 0 ), 176, Vector2( 10, 1 ), 178, Vector2( 10, 2 ), 50, Vector2( 11, 0 ), 184, Vector2( 11, 1 ), 186, Vector2( 11, 2 ), 58, Vector2( 12, 0 ), 152, Vector2( 12, 1 ), 154, Vector2( 12, 2 ), 26 ]
-1/autotile/icon_coordinate = Vector2( 3, 3 )
-1/autotile/tile_size = Vector2( 16, 16 )
-1/autotile/spacing = 0
-1/autotile/occluder_map = [ ]
-1/autotile/navpoly_map = [ ]
-1/autotile/priority_map = [ ]
-1/autotile/z_index_map = [ ]
-1/occluder_offset = Vector2( 0, 0 )
-1/navigation_offset = Vector2( 0, 0 )
-1/shape_offset = Vector2( 0, 0 )
-1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
-1/shape = SubResource( 95 )
-1/shape_one_way = false
-1/shape_one_way_margin = 1.0
-1/shapes = [ {
-"autotile_coord": Vector2( 0, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 95 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 2, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 96 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 1, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 97 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 2, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 98 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 1, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 99 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 0, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 100 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 0, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 101 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 1, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 102 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 2, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 103 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 3, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 104 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 3, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 105 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 3, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 106 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 3, 3 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 107 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 1, 3 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 108 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 0, 3 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 109 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 2, 3 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 110 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 5, 3 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 111 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 5, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 112 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 6, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 113 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 6, 3 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 114 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 7, 3 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 115 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 7, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 116 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 6, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 117 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 7, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 118 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 10, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 119 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 11, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 120 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 12, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 121 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 12, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 122 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 12, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 123 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 11, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 124 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 10, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 125 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 10, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 126 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 11, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 127 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 9, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 128 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 8, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 129 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 8, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 130 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 9, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 131 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 8, 4 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 132 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 7, 4 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 133 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 6, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 135 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 7, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 136 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 8, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 137 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 9, 3 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 138 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 9, 2 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 139 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 8, 3 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 140 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 4, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 141 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 5, 0 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 142 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 4, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 143 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 5, 1 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 144 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 8, 5 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 145 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-}, {
-"autotile_coord": Vector2( 7, 5 ),
-"one_way": false,
-"one_way_margin": 1.0,
-"shape": SubResource( 146 ),
-"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
-} ]
-1/z_index = 0
diff --git a/tilemap_normal.png b/tilemap_normal.png
deleted file mode 100644
index 75db44b..0000000
--- a/tilemap_normal.png
+++ /dev/null
Binary files differ
diff --git a/tilemap_normal.png.import b/tilemap_normal.png.import
deleted file mode 100644
index 466481d..0000000
--- a/tilemap_normal.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/tilemap_normal.png-0eff8adf9abadc23777d95b0cc7de0cb.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://tilemap_normal.png"
-dest_files=[ "res://.import/tilemap_normal.png-0eff8adf9abadc23777d95b0cc7de0cb.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/tileset.png b/tileset.png
deleted file mode 100644
index db7a7a5..0000000
--- a/tileset.png
+++ /dev/null
Binary files differ
diff --git a/tileset.png.import b/tileset.png.import
deleted file mode 100644
index d8ea61a..0000000
--- a/tileset.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/tileset.png-a39e944f25b35d62f55d4f98a36e2b5e.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://tileset.png"
-dest_files=[ "res://.import/tileset.png-a39e944f25b35d62f55d4f98a36e2b5e.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/transparency.png b/transparency.png
deleted file mode 100644
index 6f51cc5..0000000
--- a/transparency.png
+++ /dev/null
Binary files differ
diff --git a/transparency.png.import b/transparency.png.import
deleted file mode 100644
index 0a9115c..0000000
--- a/transparency.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/transparency.png-348497b2345afb8aa9666982c1fc0d27.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://transparency.png"
-dest_files=[ "res://.import/transparency.png-348497b2345afb8aa9666982c1fc0d27.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/tree.png b/tree.png
deleted file mode 100644
index e8277cf..0000000
--- a/tree.png
+++ /dev/null
Binary files differ
diff --git a/tree.png.import b/tree.png.import
deleted file mode 100644
index 79826ea..0000000
--- a/tree.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/tree.png-e0869f9fb9c148a5baf00bb62a85d6ad.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://tree.png"
-dest_files=[ "res://.import/tree.png-e0869f9fb9c148a5baf00bb62a85d6ad.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/unchecked_box.png b/unchecked_box.png
deleted file mode 100644
index 460b312..0000000
--- a/unchecked_box.png
+++ /dev/null
Binary files differ
diff --git a/unchecked_box.png.import b/unchecked_box.png.import
deleted file mode 100644
index cb79345..0000000
--- a/unchecked_box.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/unchecked_box.png-c64ad1219dc112c36269a905ae1a1e83.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://unchecked_box.png"
-dest_files=[ "res://.import/unchecked_box.png-c64ad1219dc112c36269a905ae1a1e83.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0
diff --git a/victory.wav b/victory.wav
deleted file mode 100644
index 4487897..0000000
--- a/victory.wav
+++ /dev/null
Binary files differ
diff --git a/victory.wav.import b/victory.wav.import
deleted file mode 100644
index 52e5cbd..0000000
--- a/victory.wav.import
+++ /dev/null
@@ -1,21 +0,0 @@
-[remap]
-
-importer="wav"
-type="AudioStreamSample"
-path="res://.import/victory.wav-77722d69fa30ee785088827217b1cbe2.sample"
-
-[deps]
-
-source_file="res://victory.wav"
-dest_files=[ "res://.import/victory.wav-77722d69fa30ee785088827217b1cbe2.sample" ]
-
-[params]
-
-force/8_bit=false
-force/mono=false
-force/max_rate=false
-force/max_rate_hz=44100
-edit/trim=false
-edit/normalize=false
-edit/loop=false
-compress/mode=0
diff --git a/walk.wav b/walk.wav
deleted file mode 100644
index b6c1f96..0000000
--- a/walk.wav
+++ /dev/null
Binary files differ
diff --git a/walk.wav.import b/walk.wav.import
deleted file mode 100644
index 396f2b6..0000000
--- a/walk.wav.import
+++ /dev/null
@@ -1,21 +0,0 @@
-[remap]
-
-importer="wav"
-type="AudioStreamSample"
-path="res://.import/walk.wav-bbe5667e3f079279fb04a584db26b7ff.sample"
-
-[deps]
-
-source_file="res://walk.wav"
-dest_files=[ "res://.import/walk.wav-bbe5667e3f079279fb04a584db26b7ff.sample" ]
-
-[params]
-
-force/8_bit=false
-force/mono=false
-force/max_rate=false
-force/max_rate_hz=44100
-edit/trim=false
-edit/normalize=false
-edit/loop=false
-compress/mode=0
diff --git a/wall.png b/wall.png
deleted file mode 100644
index b930cc8..0000000
--- a/wall.png
+++ /dev/null
Binary files differ
diff --git a/wall.png.import b/wall.png.import
deleted file mode 100644
index 25a5a07..0000000
--- a/wall.png.import
+++ /dev/null
@@ -1,35 +0,0 @@
-[remap]
-
-importer="texture"
-type="StreamTexture"
-path="res://.import/wall.png-e3261c66ad83b71f524576fb4f3c7b5b.stex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://wall.png"
-dest_files=[ "res://.import/wall.png-e3261c66ad83b71f524576fb4f3c7b5b.stex" ]
-
-[params]
-
-compress/mode=0
-compress/lossy_quality=0.7
-compress/hdr_mode=0
-compress/bptc_ldr=0
-compress/normal_map=0
-flags/repeat=0
-flags/filter=false
-flags/mipmaps=false
-flags/anisotropic=false
-flags/srgb=2
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/HDR_as_SRGB=false
-process/invert_color=false
-process/normal_map_invert_y=false
-stream=false
-size_limit=0
-detect_3d=false
-svg/scale=1.0