25w20b and WASM

This commit is contained in:
catfoolyou 2025-05-16 12:46:25 -04:00
parent 6b36182531
commit e3bcfd9bb8
34 changed files with 20845 additions and 18517 deletions

1
.idea/.name generated Normal file
View File

@ -0,0 +1 @@
eaglercraft

6
.idea/compiler.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>

15
.idea/gradle.xml generated Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

20
.idea/jarRepositories.xml generated Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
</component>
</project>

5
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="17" project-jdk-type="JavaSDK" />
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

443
.idea/workspace.xml generated
View File

@ -5,398 +5,22 @@
</component>
<component name="ChangeListManager">
<list default="true" id="6bf56493-3337-4b11-98fb-a5d499cdbe34" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.name" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/Alpha-1.1.2_01.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/gradle.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/jarRepositories.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/build.gradle" afterDir="false" />
<change beforePath="$PROJECT_DIR$/javascript/classes.js" beforeDir="false" afterPath="$PROJECT_DIR$/javascript/classes.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/javascript/classes.js.map" beforeDir="false" afterPath="$PROJECT_DIR$/javascript/classes.js.map" afterDir="false" />
<change beforePath="$PROJECT_DIR$/lwjgl-rundir/eaglercraft.jar" beforeDir="false" afterPath="$PROJECT_DIR$/lwjgl-rundir/eaglercraft.jar" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/client/Minecraft.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/AxisAlignedBB.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Block.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockBookshelf.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockBreakable.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockButton.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockCactus.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockChest.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockClay.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockContainer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockCrops.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockDirt.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockDoor.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFarmland.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFence.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFire.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFlower.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFlowing.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFluid.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockFurnace.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockGlass.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockGrass.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockGravel.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockIce.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockJukeBox.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockLadder.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockLeaves.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockLeavesBase.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockLever.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockLog.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockMinecartTrack.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockMobSpawner.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockMushroom.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockObsidian.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockOre.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockOreBlock.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockPressurePlate.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockRedstoneOre.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockRedstoneTorch.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockRedstoneWire.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockReed.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSand.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSapling.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSign.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSnow.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSnowBlock.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockSponge.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockStairs.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockStationary.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockStep.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockStone.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockTNT.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockTorch.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/BlockWorkbench.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChatAllowedCharacters.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChatLine.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Chunk.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkCache.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkCoordIntPair.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkCoordinates.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkLoader.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkPosition.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkProviderClient.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkProviderGenerate.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkProviderIso.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ChunkProviderLoadOrGenerate.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ClippingHelper.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ClippingHelperImplementation.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CompressedStreamTools.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CraftingInventoryCB.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CraftingInventoryPlayerCB.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CraftingInventoryWorkbenchCB.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CraftingManager.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/CraftingRecipe.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EffectRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Entity.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityAnimal.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityArrow.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityBoat.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityBubbleFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityChicken.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityClientPlayerMP.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityCow.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityCreature.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityCreeper.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityDiggingFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityExplodeFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityFallingSand.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityFlameFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityGiantZombie.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityItem.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityLavaFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityList.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityLiving.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityMinecart.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityMob.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityOtherPlayerMP.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityPainting.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityPickupFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityPig.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityPlayer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityPlayerSP.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityRainFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityReddustFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySheep.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySkeleton.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySlime.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySlimeFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySmokeFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySnowball.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySorter.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySpider.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntitySplashFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityTNTPrimed.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EntityZombie.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EnumArt.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EnumMobType.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EnumOS.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EnumOSIsom.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/EnumSkyBlock.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Explosion.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/FontRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Frustum.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GLAllocation.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GameSettings.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Gui.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiButton.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiChat.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiChest.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiConflictWarning.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiConnectFailed.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiConnecting.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiContainer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiControls.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiCrafting.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiDeleteWorld.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiDownloadTerrain.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiEditSign.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiErrorScreen.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiFurnace.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiGameOver.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiIngame.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiIngameMenu.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiInventory.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiMainMenu.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiMultiplayer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiOptions.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiScreen.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiSelectWorld.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiSlider.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiSmallButton.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiTextField.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/GuiYesNo.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IBlockAccess.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ICamera.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IChunkLoader.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IChunkProvider.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IInventory.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IMobs.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IProgressUpdate.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IWorldAccess.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/InventoryCraftResult.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/InventoryCrafting.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/InventoryLargeChest.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/InventoryPlayer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/IsoImageBuffer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Item.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemArmor.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemAxe.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemBlock.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemBoat.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemBow.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemBucket.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemDoor.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemFlintAndSteel.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemFood.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemHoe.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemMinecart.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemPainting.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemPickaxe.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemRecord.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemRedstone.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemReed.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSaddle.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSeeds.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSign.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSnowball.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSoup.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSpade.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemStack.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemSword.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ItemTool.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/KeyBinding.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/LoadingScreenRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/LogoEffectRandomizer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MCHashEntry.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MCHashTable.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MapGenBase.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MapGenCaves.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Material.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MaterialLiquid.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MaterialLogic.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MaterialTransparent.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MathHelper.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MetadataChunkBlock.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MinecartTrackLogic.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MinecraftError.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MinecraftException.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelBase.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelBiped.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelBoat.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelChicken.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelCow.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelCreeper.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelMinecart.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelPig.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelQuadraped.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelSheep.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelSheepFur.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelSkeleton.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelSlime.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelSpider.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ModelZombie.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MouseHelper.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MovementInput.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MovementInputFromOptions.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/MovingObjectPosition.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTBase.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagByte.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagByteArray.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagCompound.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagDouble.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagEnd.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagFloat.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagInt.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagList.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagLong.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagShort.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NBTTagString.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NetClientHandler.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NetHandler.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NetworkManager.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NextTickListEntry.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NibbleArray.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NoiseGenerator.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NoiseGeneratorOctaves.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/NoiseGeneratorPerlin.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/OSMap.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/OSMapIsom.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet0KeepAlive.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet10Flying.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet11PlayerPosition.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet12PlayerLook.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet13PlayerLookMove.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet14BlockDig.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet15Place.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet16BlockItemSwitch.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet17AddToInventory.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet18ArmAnimation.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet1Login.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet20NamedEntitySpawn.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet21PickupSpawn.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet22Collect.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet23VehicleSpawn.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet24MobSpawn.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet255KickDisconnect.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet29DestroyEntity.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet2Handshake.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet30Entity.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet31RelEntityMove.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet32EntityLook.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet33RelEntityMoveLook.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet34EntityTeleport.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet3Chat.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet4UpdateTime.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet50PreChunk.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet51MapChunk.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet52MultiBlockChange.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet53BlockChange.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet59ComplexEntity.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet5PlayerInventory.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Packet6SpawnPosition.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PanelCrashReport.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Path.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PathEntity.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PathPoint.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Pathfinder.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PlayerController.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PlayerControllerCreative.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PlayerControllerMP.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PlayerControllerSP.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/PositionTexureVertex.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipeSorter.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesArmor.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesCrafting.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesFood.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesIngots.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesTools.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RecipesWeapons.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RedstoneUpdateInfo.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Render.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderArrow.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderBlocks.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderBoat.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderChicken.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderCow.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderCreeper.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderEngine.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderEntity.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderFallingSand.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderGiantZombie.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderGlobal.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderHelper.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderItem.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderList.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderLiving.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderManager.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderMinecart.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderPainting.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderPig.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderPlayer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderSheep.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderSlime.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderSnowball.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderSorter.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderSpider.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/RenderTNTPrimed.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/ScaledResolution.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Session.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SignModel.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Slot.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SlotArmor.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SlotCrafting.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SlotInventory.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SoundManager.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SpawnerAnimals.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/SpawnerClient.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/StepSound.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/StepSoundGlass.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/StepSoundSand.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TerrainTextureManager.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Tessellator.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureCompassFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureFlamesFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureLavaFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureLavaFlowFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureWaterFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TextureWaterFlowFX.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TexturedQuad.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntity.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntityChest.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntityFurnace.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntityMobSpawner.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntityMobSpawnerRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntityRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntitySign.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntitySignRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/TileEntitySpecialRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Timer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/UnexpectedThrowable.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/Vec3D.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/World.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldBlockPositionType.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldClient.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenBigTree.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenCactus.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenClay.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenDungeons.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenFlowers.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenLiquids.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenMinable.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenReed.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenTrees.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldGenerator.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/java/net/minecraft/src/WorldRenderer.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/Block.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/Block.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/BlockSign.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/BlockSign.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/EntityList.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/EntityList.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/Packet.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/Packet.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/PlayerControllerSP.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/PlayerControllerSP.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/SpawnerAnimals.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/SpawnerAnimals.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/SpawnerClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/SpawnerClient.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/net/minecraft/src/TileEntity.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/minecraft/src/TileEntity.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/net/peyton/eagler/minecraft/EntityConstructor.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/net/peyton/eagler/minecraft/EntityConstructor.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/wasm_gc_teavm/CompileEagRuntimeJS.sh" beforeDir="false" afterPath="$PROJECT_DIR$/wasm_gc_teavm/CompileEagRuntimeJS.sh" afterDir="false" />
<change beforePath="$PROJECT_DIR$/wasm_gc_teavm/javascript/eagruntime.js" beforeDir="false" afterPath="$PROJECT_DIR$/wasm_gc_teavm/javascript/eagruntime.js" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -413,7 +37,12 @@
<state>
<projects_view>
<tree_state>
<expand />
<expand>
<path>
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
<item name="eaglercraft" type="f1a62948:ProjectNode" />
</path>
</expand>
<select />
</tree_state>
</projects_view>
@ -443,21 +72,35 @@
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
&quot;last_opened_file_path&quot;: &quot;/home/lyosha/IdeaProjects/Project164&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;preferences.updates&quot;
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.ShowReadmeOnStart": "true",
"git-widget-placeholder": "main",
"kotlin-language-version-configured": "true",
"last_opened_file_path": "/home/lyosha/IdeaProjects/Alpha-1.1.2_01",
"settings.editor.selected.configurable": "preferences.updates"
}
}</component>
}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src/main/java/net/lax1dude/eaglercraft/profile" />
</key>
</component>
<component name="RunManager">
<configuration default="true" type="JetRunConfigurationType">
<module name="eaglercraft.test" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration default="true" type="KotlinStandaloneScriptRunConfigurationType">
<module name="eaglercraft.test" />
<option name="filePath" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">

View File

@ -10,7 +10,7 @@ sourceSets {
java {
srcDirs(
"src/main/java",
"src/lwjgl/java"
"src/teavm/java"
)
}
}
@ -26,7 +26,7 @@ tasks.withType(JavaCompile) {
}
dependencies {
implementation fileTree(dir: './lwjgl-rundir/', include: '*.jar')
//implementation fileTree(dir: './lwjgl-rundir/', include: '*.jar')
teavm(teavm.libs.jso)
teavm(teavm.libs.jsoApis)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -82,12 +82,12 @@ public class Block {
public static final Block tilledField = (new BlockFarmland(60)).setHardness(0.6F).setStepSound(soundGravelFootstep);
public static final Block stoneOvenIdle = (new BlockFurnace(61, false)).setHardness(3.5F).setStepSound(soundStoneFootstep);
public static final Block stoneOvenActive = (new BlockFurnace(62, true)).setHardness(3.5F).setStepSound(soundStoneFootstep).setLightValue(14.0F / 16.0F);
public static final Block signStanding = (new BlockSign(63, TileEntitySign.class, true)).setHardness(1.0F).setStepSound(soundWoodFootstep);
public static final Block signStanding = (new BlockSign(63, true)).setHardness(1.0F).setStepSound(soundWoodFootstep);
public static final Block doorWood = (new BlockDoor(64, Material.wood)).setHardness(3.0F).setStepSound(soundWoodFootstep);
public static final Block ladder = (new BlockLadder(65, 83)).setHardness(0.4F).setStepSound(soundWoodFootstep);
public static final Block minecartTrack = (new BlockMinecartTrack(66, 128)).setHardness(0.7F).setStepSound(soundMetalFootstep);
public static final Block stairCompactStone = new BlockStairs(67, cobblestone);
public static final Block signWall = (new BlockSign(68, TileEntitySign.class, false)).setHardness(1.0F).setStepSound(soundWoodFootstep);
public static final Block signWall = (new BlockSign(68, false)).setHardness(1.0F).setStepSound(soundWoodFootstep);
public static final Block lever = (new BlockLever(69, 96)).setHardness(0.5F).setStepSound(soundWoodFootstep);
public static final Block pressurePlateStone = (new BlockPressurePlate(70, stone.blockIndexInTexture, EnumMobType.mobs)).setHardness(0.5F).setStepSound(soundStoneFootstep);
public static final Block doorSteel = (new BlockDoor(71, Material.iron)).setHardness(5.0F).setStepSound(soundMetalFootstep);

View File

@ -3,14 +3,12 @@ package net.minecraft.src;
import java.util.Random;
public class BlockSign extends BlockContainer {
private Class signEntityClass;
private boolean isFreestanding;
protected BlockSign(int var1, Class var2, boolean var3) {
protected BlockSign(int var1, boolean var3) {
super(var1, Material.wood);
this.isFreestanding = var3;
this.blockIndexInTexture = 4;
this.signEntityClass = var2;
float var4 = 0.25F;
float var5 = 1.0F;
this.setBlockBounds(0.5F - var4, 0.0F, 0.5F - var4, 0.5F + var4, var5, 0.5F + var4);
@ -67,7 +65,7 @@ public class BlockSign extends BlockContainer {
protected TileEntity getBlockEntity() {
try {
return (TileEntity)this.signEntityClass.newInstance();
return new TileEntitySign();
} catch (Exception var2) {
throw new RuntimeException(var2);
}

View File

@ -1,18 +1,20 @@
package net.minecraft.src;
import net.peyton.eagler.minecraft.EntityConstructor;
import java.util.HashMap;
import java.util.Map;
public class EntityList {
private static Map stringToClassMapping = new HashMap();
private static Map<String, EntityConstructor> stringToClassMapping = new HashMap();
private static Map classToStringMapping = new HashMap();
private static Map IDtoClassMapping = new HashMap();
private static Map<Integer, EntityConstructor> IDtoClassMapping = new HashMap();
private static Map classToIDMapping = new HashMap();
private static void addMapping(Class var0, String var1, int var2) {
stringToClassMapping.put(var1, var0);
private static void addMapping(Class var0, EntityConstructor var3, String var1, int var2) {
stringToClassMapping.put(var1, var3);
classToStringMapping.put(var0, var1);
IDtoClassMapping.put(Integer.valueOf(var2), var0);
IDtoClassMapping.put(Integer.valueOf(var2), var3);
classToIDMapping.put(var0, Integer.valueOf(var2));
}
@ -20,9 +22,9 @@ public class EntityList {
Entity var2 = null;
try {
Class var3 = (Class)stringToClassMapping.get(var0);
EntityConstructor var3 = stringToClassMapping.get(var0);
if(var3 != null) {
var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
var2 = var3.createEntity(var1);
}
} catch (Exception var4) {
var4.printStackTrace();
@ -35,9 +37,9 @@ public class EntityList {
Entity var2 = null;
try {
Class var3 = (Class)stringToClassMapping.get(var0.getString("id"));
EntityConstructor var3 = stringToClassMapping.get(var0.getString("id"));
if(var3 != null) {
var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
var2 = var3.createEntity(var1);
}
} catch (Exception var4) {
var4.printStackTrace();
@ -56,9 +58,9 @@ public class EntityList {
Entity var2 = null;
try {
Class var3 = (Class)IDtoClassMapping.get(Integer.valueOf(var0));
EntityConstructor var3 = IDtoClassMapping.get(Integer.valueOf(var0));
if(var3 != null) {
var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
var2 = var3.createEntity(var1);
}
} catch (Exception var4) {
var4.printStackTrace();
@ -80,25 +82,25 @@ public class EntityList {
}
static {
addMapping(EntityArrow.class, "Arrow", 10);
addMapping(EntitySnowball.class, "Snowball", 11);
addMapping(EntityItem.class, "Item", 1);
addMapping(EntityPainting.class, "Painting", 9);
addMapping(EntityLiving.class, "Mob", 48);
addMapping(EntityMob.class, "Monster", 49);
addMapping(EntityCreeper.class, "Creeper", 50);
addMapping(EntitySkeleton.class, "Skeleton", 51);
addMapping(EntitySpider.class, "Spider", 52);
addMapping(EntityGiantZombie.class, "Giant", 53);
addMapping(EntityZombie.class, "Zombie", 54);
addMapping(EntitySlime.class, "Slime", 55);
addMapping(EntityPig.class, "Pig", 90);
addMapping(EntitySheep.class, "Sheep", 91);
addMapping(EntityCow.class, "Cow", 91);
addMapping(EntityChicken.class, "Chicken", 91);
addMapping(EntityTNTPrimed.class, "PrimedTnt", 20);
addMapping(EntityFallingSand.class, "FallingSand", 21);
addMapping(EntityMinecart.class, "Minecart", 40);
addMapping(EntityBoat.class, "Boat", 41);
addMapping(EntityArrow.class, EntityArrow::new, "Arrow", 10);
addMapping(EntitySnowball.class, EntitySnowball::new, "Snowball", 11);
addMapping(EntityItem.class, EntityItem::new, "Item", 1);
addMapping(EntityPainting.class, EntityPainting::new, "Painting", 9);
addMapping(EntityLiving.class, EntityLiving::new, "Mob", 48);
addMapping(EntityMob.class, EntityMob::new, "Monster", 49);
addMapping(EntityCreeper.class, EntityCreeper::new, "Creeper", 50);
addMapping(EntitySkeleton.class, EntitySkeleton::new, "Skeleton", 51);
addMapping(EntitySpider.class, EntitySpider::new, "Spider", 52);
addMapping(EntityGiantZombie.class, EntityGiantZombie::new, "Giant", 53);
addMapping(EntityZombie.class, EntityZombie::new, "Zombie", 54);
addMapping(EntitySlime.class, EntitySlime::new, "Slime", 55);
addMapping(EntityPig.class, EntityPig::new, "Pig", 90);
addMapping(EntitySheep.class, EntitySheep::new, "Sheep", 91);
addMapping(EntityCow.class, EntityCow::new, "Cow", 92);
addMapping(EntityChicken.class, EntityChicken::new, "Chicken", 93);
addMapping(EntityTNTPrimed.class, EntityTNTPrimed::new, "PrimedTnt", 20);
addMapping(EntityFallingSand.class, EntityFallingSand::new, "FallingSand", 21);
addMapping(EntityMinecart.class, EntityMinecart::new, "Minecart", 40);
addMapping(EntityBoat.class, EntityBoat::new, "Boat", 41);
}
}

View File

@ -1,5 +1,7 @@
package net.minecraft.src;
import net.peyton.eagler.minecraft.PacketConstructor;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
@ -7,25 +9,25 @@ import java.util.HashMap;
import java.util.Map;
public abstract class Packet {
private static Map packetIdToClassMap = new HashMap();
private static Map<Integer, PacketConstructor> packetIdToClassMap = new HashMap();
private static Map packetClassToIdMap = new HashMap();
public boolean isChunkDataPacket = false;
static void addIdClassMapping(int var0, Class var1) {
static void addIdClassMapping(int var0, Class var1, PacketConstructor var2) {
if(packetIdToClassMap.containsKey(Integer.valueOf(var0))) {
throw new IllegalArgumentException("Duplicate packet id:" + var0);
} else if(packetClassToIdMap.containsKey(var1)) {
throw new IllegalArgumentException("Duplicate packet class:" + var1);
} else {
packetIdToClassMap.put(Integer.valueOf(var0), var1);
packetIdToClassMap.put(Integer.valueOf(var0), var2);
packetClassToIdMap.put(var1, Integer.valueOf(var0));
}
}
public static Packet getNewPacket(int var0) {
try {
Class var1 = (Class)packetIdToClassMap.get(Integer.valueOf(var0));
return var1 == null ? null : (Packet)var1.newInstance();
PacketConstructor var1 = packetIdToClassMap.get(Integer.valueOf(var0));
return var1 == null ? null : var1.createPacket();
} catch (Exception var2) {
var2.printStackTrace();
System.out.println("Skipping packet with id " + var0);
@ -66,38 +68,38 @@ public abstract class Packet {
public abstract int getPacketSize();
static {
addIdClassMapping(0, Packet0KeepAlive.class);
addIdClassMapping(1, Packet1Login.class);
addIdClassMapping(2, Packet2Handshake.class);
addIdClassMapping(3, Packet3Chat.class);
addIdClassMapping(4, Packet4UpdateTime.class);
addIdClassMapping(5, Packet5PlayerInventory.class);
addIdClassMapping(6, Packet6SpawnPosition.class);
addIdClassMapping(10, Packet10Flying.class);
addIdClassMapping(11, Packet11PlayerPosition.class);
addIdClassMapping(12, Packet12PlayerLook.class);
addIdClassMapping(13, Packet13PlayerLookMove.class);
addIdClassMapping(14, Packet14BlockDig.class);
addIdClassMapping(15, Packet15Place.class);
addIdClassMapping(16, Packet16BlockItemSwitch.class);
addIdClassMapping(17, Packet17AddToInventory.class);
addIdClassMapping(18, Packet18ArmAnimation.class);
addIdClassMapping(20, Packet20NamedEntitySpawn.class);
addIdClassMapping(21, Packet21PickupSpawn.class);
addIdClassMapping(22, Packet22Collect.class);
addIdClassMapping(23, Packet23VehicleSpawn.class);
addIdClassMapping(24, Packet24MobSpawn.class);
addIdClassMapping(29, Packet29DestroyEntity.class);
addIdClassMapping(30, Packet30Entity.class);
addIdClassMapping(31, Packet31RelEntityMove.class);
addIdClassMapping(32, Packet32EntityLook.class);
addIdClassMapping(33, Packet33RelEntityMoveLook.class);
addIdClassMapping(34, Packet34EntityTeleport.class);
addIdClassMapping(50, Packet50PreChunk.class);
addIdClassMapping(51, Packet51MapChunk.class);
addIdClassMapping(52, Packet52MultiBlockChange.class);
addIdClassMapping(53, Packet53BlockChange.class);
addIdClassMapping(59, Packet59ComplexEntity.class);
addIdClassMapping(255, Packet255KickDisconnect.class);
addIdClassMapping(0, Packet0KeepAlive.class, Packet0KeepAlive::new);
addIdClassMapping(1, Packet1Login.class, Packet1Login::new);
addIdClassMapping(2, Packet2Handshake.class, Packet2Handshake::new);
addIdClassMapping(3, Packet3Chat.class, Packet3Chat::new);
addIdClassMapping(4, Packet4UpdateTime.class, Packet4UpdateTime::new);
addIdClassMapping(5, Packet5PlayerInventory.class, Packet5PlayerInventory::new);
addIdClassMapping(6, Packet6SpawnPosition.class, Packet6SpawnPosition::new);
addIdClassMapping(10, Packet10Flying.class, Packet10Flying::new);
addIdClassMapping(11, Packet11PlayerPosition.class, Packet11PlayerPosition::new);
addIdClassMapping(12, Packet12PlayerLook.class, Packet12PlayerLook::new);
addIdClassMapping(13, Packet13PlayerLookMove.class, Packet13PlayerLookMove::new);
addIdClassMapping(14, Packet14BlockDig.class, Packet14BlockDig::new);
addIdClassMapping(15, Packet15Place.class, Packet15Place::new);
addIdClassMapping(16, Packet16BlockItemSwitch.class, Packet16BlockItemSwitch::new);
addIdClassMapping(17, Packet17AddToInventory.class, Packet17AddToInventory::new);
addIdClassMapping(18, Packet18ArmAnimation.class, Packet18ArmAnimation::new);
addIdClassMapping(20, Packet20NamedEntitySpawn.class, Packet20NamedEntitySpawn::new);
addIdClassMapping(21, Packet21PickupSpawn.class, Packet21PickupSpawn::new);
addIdClassMapping(22, Packet22Collect.class, Packet22Collect::new);
addIdClassMapping(23, Packet23VehicleSpawn.class, Packet23VehicleSpawn::new);
addIdClassMapping(24, Packet24MobSpawn.class, Packet24MobSpawn::new);
addIdClassMapping(29, Packet29DestroyEntity.class, Packet29DestroyEntity::new);
addIdClassMapping(30, Packet30Entity.class, Packet30Entity::new);
addIdClassMapping(31, Packet31RelEntityMove.class, Packet31RelEntityMove::new);
addIdClassMapping(32, Packet32EntityLook.class, Packet32EntityLook::new);
addIdClassMapping(33, Packet33RelEntityMoveLook.class, Packet33RelEntityMoveLook::new);
addIdClassMapping(34, Packet34EntityTeleport.class, Packet34EntityTeleport::new);
addIdClassMapping(50, Packet50PreChunk.class, Packet50PreChunk::new);
addIdClassMapping(51, Packet51MapChunk.class, Packet51MapChunk::new);
addIdClassMapping(52, Packet52MultiBlockChange.class, Packet52MultiBlockChange::new);
addIdClassMapping(53, Packet53BlockChange.class, Packet53BlockChange::new);
addIdClassMapping(59, Packet59ComplexEntity.class, Packet59ComplexEntity::new);
addIdClassMapping(255, Packet255KickDisconnect.class, Packet255KickDisconnect::new);
}
}

View File

@ -10,8 +10,8 @@ public class PlayerControllerSP extends PlayerController {
private float prevBlockDamage = 0.0F;
private float blockDestroySoundCounter = 0.0F;
private int blockHitWait = 0;
private SpawnerAnimals monsterSpawner = new SpawnerClient(this, 200, IMobs.class, new Class[]{EntityZombie.class, EntitySkeleton.class, EntityCreeper.class, EntitySpider.class, EntitySlime.class});
private SpawnerAnimals animalSpawner = new SpawnerAnimals(15, EntityAnimal.class, new Class[]{EntitySheep.class, EntityPig.class, EntityCow.class, EntityChicken.class});
private SpawnerAnimals monsterSpawner = new SpawnerClient(this, 200, IMobs.class, new SpawnerAnimals.EntityConstructor[]{EntityZombie::new, EntitySkeleton::new, EntityCreeper::new, EntitySpider::new, EntitySlime::new});
private SpawnerAnimals animalSpawner = new SpawnerAnimals(15, EntityAnimal.class, new SpawnerAnimals.EntityConstructor[]{EntitySheep::new, EntityPig::new, EntityCow::new, EntityChicken::new});
public PlayerControllerSP(Minecraft var1) {
super(var1);

View File

@ -7,10 +7,10 @@ import java.util.Set;
public class SpawnerAnimals {
private int maxSpawns;
private Class entityType;
private Class[] entities;
private EntityConstructor[] entities;
private Set eligibleChunksForSpawning = new HashSet();
public SpawnerAnimals(int var1, Class var2, Class[] var3) {
public SpawnerAnimals(int var1, Class var2, EntityConstructor[] var3) {
this.maxSpawns = var1;
this.entityType = var2;
this.entities = var3;
@ -20,7 +20,7 @@ public class SpawnerAnimals {
int var2 = var1.countEntities(this.entityType);
if(var2 < this.maxSpawns) {
for(int var3 = 0; var3 < 3; ++var3) {
this.performSpawning(var1, 1, (IProgressUpdate)null);
this.performSpawning(var1, 1, null);
}
}
@ -101,7 +101,8 @@ public class SpawnerAnimals {
if(var24 >= 576.0F) {
EntityLiving var29;
try {
var29 = (EntityLiving)this.entities[var7].getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
var29 = this.entities[var7].createEntity(var1);
} catch (Exception var25) {
var25.printStackTrace();
return var4;
@ -125,4 +126,8 @@ public class SpawnerAnimals {
}
}
}
public interface EntityConstructor<T extends EntityLiving> {
T createEntity(World world);
}
}

View File

@ -3,7 +3,7 @@ package net.minecraft.src;
class SpawnerClient extends SpawnerAnimals {
final PlayerControllerSP playerController;
SpawnerClient(PlayerControllerSP var1, int var2, Class var3, Class[] var4) {
SpawnerClient(PlayerControllerSP var1, int var2, Class var3, EntityConstructor[] var4) {
super(var2, var3, var4);
this.playerController = var1;
}

View File

@ -1,21 +1,23 @@
package net.minecraft.src;
import net.peyton.eagler.minecraft.TileEntityConstructor;
import java.util.HashMap;
import java.util.Map;
public class TileEntity {
private static Map nameToClassMap = new HashMap();
private static Map<String, TileEntityConstructor> nameToClassMap = new HashMap();
private static Map classToNameMap = new HashMap();
public World worldObj;
public int xCoord;
public int yCoord;
public int zCoord;
private static void addMapping(Class var0, String var1) {
private static void addMapping(Class var0, TileEntityConstructor var2, String var1) {
if(classToNameMap.containsKey(var1)) {
throw new IllegalArgumentException("Duplicate id: " + var1);
} else {
nameToClassMap.put(var1, var0);
nameToClassMap.put(var1, var2);
classToNameMap.put(var0, var1);
}
}
@ -45,9 +47,9 @@ public class TileEntity {
TileEntity var1 = null;
try {
Class var2 = (Class)nameToClassMap.get(var0.getString("id"));
TileEntityConstructor var2 = nameToClassMap.get(var0.getString("id"));
if(var2 != null) {
var1 = (TileEntity)var2.newInstance();
var1 = (TileEntity)var2.createTileEntity();
}
} catch (Exception var3) {
var3.printStackTrace();
@ -82,9 +84,9 @@ public class TileEntity {
}
static {
addMapping(TileEntityFurnace.class, "Furnace");
addMapping(TileEntityChest.class, "Chest");
addMapping(TileEntitySign.class, "Sign");
addMapping(TileEntityMobSpawner.class, "MobSpawner");
addMapping(TileEntityFurnace.class, TileEntityFurnace::new, "Furnace");
addMapping(TileEntityChest.class, TileEntityChest::new, "Chest");
addMapping(TileEntitySign.class, TileEntitySign::new, "Sign");
addMapping(TileEntityMobSpawner.class, TileEntityMobSpawner::new, "MobSpawner");
}
}

View File

@ -6,5 +6,4 @@ import net.minecraft.src.World;
public interface EntityConstructor <T extends Entity> {
T createEntity(World world);
}

View File

@ -0,0 +1,220 @@
/*
* Copyright (c) 2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
const clientPlatfSPName = "clientPlatformSingleplayer";
/** @type {HTMLElement} */
var integratedServerCrashPanel = null;
var integratedServerCrashPanelShowing = false;
function initializeClientPlatfSP(spImports) {
/** @type {Worker|null} */
var workerObj = null;
const clientMessageQueue = new EaglerLinkedQueue();
const workerBootstrapSource = "\"use strict\"; (function(ctx, globals) {" +
"globals.__eaglerXOnMessage = function(o) {" +
"globals.__eaglerXOnMessage = function(oo) { console.error(\"Dropped IPC packet that was sent too early!\"); };" +
"const eagRuntimeJSURL = URL.createObjectURL(new Blob([ o.eagruntimeJS ], { type: \"text/javascript;charset=utf-8\" }));" +
"ctx.getEaglercraftXOpts = function() { return o.eaglercraftXOpts; };" +
"ctx.getEagRuntimeJSURL = function() { return eagRuntimeJSURL; };" +
"ctx.getClassesWASMURL = function() { return o.classesWASM; };" +
"ctx.getClassesDeobfWASMURL = function() { return o.classesDeobfWASM; };" +
"ctx.getClassesTEADBGURL = function() { return o.classesTEADBG; };" +
"ctx.getEPKFiles = function() { return null; };" +
"ctx.getRootElement = function() { return null; };" +
"ctx.getMainArgs = function() { return [\"_worker_process_\"]; };" +
"ctx.getImageURL = function(idx) { return null; };" +
"ctx.runMain = function(mainFunc) { mainFunc(); };" +
"importScripts(eagRuntimeJSURL);" +
"};" +
"addEventListener(\"message\", function(evt) { globals.__eaglerXOnMessage(evt.data); });" +
"})(self.__eaglercraftXLoaderContext = {}, self);";
/** @type {string|null} */
var workerURL = null;
/**
* @return {Promise<boolean>}
*/
async function startIntegratedServerImpl() {
if(!workerURL) {
workerURL = URL.createObjectURL(new Blob([ workerBootstrapSource ], { "type": "text/javascript;charset=utf8" }));
}
try {
workerObj = new Worker(workerURL);
}catch(ex) {
eagStackTrace(ERROR, "Failed to create worker", ex);
return false;
}
workerObj.addEventListener("error", /** @type {function(Event)} */ (function(/** ErrorEvent */ evt) {
eagStackTrace(ERROR, "Worker Error", /** @type {Error} */ (evt.error));
}));
workerObj.addEventListener("message", /** @type {function(Event)} */ (function(/** MessageEvent */ evt) {
const channel = evt.data["ch"];
if(!channel) {
eagError("Recieved IPC packet with null channel");
return;
}
if(channel === "~!LOGGER") {
addLogMessageImpl(evt.data["txt"], evt.data["err"]);
return;
}
const buf = evt.data["dat"];
if(!buf) {
eagError("Recieved IPC packet with null buffer");
return;
}
if(serverLANPeerPassIPCFunc(channel, buf)) {
return;
}
clientMessageQueue.push({
"ch": channel,
"data": new Uint8Array(buf),
"_next": null
});
}));
const classesTEADBGCopy = new Int8Array(classesTEADBG.length);
classesTEADBGCopy.set(classesTEADBG, 0);
var eagRuntimeJS;
try {
eagRuntimeJS = await fetch(/** @type {string} */ (eagRuntimeJSURL), { "cache": "force-cache" })
.then((resp) => resp.arrayBuffer());
}catch(ex) {
eagStackTrace(ERROR, "Failed to fetch eagruntime.js contents", ex);
try {
workerObj.terminate();
}catch(exx) {
}
return false;
}
workerObj.postMessage({
"eaglercraftXOpts": eaglercraftXOpts,
"eagruntimeJS": eagRuntimeJS,
"classesWASM": classesWASMModule,
"classesDeobfWASM": classesDeobfWASMModule,
"classesTEADBG": classesTEADBGCopy.buffer
});
return true;
};
spImports["startIntegratedServer"] = new WebAssembly.Suspending(startIntegratedServerImpl);
/**
* @param {string} channel
* @param {Uint8Array} arr
*/
spImports["sendPacket"] = function(channel, arr) {
if(workerObj) {
const copiedArray = new Uint8Array(arr.length);
copiedArray.set(arr, 0);
workerObj.postMessage({
"ch": channel,
"dat": copiedArray.buffer
}, [copiedArray.buffer]);
}
};
/**
* @param {string} channel
* @param {!ArrayBuffer} arr
*/
sendIPCPacketFunc = function(channel, arr) {
if(workerObj) {
workerObj.postMessage({
"ch": channel,
"dat": arr
}, [arr]);
}
};
spImports["getAvailablePackets"] = clientMessageQueue.getLength.bind(clientMessageQueue);
spImports["getNextPacket"] = clientMessageQueue.shift.bind(clientMessageQueue);
spImports["killWorker"] = function() {
if(workerObj) {
workerObj.terminate();
workerObj = null;
}
};
/**
* @param {string} report
* @param {number} x
* @param {number} y
* @param {number} w
* @param {number} h
*/
spImports["showCrashReportOverlay"] = function(report, x, y, w, h) {
if(!integratedServerCrashPanel) {
integratedServerCrashPanel = /** @type {HTMLElement} */ (document.createElement("div"));
integratedServerCrashPanel.setAttribute("style", "z-index:99;position:absolute;background-color:black;color:white;overflow-x:hidden;overflow-y:scroll;overflow-wrap:break-word;white-space:pre-wrap;font:18px sans-serif;padding:20px;display:none;");
integratedServerCrashPanel.classList.add("_eaglercraftX_integratedserver_crash_element");
parentElement.appendChild(integratedServerCrashPanel);
}
integratedServerCrashPanel.innerText = "";
integratedServerCrashPanel.innerText = "CURRENT DATE: " + (new Date()).toLocaleString() + "\n\n" + report;
const s = window.devicePixelRatio;
integratedServerCrashPanel.style.top = "" + (y / s) + "px";
integratedServerCrashPanel.style.left = "" + (x / s) + "px";
integratedServerCrashPanel.style.width = "" + ((w / s) - 20) + "px";
integratedServerCrashPanel.style.height = "" + ((h / s) - 20) + "px";
integratedServerCrashPanel.style.display = "block";
integratedServerCrashPanelShowing = true;
};
spImports["hideCrashReportOverlay"] = function() {
if(integratedServerCrashPanel) {
integratedServerCrashPanel.style.display = "none";
}
integratedServerCrashPanelShowing = false;
};
window.__curEaglerX188UnloadListenerCB = function() {
if(workerObj) {
workerObj.postMessage({
"ch": "~!WASM_AUTOSAVE"
});
}
};
}
function initializeNoClientPlatfSP(spImports) {
setUnsupportedFunc(spImports, clientPlatfSPName, "startIntegratedServer");
setUnsupportedFunc(spImports, clientPlatfSPName, "sendPacket");
setUnsupportedFunc(spImports, clientPlatfSPName, "getAvailablePackets");
setUnsupportedFunc(spImports, clientPlatfSPName, "getNextPacket");
setUnsupportedFunc(spImports, clientPlatfSPName, "killWorker");
setUnsupportedFunc(spImports, clientPlatfSPName, "showCrashReportOverlay");
setUnsupportedFunc(spImports, clientPlatfSPName, "hideCrashReportOverlay");
}

View File

@ -0,0 +1,541 @@
/*
* The MIT license
*
* Copyright (c) 2018 Yury Sitnikov
*
* 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.
*
*/
const webmSections = {
0xa45dfa3: { name: 'EBML', type: 'Container' },
0x286: { name: 'EBMLVersion', type: 'Uint' },
0x2f7: { name: 'EBMLReadVersion', type: 'Uint' },
0x2f2: { name: 'EBMLMaxIDLength', type: 'Uint' },
0x2f3: { name: 'EBMLMaxSizeLength', type: 'Uint' },
0x282: { name: 'DocType', type: 'String' },
0x287: { name: 'DocTypeVersion', type: 'Uint' },
0x285: { name: 'DocTypeReadVersion', type: 'Uint' },
0x6c: { name: 'Void', type: 'Binary' },
0x3f: { name: 'CRC-32', type: 'Binary' },
0xb538667: { name: 'SignatureSlot', type: 'Container' },
0x3e8a: { name: 'SignatureAlgo', type: 'Uint' },
0x3e9a: { name: 'SignatureHash', type: 'Uint' },
0x3ea5: { name: 'SignaturePublicKey', type: 'Binary' },
0x3eb5: { name: 'Signature', type: 'Binary' },
0x3e5b: { name: 'SignatureElements', type: 'Container' },
0x3e7b: { name: 'SignatureElementList', type: 'Container' },
0x2532: { name: 'SignedElement', type: 'Binary' },
0x8538067: { name: 'Segment', type: 'Container' },
0x14d9b74: { name: 'SeekHead', type: 'Container' },
0xdbb: { name: 'Seek', type: 'Container' },
0x13ab: { name: 'SeekID', type: 'Binary' },
0x13ac: { name: 'SeekPosition', type: 'Uint' },
0x549a966: { name: 'Info', type: 'Container' },
0x33a4: { name: 'SegmentUID', type: 'Binary' },
0x3384: { name: 'SegmentFilename', type: 'String' },
0x1cb923: { name: 'PrevUID', type: 'Binary' },
0x1c83ab: { name: 'PrevFilename', type: 'String' },
0x1eb923: { name: 'NextUID', type: 'Binary' },
0x1e83bb: { name: 'NextFilename', type: 'String' },
0x444: { name: 'SegmentFamily', type: 'Binary' },
0x2924: { name: 'ChapterTranslate', type: 'Container' },
0x29fc: { name: 'ChapterTranslateEditionUID', type: 'Uint' },
0x29bf: { name: 'ChapterTranslateCodec', type: 'Uint' },
0x29a5: { name: 'ChapterTranslateID', type: 'Binary' },
0xad7b1: { name: 'TimecodeScale', type: 'Uint' },
0x489: { name: 'Duration', type: 'Float' },
0x461: { name: 'DateUTC', type: 'Date' },
0x3ba9: { name: 'Title', type: 'String' },
0xd80: { name: 'MuxingApp', type: 'String' },
0x1741: { name: 'WritingApp', type: 'String' },
// 0xf43b675: { name: 'Cluster', type: 'Container' },
0x67: { name: 'Timecode', type: 'Uint' },
0x1854: { name: 'SilentTracks', type: 'Container' },
0x18d7: { name: 'SilentTrackNumber', type: 'Uint' },
0x27: { name: 'Position', type: 'Uint' },
0x2b: { name: 'PrevSize', type: 'Uint' },
0x23: { name: 'SimpleBlock', type: 'Binary' },
0x20: { name: 'BlockGroup', type: 'Container' },
0x21: { name: 'Block', type: 'Binary' },
0x22: { name: 'BlockVirtual', type: 'Binary' },
0x35a1: { name: 'BlockAdditions', type: 'Container' },
0x26: { name: 'BlockMore', type: 'Container' },
0x6e: { name: 'BlockAddID', type: 'Uint' },
0x25: { name: 'BlockAdditional', type: 'Binary' },
0x1b: { name: 'BlockDuration', type: 'Uint' },
0x7a: { name: 'ReferencePriority', type: 'Uint' },
0x7b: { name: 'ReferenceBlock', type: 'Int' },
0x7d: { name: 'ReferenceVirtual', type: 'Int' },
0x24: { name: 'CodecState', type: 'Binary' },
0x35a2: { name: 'DiscardPadding', type: 'Int' },
0xe: { name: 'Slices', type: 'Container' },
0x68: { name: 'TimeSlice', type: 'Container' },
0x4c: { name: 'LaceNumber', type: 'Uint' },
0x4d: { name: 'FrameNumber', type: 'Uint' },
0x4b: { name: 'BlockAdditionID', type: 'Uint' },
0x4e: { name: 'Delay', type: 'Uint' },
0x4f: { name: 'SliceDuration', type: 'Uint' },
0x48: { name: 'ReferenceFrame', type: 'Container' },
0x49: { name: 'ReferenceOffset', type: 'Uint' },
0x4a: { name: 'ReferenceTimeCode', type: 'Uint' },
0x2f: { name: 'EncryptedBlock', type: 'Binary' },
0x654ae6b: { name: 'Tracks', type: 'Container' },
0x2e: { name: 'TrackEntry', type: 'Container' },
0x57: { name: 'TrackNumber', type: 'Uint' },
0x33c5: { name: 'TrackUID', type: 'Uint' },
0x3: { name: 'TrackType', type: 'Uint' },
0x39: { name: 'FlagEnabled', type: 'Uint' },
0x8: { name: 'FlagDefault', type: 'Uint' },
0x15aa: { name: 'FlagForced', type: 'Uint' },
0x1c: { name: 'FlagLacing', type: 'Uint' },
0x2de7: { name: 'MinCache', type: 'Uint' },
0x2df8: { name: 'MaxCache', type: 'Uint' },
0x3e383: { name: 'DefaultDuration', type: 'Uint' },
0x34e7a: { name: 'DefaultDecodedFieldDuration', type: 'Uint' },
0x3314f: { name: 'TrackTimecodeScale', type: 'Float' },
0x137f: { name: 'TrackOffset', type: 'Int' },
0x15ee: { name: 'MaxBlockAdditionID', type: 'Uint' },
0x136e: { name: 'Name', type: 'String' },
0x2b59c: { name: 'Language', type: 'String' },
0x6: { name: 'CodecID', type: 'String' },
0x23a2: { name: 'CodecPrivate', type: 'Binary' },
0x58688: { name: 'CodecName', type: 'String' },
0x3446: { name: 'AttachmentLink', type: 'Uint' },
0x1a9697: { name: 'CodecSettings', type: 'String' },
0x1b4040: { name: 'CodecInfoURL', type: 'String' },
0x6b240: { name: 'CodecDownloadURL', type: 'String' },
0x2a: { name: 'CodecDecodeAll', type: 'Uint' },
0x2fab: { name: 'TrackOverlay', type: 'Uint' },
0x16aa: { name: 'CodecDelay', type: 'Uint' },
0x16bb: { name: 'SeekPreRoll', type: 'Uint' },
0x2624: { name: 'TrackTranslate', type: 'Container' },
0x26fc: { name: 'TrackTranslateEditionUID', type: 'Uint' },
0x26bf: { name: 'TrackTranslateCodec', type: 'Uint' },
0x26a5: { name: 'TrackTranslateTrackID', type: 'Binary' },
0x60: { name: 'Video', type: 'Container' },
0x1a: { name: 'FlagInterlaced', type: 'Uint' },
0x13b8: { name: 'StereoMode', type: 'Uint' },
0x13c0: { name: 'AlphaMode', type: 'Uint' },
0x13b9: { name: 'OldStereoMode', type: 'Uint' },
0x30: { name: 'PixelWidth', type: 'Uint' },
0x3a: { name: 'PixelHeight', type: 'Uint' },
0x14aa: { name: 'PixelCropBottom', type: 'Uint' },
0x14bb: { name: 'PixelCropTop', type: 'Uint' },
0x14cc: { name: 'PixelCropLeft', type: 'Uint' },
0x14dd: { name: 'PixelCropRight', type: 'Uint' },
0x14b0: { name: 'DisplayWidth', type: 'Uint' },
0x14ba: { name: 'DisplayHeight', type: 'Uint' },
0x14b2: { name: 'DisplayUnit', type: 'Uint' },
0x14b3: { name: 'AspectRatioType', type: 'Uint' },
0xeb524: { name: 'ColourSpace', type: 'Binary' },
0xfb523: { name: 'GammaValue', type: 'Float' },
0x383e3: { name: 'FrameRate', type: 'Float' },
0x61: { name: 'Audio', type: 'Container' },
0x35: { name: 'SamplingFrequency', type: 'Float' },
0x38b5: { name: 'OutputSamplingFrequency', type: 'Float' },
0x1f: { name: 'Channels', type: 'Uint' },
0x3d7b: { name: 'ChannelPositions', type: 'Binary' },
0x2264: { name: 'BitDepth', type: 'Uint' },
0x62: { name: 'TrackOperation', type: 'Container' },
0x63: { name: 'TrackCombinePlanes', type: 'Container' },
0x64: { name: 'TrackPlane', type: 'Container' },
0x65: { name: 'TrackPlaneUID', type: 'Uint' },
0x66: { name: 'TrackPlaneType', type: 'Uint' },
0x69: { name: 'TrackJoinBlocks', type: 'Container' },
0x6d: { name: 'TrackJoinUID', type: 'Uint' },
0x40: { name: 'TrickTrackUID', type: 'Uint' },
0x41: { name: 'TrickTrackSegmentUID', type: 'Binary' },
0x46: { name: 'TrickTrackFlag', type: 'Uint' },
0x47: { name: 'TrickMasterTrackUID', type: 'Uint' },
0x44: { name: 'TrickMasterTrackSegmentUID', type: 'Binary' },
0x2d80: { name: 'ContentEncodings', type: 'Container' },
0x2240: { name: 'ContentEncoding', type: 'Container' },
0x1031: { name: 'ContentEncodingOrder', type: 'Uint' },
0x1032: { name: 'ContentEncodingScope', type: 'Uint' },
0x1033: { name: 'ContentEncodingType', type: 'Uint' },
0x1034: { name: 'ContentCompression', type: 'Container' },
0x254: { name: 'ContentCompAlgo', type: 'Uint' },
0x255: { name: 'ContentCompSettings', type: 'Binary' },
0x1035: { name: 'ContentEncryption', type: 'Container' },
0x7e1: { name: 'ContentEncAlgo', type: 'Uint' },
0x7e2: { name: 'ContentEncKeyID', type: 'Binary' },
0x7e3: { name: 'ContentSignature', type: 'Binary' },
0x7e4: { name: 'ContentSigKeyID', type: 'Binary' },
0x7e5: { name: 'ContentSigAlgo', type: 'Uint' },
0x7e6: { name: 'ContentSigHashAlgo', type: 'Uint' },
0xc53bb6b: { name: 'Cues', type: 'Container' },
0x3b: { name: 'CuePoint', type: 'Container' },
0x33: { name: 'CueTime', type: 'Uint' },
0x37: { name: 'CueTrackPositions', type: 'Container' },
0x77: { name: 'CueTrack', type: 'Uint' },
0x71: { name: 'CueClusterPosition', type: 'Uint' },
0x70: { name: 'CueRelativePosition', type: 'Uint' },
0x32: { name: 'CueDuration', type: 'Uint' },
0x1378: { name: 'CueBlockNumber', type: 'Uint' },
0x6a: { name: 'CueCodecState', type: 'Uint' },
0x5b: { name: 'CueReference', type: 'Container' },
0x16: { name: 'CueRefTime', type: 'Uint' },
0x17: { name: 'CueRefCluster', type: 'Uint' },
0x135f: { name: 'CueRefNumber', type: 'Uint' },
0x6b: { name: 'CueRefCodecState', type: 'Uint' },
0x941a469: { name: 'Attachments', type: 'Container' },
0x21a7: { name: 'AttachedFile', type: 'Container' },
0x67e: { name: 'FileDescription', type: 'String' },
0x66e: { name: 'FileName', type: 'String' },
0x660: { name: 'FileMimeType', type: 'String' },
0x65c: { name: 'FileData', type: 'Binary' },
0x6ae: { name: 'FileUID', type: 'Uint' },
0x675: { name: 'FileReferral', type: 'Binary' },
0x661: { name: 'FileUsedStartTime', type: 'Uint' },
0x662: { name: 'FileUsedEndTime', type: 'Uint' },
0x43a770: { name: 'Chapters', type: 'Container' },
0x5b9: { name: 'EditionEntry', type: 'Container' },
0x5bc: { name: 'EditionUID', type: 'Uint' },
0x5bd: { name: 'EditionFlagHidden', type: 'Uint' },
0x5db: { name: 'EditionFlagDefault', type: 'Uint' },
0x5dd: { name: 'EditionFlagOrdered', type: 'Uint' },
0x36: { name: 'ChapterAtom', type: 'Container' },
0x33c4: { name: 'ChapterUID', type: 'Uint' },
0x1654: { name: 'ChapterStringUID', type: 'String' },
0x11: { name: 'ChapterTimeStart', type: 'Uint' },
0x12: { name: 'ChapterTimeEnd', type: 'Uint' },
0x18: { name: 'ChapterFlagHidden', type: 'Uint' },
0x598: { name: 'ChapterFlagEnabled', type: 'Uint' },
0x2e67: { name: 'ChapterSegmentUID', type: 'Binary' },
0x2ebc: { name: 'ChapterSegmentEditionUID', type: 'Uint' },
0x23c3: { name: 'ChapterPhysicalEquiv', type: 'Uint' },
0xf: { name: 'ChapterTrack', type: 'Container' },
0x9: { name: 'ChapterTrackNumber', type: 'Uint' },
0x0: { name: 'ChapterDisplay', type: 'Container' },
0x5: { name: 'ChapString', type: 'String' },
0x37c: { name: 'ChapLanguage', type: 'String' },
0x37e: { name: 'ChapCountry', type: 'String' },
0x2944: { name: 'ChapProcess', type: 'Container' },
0x2955: { name: 'ChapProcessCodecID', type: 'Uint' },
0x50d: { name: 'ChapProcessPrivate', type: 'Binary' },
0x2911: { name: 'ChapProcessCommand', type: 'Container' },
0x2922: { name: 'ChapProcessTime', type: 'Uint' },
0x2933: { name: 'ChapProcessData', type: 'Binary' },
0x254c367: { name: 'Tags', type: 'Container' },
0x3373: { name: 'Tag', type: 'Container' },
0x23c0: { name: 'Targets', type: 'Container' },
0x28ca: { name: 'TargetTypeValue', type: 'Uint' },
0x23ca: { name: 'TargetType', type: 'String' },
0x23c5: { name: 'TagTrackUID', type: 'Uint' },
0x23c9: { name: 'TagEditionUID', type: 'Uint' },
0x23c4: { name: 'TagChapterUID', type: 'Uint' },
0x23c6: { name: 'TagAttachmentUID', type: 'Uint' },
0x27c8: { name: 'SimpleTag', type: 'Container' },
0x5a3: { name: 'TagName', type: 'String' },
0x47a: { name: 'TagLanguage', type: 'String' },
0x484: { name: 'TagDefault', type: 'Uint' },
0x487: { name: 'TagString', type: 'String' },
0x485: { name: 'TagBinary', type: 'Binary' }
};
function doInherit(newClass, baseClass) {
newClass.prototype = Object.create(baseClass.prototype);
newClass.prototype.constructor = newClass;
}
/**
* @param {string} name
* @param {string} type
* @constructor
*/
function WebmBase(name, type) {
this.name = name || 'Unknown';
this.type = type || 'Unknown';
}
WebmBase.prototype.updateBySource = function() { };
WebmBase.prototype.setSource = function(source) {
this.source = source;
this.updateBySource();
};
WebmBase.prototype.updateByData = function() { };
WebmBase.prototype.setData = function(data) {
this.data = data;
this.updateByData();
};
/**
* @param {string} name
* @param {string} type
* @extends {WebmBase}
* @constructor
*/
function WebmUint(name, type) {
WebmBase.call(this, name, type || 'Uint');
}
doInherit(WebmUint, WebmBase);
function padHex(hex) {
return hex.length % 2 === 1 ? '0' + hex : hex;
}
WebmUint.prototype.updateBySource = function() {
// use hex representation of a number instead of number value
this.data = '';
for (var i = 0; i < this.source.length; i++) {
var hex = this.source[i].toString(16);
this.data += padHex(hex);
}
};
WebmUint.prototype.updateByData = function() {
var length = this.data.length / 2;
this.source = new Uint8Array(length);
for (var i = 0; i < length; i++) {
var hex = this.data.substr(i * 2, 2);
this.source[i] = parseInt(hex, 16);
}
};
WebmUint.prototype.getValue = function() {
return parseInt(this.data, 16);
};
WebmUint.prototype.setValue = function(value) {
this.setData(padHex(value.toString(16)));
};
/**
* @param {string} name
* @param {string} type
* @extends {WebmBase}
* @constructor
*/
function WebmFloat(name, type) {
WebmBase.call(this, name, type || 'Float');
}
doInherit(WebmFloat, WebmBase);
WebmFloat.prototype.getFloatArrayType = function() {
return this.source && this.source.length === 4 ? Float32Array : Float64Array;
};
WebmFloat.prototype.updateBySource = function() {
var byteArray = this.source.reverse();
var floatArrayType = this.getFloatArrayType();
var floatArray = new floatArrayType(byteArray.buffer);
this.data = floatArray[0];
};
WebmFloat.prototype.updateByData = function() {
var floatArrayType = this.getFloatArrayType();
var floatArray = new floatArrayType([ this.data ]);
var byteArray = new Uint8Array(floatArray.buffer);
this.source = byteArray.reverse();
};
WebmFloat.prototype.getValue = function() {
return this.data;
};
WebmFloat.prototype.setValue = function(value) {
this.setData(value);
};
/**
* @param {string} name
* @param {string} type
* @extends {WebmBase}
* @constructor
*/
function WebmContainer(name, type) {
WebmBase.call(this, name, type || 'Container');
}
doInherit(WebmContainer, WebmBase);
WebmContainer.prototype.readByte = function() {
return this.source[this.offset++];
};
WebmContainer.prototype.readUint = function() {
var firstByte = this.readByte();
var bytes = 8 - firstByte.toString(2).length;
var value = firstByte - (1 << (7 - bytes));
for (var i = 0; i < bytes; i++) {
// don't use bit operators to support x86
value *= 256;
value += this.readByte();
}
return value;
};
WebmContainer.prototype.updateBySource = function() {
this.data = [];
var end;
for (this.offset = 0; this.offset < this.source.length; this.offset = end) {
var id = this.readUint();
var len = this.readUint();
end = Math.min(this.offset + len, this.source.length);
var data = this.source.slice(this.offset, end);
var info = webmSections[id] || { name: 'Unknown', type: 'Unknown' };
var ctr = WebmBase;
switch (info.type) {
case 'Container':
ctr = WebmContainer;
break;
case 'Uint':
ctr = WebmUint;
break;
case 'Float':
ctr = WebmFloat;
break;
}
var section = new ctr(info.name, info.type);
section.setSource(data);
this.data.push({
id: id,
idHex: id.toString(16),
data: section
});
}
};
WebmContainer.prototype.writeUint = function(x, draft) {
for (var bytes = 1, flag = 0x80; x >= flag && bytes < 8; bytes++, flag *= 0x80) { }
if (!draft) {
var value = flag + x;
for (var i = bytes - 1; i >= 0; i--) {
// don't use bit operators to support x86
var c = value % 256;
this.source[this.offset + i] = c;
value = (value - c) / 256;
}
}
this.offset += bytes;
};
WebmContainer.prototype.writeSections = function(draft) {
this.offset = 0;
for (var i = 0; i < this.data.length; i++) {
var section = this.data[i],
content = section.data.source,
contentLength = content.length;
this.writeUint(section.id, draft);
this.writeUint(contentLength, draft);
if (!draft) {
this.source.set(content, this.offset);
}
this.offset += contentLength;
}
return this.offset;
};
WebmContainer.prototype.updateByData = function() {
// run without accessing this.source to determine total length - need to know it to create Uint8Array
var length = this.writeSections('draft');
this.source = new Uint8Array(length);
// now really write data
this.writeSections(null);
};
WebmContainer.prototype.getSectionById = function(id) {
for (var i = 0; i < this.data.length; i++) {
var section = this.data[i];
if (section.id === id) {
return section.data;
}
}
return null;
};
/**
* @param {Uint8Array} source
* @extends {WebmContainer}
* @constructor
*/
function WebmFile(source) {
WebmContainer.call(this, 'File', 'File');
this.setSource(source);
}
doInherit(WebmFile, WebmContainer);
WebmFile.prototype.fixDuration = function(duration, options) {
var logger = options && options.logger;
if (logger === undefined) {
logger = function(message) {
console.log(message);
};
} else if (!logger) {
logger = function() { };
}
var segmentSection = this.getSectionById(0x8538067);
if (!segmentSection) {
logger('[fix-webm-duration] Segment section is missing');
return false;
}
var infoSection = segmentSection.getSectionById(0x549a966);
if (!infoSection) {
logger('[fix-webm-duration] Info section is missing');
return false;
}
var timeScaleSection = infoSection.getSectionById(0xad7b1);
if (!timeScaleSection) {
logger('[fix-webm-duration] TimecodeScale section is missing');
return false;
}
var durationSection = infoSection.getSectionById(0x489);
if (durationSection) {
if (durationSection.getValue() <= 0) {
logger('[fix-webm-duration] Duration section is present, but the value is empty');
durationSection.setValue(duration);
} else {
logger('[fix-webm-duration] Duration section is present');
return false;
}
} else {
logger('[fix-webm-duration] Duration section is missing');
// append Duration section
durationSection = new WebmFloat('Duration', 'Float');
durationSection.setValue(duration);
infoSection.data.push({
id: 0x489,
data: durationSection
});
}
// set default time scale to 1 millisecond (1000000 nanoseconds)
timeScaleSection.setValue(1000000);
infoSection.updateByData();
segmentSection.updateByData();
this.updateByData();
return true;
};
WebmFile.prototype.toBlob = function(mimeType) {
return new Blob([ this.source.buffer ], { type: mimeType || 'video/webm' });
};
/**
* @param {!Blob} blob
* @param {number} duration
* @param {function(!Blob)} callback
* @param {Object} options
*/
function fixWebMDuration(blob, duration, callback, options) {
try {
var reader = new FileReader();
reader.onloadend = function() {
try {
var file = new WebmFile(new Uint8Array(/** @type {ArrayBuffer} */ (reader.result)));
if (file.fixDuration(duration, options)) {
blob = file.toBlob(blob.type);
}
} catch (ex) {
// ignore
}
callback(blob);
};
reader.readAsArrayBuffer(blob);
} catch (ex) {
callback(blob);
}
}

View File

@ -0,0 +1,197 @@
/*
* Copyright (c) 2024 lax1dude, ayunami2000. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
const EVENT_VOICE_ICE = 0;
const EVENT_VOICE_DESC = 1;
const EVENT_VOICE_OPEN = 2;
const EVENT_VOICE_CLOSE = 3;
const platfVoiceClientName = "platformVoiceClient";
function initializePlatfVoiceClient(voiceClientImports) {
/**
* @return {boolean}
*/
voiceClientImports["isSupported"] = function() {
return typeof navigator.mediaDevices !== "undefined" && typeof navigator.mediaDevices.getUserMedia !== "undefined" && "srcObject" in HTMLAudioElement.prototype;
};
/**
* @param {string} desc
* @suppress {globalThis}
*/
function setRemoteDescriptionImpl(desc) {
try {
const remoteDesc = JSON.parse(desc);
this["_peerConnection"].setRemoteDescription(remoteDesc).then(() => {
if (remoteDesc.hasOwnProperty("type") && "offer" === remoteDesc["type"]) {
this["_peerConnection"].createAnswer().then((desc) => {
this["_peerConnection"].setLocalDescription(desc).then(() => {
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_DESC, {
"objId": this["objId"],
"data": JSON.stringify(desc)
});
}).catch((err) => {
eagError("Failed to set local description for \"{}\"! {}", this["objId"], err.message);
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
"objId": this["objId"]
});
});
}).catch((err) => {
eagError("Failed to create answer for \"{}\"! {}", this["objId"], err.message);
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
"objId": this["objId"]
});
});
}
}).catch((err) => {
eagError("Failed to set remote description for \"{}\"! {}", this["objId"], err.message);
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
"objId": this["objId"]
});
});
} catch (e) {
eagError(e.message);
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
"objId": this["objId"]
});
}
}
/**
* @param {string} ice
* @suppress {globalThis}
*/
function addRemoteICECandidateImpl(ice) {
try {
this["_peerConnection"].addIceCandidate(new RTCIceCandidate(/** @type {!RTCIceCandidateInit} */ (JSON.parse(ice)))).catch((err) => {
eagError("Failed to parse ice candidate for \"{}\"! {}", this["objId"], err.message);
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
"objId": this["objId"]
});
});
} catch (e) {
eagError(e.message);
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
"objId": this["objId"]
});
}
}
/**
* @suppress {globalThis}
*/
function closeImpl() {
this["_peerConnection"].close();
}
let idCounter = 0;
/**
* @param {string} iceServers
* @param {number} offer
* @param {!MediaStream} localStream
* @return {Object}
*/
voiceClientImports["createRTCPeerConnection"] = function(iceServers, offer, localStream) {
try {
const peerId = idCounter++;
var ret;
const peerConnection = new RTCPeerConnection(/** @type {!RTCConfiguration} */ ({
"iceServers": JSON.parse(iceServers),
"optional": [
{
"DtlsSrtpKeyAgreement": true
}
]
}));
peerConnection.addEventListener("icecandidate", /** @type {function(Event)} */ ((/** RTCPeerConnectionIceEvent */ evt) => {
if (evt.candidate) {
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_ICE, {
"objId": peerId,
"data": JSON.stringify({
"sdpMLineIndex": "" + evt.candidate.sdpMLineIndex,
"candidate": evt.candidate.candidate
})
});
}
}));
peerConnection.addEventListener("track", /** @type {function(Event)} */ ((/** RTCTrackEvent */ evt) => {
const rawStream = evt.streams[0];
ret["_aud"] = document.createElement("audio");
ret["_aud"]["autoplay"] = true;
ret["_aud"]["muted"] = true;
ret["_aud"]["srcObject"] = rawStream;
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_OPEN, {
"objId": peerId,
"stream": rawStream
});
}));
localStream.getTracks().forEach(function(track) {
peerConnection.addTrack(track, localStream);
});
if (offer) {
peerConnection.createOffer().then((desc) => {
peerConnection.setLocalDescription(desc).then(() => {
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_DESC, {
"objId": peerId,
"data": JSON.stringify(desc)
});
}).catch((err) => {
eagError("Failed to set local description for \"{}\"! {}", peerId, err.message);
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
"objId": peerId
});
});
}).catch((err) => {
eagError("Failed to set create offer for \"{}\"! {}", peerId, err.message);
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
"objId": peerId
});
});
}
peerConnection.addEventListener("connectionstatechange", () => {
const cs = peerConnection.connectionState;
if ("disconnected" === cs || "failed" === cs) {
pushEvent(EVENT_TYPE_VOICE, EVENT_VOICE_CLOSE, {
"objId": peerId
});
}
});
return ret = {
"objId": peerId,
"_peerConnection": peerConnection,
"setRemoteDescription": setRemoteDescriptionImpl,
"addRemoteICECandidate": addRemoteICECandidateImpl,
"closeHandle": closeImpl
};
} catch (e) {
eagError(e.message);
return null;
}
};
}
function initializeNoPlatfVoiceClient(voiceClientImports) {
setUnsupportedFunc(voiceClientImports, platfVoiceClientName, "isSupported");
setUnsupportedFunc(voiceClientImports, platfVoiceClientName, "createRTCPeerConnection");
}

View File

@ -0,0 +1,651 @@
/*
* Copyright (c) 2024 lax1dude, ayunami2000. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
const READYSTATE_INIT_FAILED = -2;
const READYSTATE_FAILED = -1;
const READYSTATE_DISCONNECTED = 0;
const READYSTATE_CONNECTING = 1;
const READYSTATE_CONNECTED = 2;
const EVENT_WEBRTC_ICE = 0;
const EVENT_WEBRTC_DESC = 1;
const EVENT_WEBRTC_OPEN = 2;
const EVENT_WEBRTC_PACKET = 3;
const EVENT_WEBRTC_CLOSE = 4;
const platfWebRTCName = "platformWebRTC";
/**
* @typedef {{
* peerId:string,
* peerConnection:!RTCPeerConnection,
* dataChannel:RTCDataChannel,
* ipcChannel:(string|null),
* pushEvent:function(number,*),
* disconnect:function()
* }}
*/
let LANPeerInternal;
function initializePlatfWebRTC(webrtcImports) {
const clientLANPacketBuffer = new EaglerLinkedQueue();
let lanClient;
lanClient = {
iceServers: [],
/** @type {RTCPeerConnection|null} */
peerConnection: null,
/** @type {RTCDataChannel|null} */
dataChannel: null,
readyState: READYSTATE_CONNECTING,
/** @type {string|null} */
iceCandidate: null,
/** @type {string|null} */
description: null,
dataChannelOpen: false,
dataChannelClosed: true,
disconnect: function(quiet) {
if (lanClient.dataChannel) {
try {
lanClient.dataChannel.close();
} catch (t) {
}
lanClient.dataChannel = null;
}
if (lanClient.peerConnection) {
try {
lanClient.peerConnection.close();
} catch (t) {
}
lanClient.peerConnection = null;
}
if (!quiet) lanClient.dataChannelClosed = true;
lanClient.readyState = READYSTATE_DISCONNECTED;
}
};
/**
* @return {boolean}
*/
webrtcImports["supported"] = function() {
return typeof RTCPeerConnection !== "undefined";
};
/**
* @return {number}
*/
webrtcImports["clientLANReadyState"] = function() {
return lanClient.readyState;
};
webrtcImports["clientLANCloseConnection"] = function() {
lanClient.disconnect(false);
};
/**
* @param {!Uint8Array} pkt
*/
webrtcImports["clientLANSendPacket"] = function(pkt) {
if (lanClient.dataChannel !== null && "open" === lanClient.dataChannel.readyState) {
try {
lanClient.dataChannel.send(pkt);
} catch (e) {
lanClient.disconnect(false);
}
}else {
lanClient.disconnect(false);
}
};
/**
* @return {Uint8Array}
*/
webrtcImports["clientLANReadPacket"] = function() {
const ret = clientLANPacketBuffer.shift();
return ret ? new Uint8Array(ret["data"]) : null;
};
/**
* @return {number}
*/
webrtcImports["clientLANAvailable"] = function() {
return clientLANPacketBuffer.getLength();
};
/**
* @param {!Array<string>} servers
*/
webrtcImports["clientLANSetICEServersAndConnect"] = function(servers) {
lanClient.iceServers.length = 0;
for (let url of servers) {
let etr = url.split(";");
if(etr.length === 1) {
lanClient.iceServers.push({
urls: etr[0]
});
}else if(etr.length === 3) {
lanClient.iceServers.push({
urls: etr[0],
username: etr[1],
credential: etr[2]
});
}
}
if(lanClient.readyState === READYSTATE_CONNECTED || lanClient.readyState === READYSTATE_CONNECTING) {
lanClient.disconnect(true);
}
try {
if (lanClient.dataChannel) {
try {
lanClient.dataChannel.close();
} catch (t) {
}
lanClient.dataChannel = null;
}
if (lanClient.peerConnection) {
try {
lanClient.peerConnection.close();
} catch (t) {
}
}
lanClient.peerConnection = new RTCPeerConnection({
iceServers: lanClient.iceServers,
optional: [
{
DtlsSrtpKeyAgreement: true
}
]
});
lanClient.readyState = READYSTATE_CONNECTING;
} catch (/** Error */ t) {
eagStackTrace(ERROR, "Could not create LAN client RTCPeerConnection!", t);
lanClient.readyState = READYSTATE_INIT_FAILED;
return;
}
try {
const iceCandidates = [];
lanClient.peerConnection.addEventListener("icecandidate", /** @type {function(Event)} */ ((/** !RTCPeerConnectionIceEvent */ evt) => {
if(evt.candidate) {
if(iceCandidates.length === 0) {
const candidateState = [0, 0];
const runnable = () => {
if(lanClient.peerConnection !== null && lanClient.peerConnection.connectionState !== "disconnected") {
const trial = ++candidateState[1];
if(candidateState[0] !== iceCandidates.length && trial < 3) {
candidateState[0] = iceCandidates.length;
setTimeout(runnable, 2000);
return;
}
lanClient.iceCandidate = JSON.stringify(iceCandidates);
iceCandidates.length = 0;
}
};
setTimeout(runnable, 2000);
}
iceCandidates.push({
"sdpMLineIndex": evt.candidate.sdpMLineIndex,
"candidate": evt.candidate.candidate
});
}
}));
lanClient.dataChannel = lanClient.peerConnection.createDataChannel("lan");
lanClient.dataChannel.binaryType = "arraybuffer";
let evtHandler;
evtHandler = () => {
if (iceCandidates.length > 0) {
setTimeout(evtHandler, 10);
return;
}
lanClient.dataChannelClosed = false;
lanClient.dataChannelOpen = true;
};
lanClient.dataChannel.addEventListener("open", evtHandler);
lanClient.dataChannel.addEventListener("message", /** @type {function(Event)} */ ((/** MessageEvent */ evt) => {
clientLANPacketBuffer.push({ "data": evt.data, "_next": null });
}));
lanClient.peerConnection.createOffer().then((/** !RTCSessionDescription */ desc) => {
lanClient.peerConnection.setLocalDescription(desc).then(() => {
lanClient.description = JSON.stringify(desc);
}).catch((err) => {
eagError("Failed to set local description! {}", /** @type {string} */ (err.message));
lanClient.readyState = READYSTATE_FAILED;
lanClient.disconnect(false);
});
}).catch((err) => {
eagError("Failed to set create offer! {}", /** @type {string} */ (err.message));
lanClient.readyState = READYSTATE_FAILED;
lanClient.disconnect(false);
});
lanClient.peerConnection.addEventListener("connectionstatechange", /** @type {function(Event)} */ ((evt) => {
var connectionState = lanClient.peerConnection.connectionState;
if ("disconnected" === connectionState) {
lanClient.disconnect(false);
} else if ("connected" === connectionState) {
lanClient.readyState = READYSTATE_CONNECTED;
} else if ("failed" === connectionState) {
lanClient.readyState = READYSTATE_FAILED;
lanClient.disconnect(false);
}
}));
} catch (t) {
if (lanClient.dataChannel) {
try {
lanClient.dataChannel.close();
} catch (tt) {
}
lanClient.dataChannel = null;
}
if (lanClient.peerConnection) {
try {
lanClient.peerConnection.close();
} catch (tt) {
}
lanClient.peerConnection = null;
}
eagStackTrace(ERROR, "Could not create LAN client RTCDataChannel!", t);
lanClient.readyState = READYSTATE_INIT_FAILED;
}
};
webrtcImports["clearLANClientState"] = function() {
lanClient.iceCandidate = lanClient.description = null;
lanClient.dataChannelOpen = false;
lanClient.dataChannelClosed = true;
};
/**
* @return {string|null}
*/
webrtcImports["clientLANAwaitICECandidate"] = function() {
if (lanClient.iceCandidate === null) {
return null;
}
const ret = lanClient.iceCandidate;
lanClient.iceCandidate = null;
return ret;
};
/**
* @return {string|null}
*/
webrtcImports["clientLANAwaitDescription"] = function() {
if (lanClient.description === null) {
return null;
}
const ret = lanClient.description;
lanClient.description = null;
return ret;
};
/**
* @return {boolean}
*/
webrtcImports["clientLANAwaitChannel"] = function() {
if (lanClient.dataChannelOpen) {
lanClient.dataChannelOpen = false;
return true;
}
return false;
};
/**
* @return {boolean}
*/
webrtcImports["clientLANClosed"] = function() {
return lanClient.dataChannelClosed;
};
/**
* @param {string} candidate
*/
webrtcImports["clientLANSetICECandidate"] = function(candidate) {
try {
const lst = /** @type {Array<!Object>} */ (JSON.parse(candidate));
for (var i = 0; i < lst.length; ++i) {
lanClient.peerConnection.addIceCandidate(new RTCIceCandidate(lst[i]));
}
}catch(/** Error */ ex) {
eagStackTrace(ERROR, "Uncaught exception setting remote ICE candidates", ex);
lanClient.readyState = READYSTATE_FAILED;
lanClient.disconnect(false);
}
};
/**
* @param {string} description
*/
webrtcImports["clientLANSetDescription"] = function(description) {
try {
lanClient.peerConnection.setRemoteDescription(/** @type {!RTCSessionDescription} */ (JSON.parse(description)));
}catch(/** Error */ ex) {
eagStackTrace(ERROR, "Uncaught exception setting remote description", ex);
lanClient.readyState = READYSTATE_FAILED;
lanClient.disconnect(false);
}
};
let lanServer;
lanServer = {
/** @type {!Array<Object>} */
iceServers: [],
/** @type {!Map<string, !LANPeerInternal>} */
peerList: new Map(),
/** @type {!Map<string, !LANPeerInternal>} */
ipcMapList: new Map(),
disconnect: function(/** string */ peerId) {
const thePeer = lanServer.peerList.get(peerId);
if(thePeer) {
lanServer.peerList.delete(peerId);
if(thePeer.ipcChannel) {
lanServer.ipcMapList.delete(thePeer.ipcChannel);
}
try {
thePeer.disconnect();
} catch (ignored) {}
thePeer.pushEvent(EVENT_WEBRTC_CLOSE, null);
}
}
};
/**
* @param {!Array<string>} servers
*/
webrtcImports["serverLANInitializeServer"] = function(servers) {
lanServer.iceServers.length = 0;
for (let url of servers) {
let etr = url.split(";");
if(etr.length === 1) {
lanServer.iceServers.push({
"urls": etr[0]
});
}else if(etr.length === 3) {
lanServer.iceServers.push({
"urls": etr[0],
"username": etr[1],
"credential": etr[2]
});
}
}
};
webrtcImports["serverLANCloseServer"] = function() {
for (let thePeer of Object.values(lanServer.peerList)) {
if (thePeer) {
try {
thePeer.disconnect();
} catch (e) {}
thePeer.pushEvent(EVENT_WEBRTC_CLOSE, null);
}
}
lanServer.peerList.clear();
};
/**
* @param {string} peer
*/
webrtcImports["serverLANCreatePeer"] = function(peer) {
try {
const events = new EaglerLinkedQueue();
/** @type {!LANPeerInternal} */
let peerInstance;
peerInstance = {
peerId: peer,
peerConnection: new RTCPeerConnection(/** @type {RTCConfiguration} */ ({
"iceServers": lanServer.iceServers,
"optional": [
{
"DtlsSrtpKeyAgreement": true
}
]
})),
/** @type {RTCDataChannel} */
dataChannel: null,
/** @type {string|null} */
ipcChannel: null,
pushEvent: function(type, data) {
events.push({
"type": type,
"data": data,
"_next": null
});
},
disconnect: function() {
if (peerInstance.dataChannel) peerInstance.dataChannel.close();
peerInstance.peerConnection.close();
}
};
lanServer.peerList.set(peerInstance.peerId, peerInstance);
const iceCandidates = [];
peerInstance.peerConnection.addEventListener("icecandidate", /** @type {function(Event)} */ ((/** RTCPeerConnectionIceEvent */ evt) => {
if(evt.candidate) {
if(iceCandidates.length === 0) {
const candidateState = [0, 0];
const runnable = () => {
if(peerInstance.peerConnection !== null && peerInstance.peerConnection.connectionState !== "disconnected") {
const trial = ++candidateState[1];
if(candidateState[0] !== iceCandidates.length && trial < 3) {
candidateState[0] = iceCandidates.length;
setTimeout(runnable, 2000);
return;
}
peerInstance.pushEvent(EVENT_WEBRTC_ICE, JSON.stringify(iceCandidates));
iceCandidates.length = 0;
}
};
setTimeout(runnable, 2000);
}
iceCandidates.push({
"sdpMLineIndex": evt.candidate.sdpMLineIndex,
"candidate": evt.candidate.candidate
});
}
}));
let evtHandler;
evtHandler = (/** RTCDataChannelEvent */ evt) => {
if (iceCandidates.length > 0) {
setTimeout(evtHandler, 10, evt);
return;
}
if (!evt.channel) return;
const newDataChannel = evt.channel;
if(peerInstance.dataChannel !== null) {
newDataChannel.close();
return;
}
peerInstance.dataChannel = newDataChannel;
peerInstance.pushEvent(EVENT_WEBRTC_OPEN, null);
peerInstance.dataChannel.addEventListener("message", (evt2) => {
const data = evt2.data;
if(peerInstance.ipcChannel) {
sendIPCPacketFunc(peerInstance.ipcChannel, data);
}else {
peerInstance.pushEvent(EVENT_WEBRTC_PACKET, new Uint8Array(data));
}
});
};
peerInstance.peerConnection.addEventListener("datachannel", /** @type {function(Event)} */ (evtHandler));
peerInstance.peerConnection.addEventListener("connectionstatechange", (evt) => {
const connectionState = peerInstance.peerConnection.connectionState;
if ("disconnected" === connectionState || "failed" === connectionState) {
lanServer.disconnect(peerInstance.peerId);
}
});
return {
"peerId": peerInstance.peerId,
/**
* @return {number}
*/
"countAvailableEvents": function() {
return events.getLength();
},
/**
* @return {Object}
*/
"nextEvent": function() {
return events.shift();
},
/**
* @param {!Uint8Array} dat
*/
"writePacket": function(dat) {
let b = false;
if (peerInstance.dataChannel !== null && "open" === peerInstance.dataChannel.readyState) {
try {
peerInstance.dataChannel.send(dat);
} catch (e) {
b = true;
}
} else {
b = true;
}
if(b) {
lanServer.disconnect(peerInstance.peerId);
}
},
/**
* @param {string} iceCandidates
*/
"handleRemoteICECandidates": function(iceCandidates) {
try {
const candidateList = /** @type {!Array<!RTCIceCandidateInit>} */ (JSON.parse(iceCandidates));
for (let candidate of candidateList) {
peerInstance.peerConnection.addIceCandidate(new RTCIceCandidate(candidate));
}
} catch (err) {
eagError("Failed to parse ice candidate for \"{}\"! {}", peerInstance.peerId, err.message);
lanServer.disconnect(peerInstance.peerId);
}
},
/**
* @param {string} desc
*/
"handleRemoteDescription": function(desc) {
try {
const remoteDesc = /** @type {!RTCSessionDescription} */ (JSON.parse(desc));
peerInstance.peerConnection.setRemoteDescription(remoteDesc).then(() => {
if (remoteDesc.hasOwnProperty("type") && "offer" === remoteDesc["type"]) {
peerInstance.peerConnection.createAnswer().then((desc) => {
peerInstance.peerConnection.setLocalDescription(desc).then(() => {
peerInstance.pushEvent(EVENT_WEBRTC_DESC, JSON.stringify(desc));
}).catch((err) => {
eagError("Failed to set local description for \"{}\"! {}", peerInstance.peerId, err.message);
lanServer.disconnect(peerInstance.peerId);
});
}).catch((err) => {
eagError("Failed to create answer for \"{}\"! {}", peerInstance.peerId, err.message);
lanServer.disconnect(peerInstance.peerId);
});
}
}).catch((err) => {
eagError("Failed to set remote description for \"{}\"! {}", peerInstance.peerId, err.message);
lanServer.disconnect(peerInstance.peerId);
});
} catch (err) {
eagError("Failed to parse remote description for \"{}\"! {}", peerInstance.peerId, err.message);
lanServer.disconnect(peerInstance.peerId);
}
},
/**
* @param {string|null} ipcChannel
*/
"mapIPC": function(ipcChannel) {
if(!peerInstance.ipcChannel) {
if(ipcChannel) {
peerInstance.ipcChannel = ipcChannel;
lanServer.ipcMapList.set(ipcChannel, peerInstance);
}
}else {
if(!ipcChannel) {
lanServer.ipcMapList.delete(peerInstance.ipcChannel);
peerInstance.ipcChannel = null;
}
}
},
"disconnect": function() {
lanServer.disconnect(peerInstance.peerId);
}
};
}catch(/** Error */ tt) {
eagStackTrace(ERROR, "Failed to create WebRTC LAN peer!", tt);
return null;
}
};
/**
* @param {string} channel
* @param {!ArrayBuffer} arr
*/
serverLANPeerPassIPCFunc = function(channel, arr) {
const peer = lanServer.ipcMapList.get(channel);
if(peer) {
let b = false;
if (peer.dataChannel && "open" === peer.dataChannel.readyState) {
try {
peer.dataChannel.send(arr);
} catch (e) {
b = true;
}
} else {
b = true;
}
if(b) {
lanServer.disconnect(peer.peerId);
}
return true;
}else {
return false;
}
};
}
function initializeNoPlatfWebRTC(webrtcImports) {
setUnsupportedFunc(webrtcImports, platfWebRTCName, "supported");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANReadyState");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANCloseConnection");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANSendPacket");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANReadPacket");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANAvailable");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANSetICEServersAndConnect");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clearLANClientState");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANAwaitICECandidate");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANAwaitDescription");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANAwaitChannel");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANClosed");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANSetICECandidate");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANSetDescription");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "clientLANClosed");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "serverLANInitializeServer");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "serverLANCloseServer");
setUnsupportedFunc(webrtcImports, platfWebRTCName, "serverLANCreatePeer");
}

View File

@ -0,0 +1,523 @@
/*
* Copyright (c) 2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
const platfWebViewName = "platformWebView";
function initializePlatfWebView(webViewImports) {
const BEGIN_SHOWING_DIRECT = 0;
const BEGIN_SHOWING_ENABLE_JAVASCRIPT = 1;
const BEGIN_SHOWING_CONTENT_BLOCKED = 2;
const EVENT_WEBVIEW_CHANNEL = 0;
const EVENT_WEBVIEW_MESSAGE = 1;
const EVENT_WEBVIEW_PERMISSION_ALLOW = 2;
const EVENT_WEBVIEW_PERMISSION_BLOCK = 3;
const EVENT_WEBVIEW_PERMISSION_CLEAR = 4;
const EVENT_CHANNEL_OPEN = 0;
const EVENT_CHANNEL_CLOSE = 1;
const EVENT_MESSAGE_STRING = 0;
const EVENT_MESSAGE_BINARY = 1;
const utf8Decoder = new TextDecoder("utf-8");
var supported = false;
var cspSupport = false;
var supportForce = runtimeOpts.forceWebViewSupport;
var enableCSP = runtimeOpts.enableWebViewCSP;
if(supportForce) {
supported = true;
cspSupport = true;
}else {
supported = false;
cspSupport = false;
try {
var tmp = /** @type {HTMLIFrameElement} */ (document.createElement("iframe"));
supported = tmp != null && (typeof tmp.allow === "string") && (typeof tmp.sandbox === "object");
cspSupport = enableCSP && supported && (typeof tmp.csp === "string");
}catch(ex) {
eagError("Error checking iframe support");
eagError(ex);
}
}
if(!supported) {
eagError("This browser does not meet the safety requirements for webview support, this feature will be disabled");
}else if(!cspSupport && enableCSP) {
eagWarn("This browser does not support CSP attribute on iframes! (try Chrome)");
}
const requireSSL = location.protocol && "https:" === location.protocol.toLowerCase();
var webviewResetSerial = 0;
/** @type {HTMLElement} */
var currentIFrameContainer = null;
/** @type {HTMLElement} */
var currentAllowJavaScript = null;
/** @type {HTMLIFrameElement} */
var currentIFrame = null;
/** @type {function(MessageEvent)|null} */
var currentMessageHandler = null;
window.addEventListener("message", /** @type {function(Event)} */ (function(/** MessageEvent */ evt) {
if(currentMessageHandler && evt.source !== window) {
currentMessageHandler(evt);
}
}));
/**
* @return {boolean}
*/
webViewImports["checkSupported"] = function() {
return supported;
};
/**
* @return {boolean}
*/
webViewImports["checkCSPSupported"] = function() {
return cspSupport;
};
/**
* @param {string} ch
* @param {string} str
*/
webViewImports["sendStringMessage"] = function(ch, str) {
try {
var w;
if(currentIFrame != null && (w = currentIFrame.contentWindow) != null) {
w.postMessage({
"ver": 1,
"channel": ch,
"type": "string",
"data": str
}, "*");
}else {
eagError("Server tried to send the WebView a message, but the message channel is not open!");
}
}catch(/** Error */ ex) {
eagStackTrace(ERROR, "Failed to send string message to WebView!", ex);
}
};
/**
* @param {string} ch
* @param {Uint8Array} bin
*/
webViewImports["sendBinaryMessage"] = function(ch, bin) {
try {
var w;
if(currentIFrame != null && (w = currentIFrame.contentWindow) != null) {
const copiedArray = new Uint8Array(bin.length);
copiedArray.set(bin, 0);
w.postMessage({
"ver": 1,
"channel": ch,
"type": "binary",
"data": copiedArray.buffer
}, "*");
}else {
eagError("Server tried to send the WebView a message, but the message channel is not open!");
}
}catch(/** Error */ ex) {
eagStackTrace(ERROR, "Failed to send string message to WebView!", ex);
}
};
/**
* @param {number} state
* @param {Object} options
* @param {number} x
* @param {number} y
* @param {number} w
* @param {number} h
*/
webViewImports["beginShowing"] = function(state, options, x, y, w, h) {
if(!supported) {
return;
}
try {
setupShowing(x, y, w, h);
switch(state) {
case BEGIN_SHOWING_DIRECT:
beginShowingDirect(options);
break;
case BEGIN_SHOWING_ENABLE_JAVASCRIPT:
if(options["contentMode"] === 1) {
const copiedBlob = new Uint8Array(options["blob"].length);
copiedBlob.set(options["blob"], 0);
options["blob"] = copiedBlob;
}
beginShowingEnableJavaScript(options);
break;
case BEGIN_SHOWING_CONTENT_BLOCKED:
if(options["contentMode"] === 1) {
const copiedBlob = new Uint8Array(options["blob"].length);
copiedBlob.set(options["blob"], 0);
options["blob"] = copiedBlob;
}
beginShowingContentBlocked(options);
break;
default:
break;
}
}catch(/** Error */ ex) {
eagStackTrace(ERROR, "Failed to begin showing WebView!", ex);
}
};
/**
* @param {number} x
* @param {number} y
* @param {number} w
* @param {number} h
*/
function setupShowing(x, y, w, h) {
if(currentIFrameContainer !== null) {
endShowingImpl();
}
currentIFrameContainer = /** @type {HTMLElement} */ (document.createElement("div"));
currentIFrameContainer.classList.add("_eaglercraftX_webview_container_element");
currentIFrameContainer.style.border = "5px solid #333333";
currentIFrameContainer.style.zIndex = "11";
currentIFrameContainer.style.position = "absolute";
currentIFrameContainer.style.backgroundColor = "#DDDDDD";
currentIFrameContainer.style.fontFamily = "sans-serif";
resizeImpl(x, y, w, h);
parentElement.appendChild(currentIFrameContainer);
}
/**
* @param {HTMLIFrameElement} iframeElement
* @param {string} str
*/
function setAllowSafe(iframeElement, str) {
iframeElement.allow = str;
return iframeElement.allow === str;
}
/**
* @param {HTMLIFrameElement} iframeElement
* @param {Array<string>} args
*/
function setSandboxSafe(iframeElement, args) {
const theSandbox = iframeElement.sandbox;
for(var i = 0; i < args.length; ++i) {
theSandbox.add(args[i]);
}
for(var i = 0; i < args.length; ++i) {
if(!theSandbox.contains(args[i])) {
return false;
}
}
for(var i = 0; i < theSandbox.length; ++i) {
if(!args.find(itm => itm === theSandbox[i])) {
return false;
}
}
return true;
}
function beginShowingDirect(options) {
if(!supportForce) {
currentIFrame = /** @type {HTMLIFrameElement} */ (document.createElement("iframe"));
currentIFrame.referrerPolicy = "strict-origin";
const sandboxArgs = [ "allow-downloads" ];
if(options["scriptEnabled"]) {
sandboxArgs.push("allow-scripts");
sandboxArgs.push("allow-pointer-lock");
}
if(!setAllowSafe(currentIFrame, "") || !setSandboxSafe(currentIFrame, sandboxArgs)) {
eagError("Caught safety exception while opening webview!");
if(currentIFrame !== null) {
currentIFrame.remove();
currentIFrame = null;
}
eagError("Things you can try:");
eagError("1. Set window.eaglercraftXOpts.forceWebViewSupport to true");
eagError("2. Set window.eaglercraftXOpts.enableWebViewCSP to false");
eagError("(these settings may compromise security)");
beginShowingSafetyError();
return;
}
}else {
currentIFrame = /** @type {HTMLIFrameElement} */ (document.createElement("iframe"));
currentIFrame.allow = "";
currentIFrame.referrerPolicy = "strict-origin";
currentIFrame.sandbox.add("allow-downloads");
if(options["scriptEnabled"]) {
currentIFrame.sandbox.add("allow-scripts");
currentIFrame.sandbox.add("allow-pointer-lock");
}
}
currentIFrame.credentialless = true;
currentIFrame.loading = "lazy";
var cspWarn = false;
if(options["contentMode"] === 1) {
if(enableCSP && cspSupport) {
if(typeof currentIFrame.csp === "string") {
var csp = "default-src 'none';";
var protos = options["strictCSPEnable"] ? "" : (requireSSL ? " https:" : " http: https:");
if(options["scriptEnabled"]) {
csp += (" script-src 'unsafe-eval' 'unsafe-inline' data: blob:" + protos + ";");
csp += (" style-src 'unsafe-eval' 'unsafe-inline' data: blob:" + protos + ";");
csp += (" img-src data: blob:" + protos + ";");
csp += (" font-src data: blob:" + protos + ";");
csp += (" child-src data: blob:" + protos + ";");
csp += (" frame-src data: blob:;");
csp += (" media-src data: mediastream: blob:" + protos + ";");
csp += (" connect-src data: blob:" + protos + ";");
csp += (" worker-src data: blob:" + protos + ";");
}else {
csp += (" style-src data: 'unsafe-inline'" + protos + ";");
csp += (" img-src data:" + protos + ";");
csp += (" font-src data:" + protos + ";");
csp += (" media-src data:" + protos + ";");
}
currentIFrame.csp = csp;
}else {
eagWarn("This browser does not support CSP attribute on iframes! (try Chrome)");
cspWarn = true;
}
}else {
cspWarn = true;
}
if(cspWarn && options["strictCSPEnable"]) {
eagWarn("Strict CSP was requested for this webview, but that feature is not available!");
}
}else {
cspWarn = true;
}
currentIFrame.style.border = "none";
currentIFrame.style.backgroundColor = "white";
currentIFrame.style.width = "100%";
currentIFrame.style.height = "100%";
currentIFrame.classList.add("_eaglercraftX_webview_iframe_element");
currentIFrameContainer.appendChild(currentIFrame);
if(options["contentMode"] === 1) {
const decodedText = utf8Decoder.decode(options["blob"]);
options["blob"] = null;
currentIFrame.srcdoc = decodedText;
}else {
currentIFrame.src = options["uri"];
}
const resetSer = webviewResetSerial;
const curIFrame = currentIFrame;
let focusTracker = false;
currentIFrame.addEventListener("mouseover", function(/** Event */ evt) {
if(resetSer === webviewResetSerial && curIFrame === currentIFrame) {
if(!focusTracker) {
focusTracker = true;
currentIFrame.contentWindow.focus();
}
}
});
currentIFrame.addEventListener("mouseout", function(/** Event */ evt) {
if(resetSer === webviewResetSerial && curIFrame === currentIFrame) {
if(focusTracker) {
focusTracker = false;
window.focus();
}
}
});
if(options["scriptEnabled"] && options["serverMessageAPIEnabled"]) {
currentMessageHandler = function(/** MessageEvent */ evt) {
if(resetSer === webviewResetSerial && curIFrame === currentIFrame && evt.source === curIFrame.contentWindow) {
/** @type {Object} */
const obj = evt.data;
if((typeof obj === "object") && (obj["ver"] === 1) && ((typeof obj["channel"] === "string") && obj["channel"]["length"] > 0)) {
if(typeof obj["open"] === "boolean") {
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_CHANNEL, {
"eventType": (obj["open"] ? EVENT_CHANNEL_OPEN : EVENT_CHANNEL_CLOSE),
"channelName": obj["channel"]
});
return;
}else if(typeof obj["data"] === "string") {
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_MESSAGE, {
"eventType": EVENT_MESSAGE_STRING,
"channelName": obj["channel"],
"eventData": obj["data"]
});
return;
}else if(obj["data"] instanceof ArrayBuffer) {
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_MESSAGE, {
"eventType": EVENT_MESSAGE_BINARY,
"channelName": obj["channel"],
"eventData": obj["data"]
});
return;
}
}
eagWarn("WebView sent an invalid message!");
}else {
eagWarn("Recieved message from on dead IFrame handler: (#{}) {}", resetSer, curIFrame.src);
}
};
}
eagInfo("WebView is loading: \"{}\"", options["contentMode"] === 1 ? "about:srcdoc" : currentIFrame.src);
eagInfo("JavaScript: {}, Strict CSP: {}, Message API: {}", options["scriptEnabled"],
options["strictCSPEnable"] && !cspWarn, options["serverMessageAPIEnabled"]);
}
function beginShowingEnableJSSetup() {
if(currentAllowJavaScript !== null) {
++webviewResetSerial;
currentAllowJavaScript.remove();
currentAllowJavaScript = null;
}
currentAllowJavaScript = /** @type {HTMLElement} */ (document.createElement("div"));
currentAllowJavaScript.style.backgroundColor = "white";
currentAllowJavaScript.style.width = "100%";
currentAllowJavaScript.style.height = "100%";
currentAllowJavaScript.classList.add("_eaglercraftX_webview_permission_screen");
currentIFrameContainer.appendChild(currentAllowJavaScript);
}
function beginShowingEnableJavaScript(options) {
beginShowingEnableJSSetup();
var strictCSPMarkup;
if(options["contentMode"] !== 1) {
strictCSPMarkup = "<span style=\"color:red;\">Impossible</span>";
}else if(!cspSupport || !enableCSP) {
strictCSPMarkup = "<span style=\"color:red;\">Unsupported</span>";
}else if(options["strictCSPEnable"]) {
strictCSPMarkup = "<span style=\"color:green;\">Enabled</span>";
}else {
strictCSPMarkup = "<span style=\"color:red;\">Disabled</span>";
}
var messageAPIMarkup;
if(options["serverMessageAPIEnabled"]) {
messageAPIMarkup = "<span style=\"color:red;\">Enabled</span>";
}else {
messageAPIMarkup = "<span style=\"color:green;\">Disabled</span>";
}
currentAllowJavaScript.innerHTML =
"<div style=\"padding-top:13vh;\"><div style=\"margin:auto;max-width:450px;border:6px double black;text-align:center;padding:20px;\">"
+ "<h2><img width=\"32\" height=\"32\" style=\"vertical-align:middle;\" src=\"" + faviconURL + "\">&emsp;Allow JavaScript</h2>"
+ "<p style=\"font-family:monospace;text-decoration:underline;word-wrap:break-word;\" class=\"_eaglercraftX_permission_target_url\"></p>"
+ "<h4 style=\"line-height:1.4em;\">Strict CSP: " + strictCSPMarkup + "&ensp;|&ensp;"
+ "Message API: " + messageAPIMarkup + "</h4>"
+ "<p><input class=\"_eaglercraftX_remember_javascript\" type=\"checkbox\" checked> Remember my choice</p>"
+ "<p><button style=\"font-size:1.5em;\" class=\"_eaglercraftX_allow_javascript\">Allow</button>&emsp;"
+ "<button style=\"font-size:1.5em;\" class=\"_eaglercraftX_block_javascript\">Block</button></p></div></div>";
const serial = webviewResetSerial;
if(options["contentMode"] !== 1) {
const urlStr = options["url"];
currentAllowJavaScript.querySelector("._eaglercraftX_permission_target_url").innerText = urlStr.length() > 255 ? (urlStr.substring(0, 253) + "...") : urlStr;
}
currentAllowJavaScript.querySelector("._eaglercraftX_allow_javascript").addEventListener("click", function(/** Event */ evt) {
if(webviewResetSerial === serial && currentAllowJavaScript !== null) {
const chkbox = currentAllowJavaScript.querySelector("._eaglercraftX_remember_javascript");
if(chkbox !== null && chkbox.checked) {
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_PERMISSION_ALLOW, null);
}
currentAllowJavaScript.remove();
currentAllowJavaScript = null;
++webviewResetSerial;
beginShowingDirect(options);
}
});
currentAllowJavaScript.querySelector("._eaglercraftX_block_javascript").addEventListener("click", function(/** Event */ evt) {
if(webviewResetSerial === serial && currentAllowJavaScript !== null) {
const chkbox = currentAllowJavaScript.querySelector("._eaglercraftX_remember_javascript");
if(chkbox !== null && chkbox.checked) {
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_PERMISSION_BLOCK, null);
}
beginShowingContentBlocked(options);
}
});
}
function beginShowingContentBlocked(options) {
beginShowingEnableJSSetup();
currentAllowJavaScript.innerHTML =
"<div style=\"padding-top:13vh;\"><h1 style=\"text-align:center;\">"
+ "<img width=\"48\" height=\"48\" style=\"vertical-align:middle;\" src=\"" + faviconURL + "\">&emsp;Content Blocked</h1>"
+ "<h4 style=\"text-align:center;\">You chose to block JavaScript execution for this embed</h4>"
+ "<p style=\"text-align:center;\"><button style=\"font-size:1.0em;\" class=\"_eaglercraftX_re_evaluate_javascript\">Re-evaluate</button></p></div>";
const serial = webviewResetSerial;
currentAllowJavaScript.querySelector("._eaglercraftX_re_evaluate_javascript").addEventListener("click", function(/** Event */ evt) {
if(webviewResetSerial === serial && currentAllowJavaScript !== null) {
pushEvent(EVENT_TYPE_WEBVIEW, EVENT_WEBVIEW_PERMISSION_CLEAR, null);
beginShowingEnableJavaScript(options);
}
});
}
function beginShowingSafetyError() {
beginShowingEnableJSSetup();
currentAllowJavaScript.innerHTML =
"<div style=\"padding-top:13vh;\"><h1 style=\"text-align:center;\">"
+ "<img width=\"48\" height=\"48\" style=\"vertical-align:middle;\" src=\"" + faviconURL + "\">&emsp;IFrame Safety Error</h1>"
+ "<h4 style=\"text-align:center;\">The content cannot be displayed safely!</h4>"
+ "<h4 style=\"text-align:center;\">Check console for more details</h4></div>";
}
/**
* @param {number} x
* @param {number} y
* @param {number} w
* @param {number} h
*/
function resizeImpl(x, y, w, h) {
if(currentIFrameContainer) {
const s = window.devicePixelRatio;
currentIFrameContainer.style.top = "" + (y / s) + "px";
currentIFrameContainer.style.left = "" + (x / s) + "px";
currentIFrameContainer.style.width = "" + ((w / s) - 10) + "px";
currentIFrameContainer.style.height = "" + ((h / s) - 10) + "px";
}
}
function endShowingImpl() {
++webviewResetSerial;
if(currentIFrame) {
currentIFrame.remove();
currentIFrame = null;
}
currentMessageHandler = null;
if(currentAllowJavaScript) {
currentAllowJavaScript.remove();
currentAllowJavaScript = null;
}
if(currentIFrameContainer) {
currentIFrameContainer.remove();
currentIFrameContainer = null;
}
window.focus();
}
webViewImports["resize"] = resizeImpl;
webViewImports["endShowing"] = endShowingImpl;
}
function initializeNoPlatfWebView(webViewImports) {
setUnsupportedFunc(webViewImports, platfWebViewName, "checkSupported");
setUnsupportedFunc(webViewImports, platfWebViewName, "checkCSPSupported");
setUnsupportedFunc(webViewImports, platfWebViewName, "sendStringMessage");
setUnsupportedFunc(webViewImports, platfWebViewName, "sendBinaryMessage");
setUnsupportedFunc(webViewImports, platfWebViewName, "beginShowing");
setUnsupportedFunc(webViewImports, platfWebViewName, "resize");
setUnsupportedFunc(webViewImports, platfWebViewName, "endShowing");
}

View File

@ -0,0 +1,99 @@
/*
* Copyright (c) 2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
const serverPlatfSPName = "serverPlatformSingleplayer";
/** @type {function(string, boolean)|null} */
var sendIntegratedServerCrash = null;
/** @type {boolean} */
var isTabClosingFlag = false;
function initializeServerPlatfSP(spImports) {
const serverMessageQueue = new EaglerLinkedQueue();
/**
* @param {Object} o
*/
self.__eaglerXOnMessage = function(o) {
const channel = o["ch"];
const buf = o["dat"];
if(!channel) {
eagError("Recieved IPC packet with null channel");
return;
}
if(channel === "~!WASM_AUTOSAVE") {
isTabClosingFlag = true;
return;
}
if(!buf) {
eagError("Recieved IPC packet with null buffer");
return;
}
serverMessageQueue.push({
"ch": channel,
"data": new Uint8Array(buf),
"_next": null
});
};
/**
* @param {string} channel
* @param {Uint8Array} arr
*/
spImports["sendPacket"] = function(channel, arr) {
const copiedArray = new Uint8Array(arr.length);
copiedArray.set(arr, 0);
postMessage({
"ch": channel,
"dat": copiedArray.buffer
}, [copiedArray.buffer]);
};
spImports["getAvailablePackets"] = serverMessageQueue.getLength.bind(serverMessageQueue);
spImports["getNextPacket"] = serverMessageQueue.shift.bind(serverMessageQueue);
spImports["setCrashCallback"] = function() {
return {
"call": function(functor) {
sendIntegratedServerCrash = functor;
}
};
};
/**
* @return {boolean}
*/
spImports["isTabAboutToClose"] = function() {
const ret = isTabClosingFlag;
isTabClosingFlag = false;
return ret;
};
}
function initializeNoServerPlatfSP(spImports) {
setUnsupportedFunc(spImports, serverPlatfSPName, "sendPacket");
setUnsupportedFunc(spImports, serverPlatfSPName, "getAvailablePackets");
setUnsupportedFunc(spImports, serverPlatfSPName, "getNextPacket");
setUnsupportedFunc(spImports, serverPlatfSPName, "setCrashCallback");
setUnsupportedFunc(spImports, serverPlatfSPName, "isTabAboutToClose");
}

View File

@ -1,4 +1,4 @@
#!/bin/sh
srcFolder=../src/wasm-gc-teavm/js
echo Compiling $srcFolder
java -jar buildtools/closure-compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --assume_function_wrapper --emit_use_strict --isolation_mode IIFE --js $srcFolder/externs.js $srcFolder/eagruntime_util.js $srcFolder/eagruntime_main.js $srcFolder/platformApplication.js $srcFolder/platformAssets.js $srcFolder/platformAudio.js $srcFolder/platformFilesystem.js $srcFolder/platformInput.js $srcFolder/platformNetworking.js $srcFolder/platformOpenGL.js $srcFolder/platformRuntime.js $srcFolder/platformScreenRecord.js $srcFolder/platformVoiceClient.js $srcFolder/platformWebRTC.js $srcFolder/platformWebView.js $srcFolder/clientPlatformSingleplayer.js $srcFolder/serverPlatformSingleplayer.js $srcFolder/WASMGCBufferAllocator.js $srcFolder/fix-webm-duration.js $srcFolder/teavm_runtime.js $srcFolder/eagruntime_entrypoint.js --js_output_file javascript/eagruntime.js
java -jar buildtools/closure-compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --assume_function_wrapper --emit_use_strict --isolation_mode IIFE --js $srcFolder/externs.js $srcFolder/eagruntime_util.js $srcFolder/eagruntime_main.js $srcFolder/platformApplication.js $srcFolder/platformAssets.js $srcFolder/platformAudio.js $srcFolder/platformFilesystem.js $srcFolder/platformInput.js $srcFolder/platformNetworking.js $srcFolder/platformOpenGL.js $srcFolder/platformRuntime.js $srcFolder/platformVoiceClient.js $srcFolder/platformWebRTC.js $srcFolder/platformWebView.js $srcFolder/clientPlatformSingleplayer.js $srcFolder/serverPlatformSingleplayer.js $srcFolder/WASMGCBufferAllocator.js $srcFolder/fix-webm-duration.js $srcFolder/teavm_runtime.js $srcFolder/eagruntime_entrypoint.js --js_output_file javascript/eagruntime.js

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,17 +1,17 @@
(function(){'use strict';const da=["DEBUG","INFO","WARN","ERROR"];var ea="main",ka=null;function la(a,b,f){if(!(1>a)){var g="EagRuntimeJS: ["+(new Date).toLocaleTimeString()+"]["+ea+"/"+(da[a]||"UNKNOWN")+"] ";a:{if(0<f.length){for(var r=[],u=0;u<f.length;++u){var D=b.indexOf("{}");if(-1!=D)r.push(b.substring(0,D)),r.push(f[u]),b=b.substring(D+2);else break}if(0<r.length){r.push(b);f=r.join("");break a}}f=b}b=g+f;3<=a?console.error(b):console.log(b);ka&&ka(b,3<=a)}}function c(a,...b){la(1,a,b)}
function k(a,...b){la(3,a,b)}function oa(a,b){if(b){if(b.message?la(3,'{}: {} - "{}"',[a,b.name,b.message]):la(3,"{}: {}",[a,b.name]),"string"===typeof b.stack)for(b=qa(b.stack),a=0;a<b.length;++a)la(3," at "+b[a],[])}else la(3,"{}: <null>",[a])}function ra(a){return function(){k("Unsupported function called: {}.{}",a);return 0}}function y(a,b){a[b]=ra(b)}function sa(a){return new Promise(function(b){setTimeout(b,a)})}
class ua{constructor(){this.i=this.g=null;this.m=0}A(){return this.m}push(a){this.i&&(this.i._next=a);this.i=a;this.g||(this.g=a);++this.m}s(){if(this.g){const a=this.g;(this.g=a._next||null)?a._next=null:this.i=null;--this.m;return a}return null}};var va={},A={},wa={},xa={},ya={},F={},Ba={},H={},Ca={},Da=null,Ea=null,Ha=null,Ia=null,Ja=null,I=null,Ka=null,M=null,R=null,La=null,Oa=!1,Pa=0,S=null,Qa=!1,Ra=!1;const Sa=[];var Ta=null,Ua="_eaglercraftX",Va=!1,Wa=!1,Xa=!1,rb=!1,sb=!0,tb=!0,ub=!1;
function vb(){"string"===typeof I.localStorageNamespace&&(Ua=I.localStorageNamespace);"boolean"===typeof I.openDebugConsoleOnLaunch&&(Va=I.openDebugConsoleOnLaunch);"boolean"===typeof I.fixDebugConsoleUnloadListener&&(Wa=I.fixDebugConsoleUnloadListener);"boolean"===typeof I.forceWebGL1&&(Xa=I.forceWebGL1);"boolean"===typeof I.forceWebGL2&&(rb=I.forceWebGL2);"boolean"===typeof I.allowExperimentalWebGL1&&(sb=I.allowExperimentalWebGL1);"boolean"===typeof I.useWebGLExt&&(tb=I.useWebGLExt);"boolean"===
class ua{constructor(){this.i=this.g=null;this.m=0}A(){return this.m}push(a){this.i&&(this.i._next=a);this.i=a;this.g||(this.g=a);++this.m}s(){if(this.g){const a=this.g;(this.g=a._next||null)?a._next=null:this.i=null;--this.m;return a}return null}};var va={},A={},wa={},xa={},ya={},F={},za={},H={},Ca={},Da=null,Ea=null,Fa=null,Ia=null,Ja=null,I=null,Ka=null,M=null,R=null,La=null,Ma=!1,Pa=0,S=null,Qa=!1,Ra=!1;const Sa=[];var Ta=null,Ua="_eaglercraftX",Va=!1,Wa=!1,Xa=!1,Ya=!1,Za=!0,tb=!0,ub=!1;
function vb(){"string"===typeof I.localStorageNamespace&&(Ua=I.localStorageNamespace);"boolean"===typeof I.openDebugConsoleOnLaunch&&(Va=I.openDebugConsoleOnLaunch);"boolean"===typeof I.fixDebugConsoleUnloadListener&&(Wa=I.fixDebugConsoleUnloadListener);"boolean"===typeof I.forceWebGL1&&(Xa=I.forceWebGL1);"boolean"===typeof I.forceWebGL2&&(Ya=I.forceWebGL2);"boolean"===typeof I.allowExperimentalWebGL1&&(Za=I.allowExperimentalWebGL1);"boolean"===typeof I.useWebGLExt&&(tb=I.useWebGLExt);"boolean"===
typeof I.useDelayOnSwap&&(ub=I.useDelayOnSwap)}
async function wb(){function a(){try{r=new AudioContext}catch(D){oa("Could not initialize audio context",D)}}vb();ka=xb;"yes"!==window.__isEaglerX188UnloadListenerSet&&(window.onbeforeunload=function(){window.__curEaglerX188UnloadListenerCB&&window.__curEaglerX188UnloadListenerCB();return!1},window.__isEaglerX188UnloadListenerSet="yes");c("Initializing EagRuntime JS context...");await yb();zb();Ka.classList.add("_eaglercraftX_root_element");Ka.style.overflow="hidden";for(var b=null,f;f=Ka.lastChild;)b||=
f,Ka.removeChild(f);M=document.createElement("div");M.classList.add("_eaglercraftX_wrapper_element");M.style.position="relative";M.style.width="100%";M.style.height="100%";M.style.overflow="hidden";M.style.backgroundColor="black";Ka.appendChild(M);b&&(b.style.position="absolute",b.style.top="0px",b.style.left="0px",b.style.right="0px",b.style.bottom="0px",b.style.zIndex="2",b.classList.add("_eaglercraftX_early_splash_element"),M.appendChild(b));await sa(10);f=window.devicePixelRatio;b=f*M.clientWidth|
0;f=f*M.clientHeight|0;c("Initializing audio context");if("function"===typeof document.exitPointerLock){var g=navigator.userAgent;null!==g?(g=g.toLowerCase(),Qa=-1!==g.indexOf("mobi")||-1!==g.indexOf("tablet")):Qa=!1}else Qa=!0;var r=null;!Qa&&navigator.userActivation&&navigator.userActivation.hasBeenActive?a():(g=document.createElement("div"),g.classList.add("_eaglercraftX_press_any_key_image"),g.style.position="absolute",g.style.top="0px",g.style.left="0px",g.style.right="0px",g.style.bottom="0px",
g.style.width="100%",g.style.height="100%",g.style.zIndex="3",g.style.touchAction="pan-x pan-y",g.style.background='center / contain no-repeat url("'+Ha+'"), left / 1000000% 100% no-repeat url("'+Ha+'") white',g.style.setProperty("image-rendering","pixelated"),M.appendChild(g),await new Promise(function(D,J){function G(){if(!N){N=!0;Qa?M.removeChild(O):(window.removeEventListener("keydown",G),M.removeEventListener("mousedown",G),M.removeEventListener("touchstart",G));try{a()}catch(B){J(B);return}D()}}
g.style.width="100%",g.style.height="100%",g.style.zIndex="3",g.style.touchAction="pan-x pan-y",g.style.background='center / contain no-repeat url("'+Fa+'"), left / 1000000% 100% no-repeat url("'+Fa+'") white',g.style.setProperty("image-rendering","pixelated"),M.appendChild(g),await new Promise(function(D,J){function G(){if(!N){N=!0;Qa?M.removeChild(O):(window.removeEventListener("keydown",G),M.removeEventListener("mousedown",G),M.removeEventListener("touchstart",G));try{a()}catch(B){J(B);return}D()}}
var N=!1;if(Qa){var O=document.createElement("div");O.classList.add("_eaglercraftX_mobile_press_any_key");O.setAttribute("style","position:absolute;background-color:white;font-family:sans-serif;top:10%;left:10%;right:10%;bottom:10%;border:5px double black;padding:calc(5px + 7vh) 15px;text-align:center;font-size:20px;user-select:none;z-index:10;");O.innerHTML='<h3 style="margin-block-start:0px;margin-block-end:0px;margin:20px 5px;">Mobile Browser Detected</h3><p style="margin-block-start:0px;margin-block-end:0px;margin:20px 5px;">Warning: EaglercraftX WASM-GC requires a lot of memory and may not be stable on most mobile devices!</p><p style="margin-block-start:0px;margin-block-end:0px;margin:20px 2px;"><button style="font: 24px sans-serif;font-weight:bold;" class="_eaglercraftX_mobile_launch_client">Launch EaglercraftX</button></p><p style="margin-block-start:0px;margin-block-end:0px;margin:25px 5px;">(Tablets and phones with large screens work best)</p>';
O.querySelector("._eaglercraftX_mobile_launch_client").addEventListener("click",G);M.appendChild(O)}else window.addEventListener("keydown",G),M.addEventListener("mousedown",G),M.addEventListener("touchstart",G)}),M.removeChild(g));r?Ab(r):Bb();c("Creating main canvas");R=document.createElement("canvas");R.classList.add("_eaglercraftX_canvas_element");R.style.width="100%";R.style.height="100%";R.style.zIndex="1";R.style.touchAction="pan-x pan-y";R.style.setProperty("-webkit-touch-callout","none");
R.style.setProperty("-webkit-tap-highlight-color","rgba(255, 255, 255, 0)");R.style.setProperty("image-rendering","pixelated");R.width=b;R.height=f;M.appendChild(R);await Cb();c("Creating WebGL context");M.addEventListener("webglcontextcreationerror",function(D){k("[WebGL Error]: {}",D.statusMessage)});b={antialias:!1,depth:!1,powerPreference:"high-performance",desynchronized:!0,preserveDrawingBuffer:!1,premultipliedAlpha:!1,alpha:!1};g=!1;if(rb){c("Note: Forcing WebGL 2.0 context");f=300;var u=R.getContext("webgl2",
b);if(!u)return Db("WebGL 2.0 is not supported on this device!"),!1}else if(Xa){if(c("Note: Forcing WebGL 1.0 context"),f=200,u=R.getContext("webgl",b),!u)if(sb){if(g=!0,u=R.getContext("experimental-webgl",b),!u)return Db("WebGL is not supported on this device!"),!1}else return Db("WebGL is not supported on this device!"),!1}else if(f=300,u=R.getContext("webgl2",b),!u&&(f=200,u=R.getContext("webgl",b),!u))if(sb){if(g=!0,u=R.getContext("experimental-webgl",b),!u)return Db("WebGL is not supported on this device!"),
!1}else return Db("WebGL is not supported on this device!"),!1;g&&alert('WARNING: Detected "experimental" WebGL 1.0 support, certain graphics API features may be missing, and therefore EaglercraftX may malfunction and crash!');Pa=f;La=u;Oa=g;Eb(u,f);c("OpenGL Version: {}",H.glGetString(7938));c("OpenGL Renderer: {}",H.glGetString(7937));b=H.dumpActiveExtensions();if(0===b.length)c("Unlocked the following OpenGL ES extensions: (NONE)");else for(b.sort(),c("Unlocked the following OpenGL ES extensions:"),
R.style.setProperty("-webkit-tap-highlight-color","rgba(255, 255, 255, 0)");R.style.setProperty("image-rendering","pixelated");R.width=b;R.height=f;M.appendChild(R);await Cb();c("Creating WebGL context");M.addEventListener("webglcontextcreationerror",function(D){k("[WebGL Error]: {}",D.statusMessage)});b={antialias:!1,depth:!1,powerPreference:"high-performance",desynchronized:!0,preserveDrawingBuffer:!1,premultipliedAlpha:!1,alpha:!1};g=!1;if(Ya){c("Note: Forcing WebGL 2.0 context");f=300;var u=R.getContext("webgl2",
b);if(!u)return Db("WebGL 2.0 is not supported on this device!"),!1}else if(Xa){if(c("Note: Forcing WebGL 1.0 context"),f=200,u=R.getContext("webgl",b),!u)if(Za){if(g=!0,u=R.getContext("experimental-webgl",b),!u)return Db("WebGL is not supported on this device!"),!1}else return Db("WebGL is not supported on this device!"),!1}else if(f=300,u=R.getContext("webgl2",b),!u&&(f=200,u=R.getContext("webgl",b),!u))if(Za){if(g=!0,u=R.getContext("experimental-webgl",b),!u)return Db("WebGL is not supported on this device!"),
!1}else return Db("WebGL is not supported on this device!"),!1;g&&alert('WARNING: Detected "experimental" WebGL 1.0 support, certain graphics API features may be missing, and therefore EaglercraftX may malfunction and crash!');Pa=f;La=u;Ma=g;Eb(u,f);c("OpenGL Version: {}",H.glGetString(7938));c("OpenGL Renderer: {}",H.glGetString(7937));b=H.dumpActiveExtensions();if(0===b.length)c("Unlocked the following OpenGL ES extensions: (NONE)");else for(b.sort(),c("Unlocked the following OpenGL ES extensions:"),
f=0;f<b.length;++f)c(" - {}",b[f]);H.glClearColor(0,0,0,1);H.glClear(16384);await sa(20);c("EagRuntime JS context initialization complete");return!0}
async function Fb(){vb();ka=function(a,b){postMessage({ch:"~!LOGGER",txt:a,err:b})};c("Initializing EagRuntime worker JS context...");await yb();y(A,"setClipboard");y(A,"getClipboard");y(A,"displayFileChooser");y(A,"fileChooserHasResult");y(A,"getFileChooserResult");y(A,"clearFileChooserResult");y(A,"downloadFileWithNameU8");y(A,"downloadFileWithNameA");y(A,"downloadScreenshot");y(A,"showDebugConsole");y(A,"addLogMessage");y(A,"isShowingDebugConsole");y(A,"getFaviconURL");Bb();y(F,"keyboardLayoutSupported");
y(F,"iterateKeyboardLayout");y(F,"updateCanvasSize");y(F,"updatePlatformAndSleep");y(F,"isVSyncSupported");y(F,"mouseSetGrabbed");y(F,"isMouseGrabSupported");y(F,"isMouseGrabbed");y(F,"isPointerLocked");y(F,"supportsFullscreen");y(F,"toggleFullscreen");y(F,"isFullscreen");y(F,"touchSetOpenKeyboardZone");y(F,"touchCloseDeviceKeyboard");y(F,"touchIsDeviceKeyboardOpenMAYBE");y(F,"gamepadSupported");y(F,"isVisualViewport");y(H,"getCapBits");y(H,"glEnable");y(H,"glDisable");y(H,"glClearColor");y(H,"glClearDepth");
@ -34,7 +34,7 @@ b.appendChild(f);b.appendChild(g);g.innerHTML='<h2><svg style="vertical-align:mi
(new Date).toLocaleString()+'</p><p><br /><span style="font-size:1.1em;border-bottom:1px dashed #AAAAAA;padding-bottom:5px;">Things you can try:</span></p><ol><li><span style="font-weight:bold;">Just try using Eaglercraft on a different device</span>, it isn\'t a bug it\'s common sense</li><li style="margin-top:7px;">If this screen just appeared randomly, try restarting your browser or device</li><li style="margin-top:7px;">If you are not using Chrome/Edge, try installing the latest Google Chrome</li><li style="margin-top:7px;">If your browser is out of date, please update it to the latest version</li></ol></div>';
g.querySelector("#_eaglercraftX_crashReason").appendChild(document.createTextNode(a));try{var r=window.navigator.userAgent}catch(D){r="<error>"}g.querySelector("#_eaglercraftX_crashUserAgent").appendChild(document.createTextNode(r));Ta&&Ta();window.__curEaglerX188UnloadListenerCB=null;a="No GL_RENDERER string could be queried";try{const D=document.createElement("canvas");D.width=64;D.height=64;const J=D.getContext("webgl");if(J){if(J.getExtension("WEBGL_debug_renderer_info"))var u=J.getParameter(37446);
else(u=J.getParameter(WebGLRenderingContext.RENDERER))&&(u+=" [masked]");u&&(a=u)}}catch(D){}g.querySelector("#_eaglercraftX_crashWebGL").appendChild(document.createTextNode(a))}else alert("Compatibility error: "+a)}}var Rb=null;
function Lb(){if(Rb)return Rb;try{var a=La,b=Oa;if(!a){b=!1;var f=document.createElement("canvas");f.width=64;f.height=64;a=f.getContext("webgl2");a||(a=f.getContext("webgl"),a||(b=!0,a=f.getContext("experimental-webgl")))}return a?(f="",0<Pa&&(f+="webgl.version = "+a.getParameter(7938)+"\n"),f=a.getExtension("WEBGL_debug_renderer_info")?f+("webgl.renderer = "+a.getParameter(37446)+"\nwebgl.vendor = "+a.getParameter(37445)+"\n"):f+("webgl.renderer = "+a.getParameter(7937)+" [masked]\nwebgl.vendor = "+
function Lb(){if(Rb)return Rb;try{var a=La,b=Ma;if(!a){b=!1;var f=document.createElement("canvas");f.width=64;f.height=64;a=f.getContext("webgl2");a||(a=f.getContext("webgl"),a||(b=!0,a=f.getContext("experimental-webgl")))}return a?(f="",0<Pa&&(f+="webgl.version = "+a.getParameter(7938)+"\n"),f=a.getExtension("WEBGL_debug_renderer_info")?f+("webgl.renderer = "+a.getParameter(37446)+"\nwebgl.vendor = "+a.getParameter(37445)+"\n"):f+("webgl.renderer = "+a.getParameter(7937)+" [masked]\nwebgl.vendor = "+
a.getParameter(7936)+" [masked]\n"),0<Pa?(f+="\nwebgl.version.id = "+Pa+"\nwebgl.experimental = "+b,200===Pa?f+="\nwebgl.ext.ANGLE_instanced_arrays = "+!!a.getExtension("ANGLE_instanced_arrays")+"\nwebgl.ext.EXT_color_buffer_half_float = "+!!a.getExtension("EXT_color_buffer_half_float")+"\nwebgl.ext.EXT_shader_texture_lod = "+!!a.getExtension("EXT_shader_texture_lod")+"\nwebgl.ext.OES_fbo_render_mipmap = "+!!a.getExtension("OES_fbo_render_mipmap")+"\nwebgl.ext.OES_texture_float = "+!!a.getExtension("OES_texture_float")+
"\nwebgl.ext.OES_texture_half_float = "+!!a.getExtension("OES_texture_half_float")+"\nwebgl.ext.OES_texture_half_float_linear = "+!!a.getExtension("OES_texture_half_float_linear"):300<=Pa&&(f+="\nwebgl.ext.EXT_color_buffer_float = "+!!a.getExtension("EXT_color_buffer_float")+"\nwebgl.ext.EXT_color_buffer_half_float = "+!!a.getExtension("EXT_color_buffer_half_float")+"\nwebgl.ext.OES_texture_float_linear = "+!!a.getExtension("OES_texture_float_linear")),f+="\nwebgl.ext.EXT_texture_filter_anisotropic = "+
!!a.getExtension("EXT_texture_filter_anisotropic")+"\n"):f+="webgl.ext.ANGLE_instanced_arrays = "+!!a.getExtension("ANGLE_instanced_arrays")+"\nwebgl.ext.EXT_color_buffer_float = "+!!a.getExtension("EXT_color_buffer_float")+"\nwebgl.ext.EXT_color_buffer_half_float = "+!!a.getExtension("EXT_color_buffer_half_float")+"\nwebgl.ext.EXT_shader_texture_lod = "+!!a.getExtension("EXT_shader_texture_lod")+"\nwebgl.ext.OES_fbo_render_mipmap = "+!!a.getExtension("OES_fbo_render_mipmap")+"\nwebgl.ext.OES_texture_float = "+
@ -64,10 +64,10 @@ ya.eaglerExists=new WebAssembly.Suspending(function(a,b){return new Promise(func
ya.eaglerCopy=new WebAssembly.Suspending(async function(a,b,f){return(b=await bc(a,b))&&await cc(a,f,b)});ya.eaglerSize=new WebAssembly.Suspending(function(a,b){return new Promise(function(f){const g=a.transaction("filesystem","readonly").objectStore("filesystem").get([b]);g.addEventListener("success",function(){const r=$b(g.result);f(r?r.byteLength:-1)});g.addEventListener("error",function(){f(-1)})})});
function dc(a){if(0===a.length)return-1;for(var b=0,f=0,g=a.length;f<g;++f)47===a.charCodeAt(f)&&++b;return b}
ya.eaglerIterate=new WebAssembly.Suspending(function(a,b,f){return new Promise(function(g){const r=[],u=a.transaction("filesystem","readonly").objectStore("filesystem").openCursor(),D=0===b.length,J=f?-1:dc(b);u.addEventListener("success",function(){const G=u.result;if(null===G||null===G.key)g({length:r.length,getRow:function(O){return r[O]}});else{var N=Zb(G.key);null!=N&&(!D&&!N.startsWith(b)||!f&&dc(N)!==J||r.push(N));G.continue()}});u.addEventListener("error",function(){g(null)})})});async function Cb(){function a(){var e=window.devicePixelRatio;.01>e&&(e=1);ha=X=0;for(var t=R;t&&!isNaN(t.offsetLeft)&&!isNaN(t.offsetTop);)X+=t.offsetLeft-t.scrollLeft,ha+=t.offsetTop-t.scrollTop,t=t.offsetParent;t=M.clientWidth*e|0;var Q=M.clientHeight*e|0,K=0,U=0,ja=t,fa=Q;if(aa){fa=window.visualViewport;var V=fa.scale;K=fa.pageLeft*e*V;U=fa.pageTop*e*V;ja=fa.width*e*V;fa=fa.height*e*V;1>ja&&(ja=1);1>fa&&(fa=1);0>K?(ja+=K,K=0):K>=t&&(K=t-1);0>U?(fa+=U,U=0):U>=Q&&(U=Q-1);K+ja>t&&(ja=t-K);U+fa>
Q&&(fa=Q-U)}V={eventTypeMask:0};L!==e&&(L=e,V.eventTypeMask|=4,V.windowDPI=e);if(C!==t||T!==Q)C=t,T=Q,V.eventTypeMask|=1,V.windowWidth=t,V.windowHeight=Q;if(ia!==K||Ma!==U||za!==ja||Na!==fa)ia=K,Ma=U,za=ja,Na=fa,V.eventTypeMask|=2,V.visualViewportX=K,V.visualViewportY=U,V.visualViewportW=ja,V.visualViewportH=fa;0!==V.eventTypeMask&&Y(0,9,V)}function b(e){const t=e.length,Q=Array(t);for(var K=0;K<t;++K){const U=e.item(K);Q[K]={pointX:U.pageX-X,pointY:U.pageY-ha,radius:.5*(U.radiusX+U.radiusY),force:U.force,
Q&&(fa=Q-U)}V={eventTypeMask:0};L!==e&&(L=e,V.eventTypeMask|=4,V.windowDPI=e);if(C!==t||T!==Q)C=t,T=Q,V.eventTypeMask|=1,V.windowWidth=t,V.windowHeight=Q;if(ia!==K||Na!==U||Aa!==ja||Oa!==fa)ia=K,Na=U,Aa=ja,Oa=fa,V.eventTypeMask|=2,V.visualViewportX=K,V.visualViewportY=U,V.visualViewportW=ja,V.visualViewportH=fa;0!==V.eventTypeMask&&Y(0,9,V)}function b(e){const t=e.length,Q=Array(t);for(var K=0;K<t;++K){const U=e.item(K);Q[K]={pointX:U.pageX-X,pointY:U.pageY-ha,radius:.5*(U.radiusX+U.radiusY),force:U.force,
pointUID:U.identifier}}return Q}function f(e,t){return{eventType:e,keyCode:t.code||null,keyName:t.key||null,legacyCode:"number"===typeof t.which?t.which:"number"===typeof t.keyCode?t.keyCode:0,location:t.location,mods:(t.ctrlKey?1:0)|(t.shiftKey?2:0)|(t.metaKey?4:0)}}function g(){return new Promise(function(e){if(-1!==E)throw Error("Main thread is already waiting for VSync!");const t=[!1];window.requestAnimationFrame(function(){t[0]||(t[0]=!0,-1!==E&&(window.clearTimeout(E),E=-1),e())});E=window.setTimeout(function(){t[0]||
(t[0]=!0,E=-1,e())},20)})}function r(e){return new Promise(function(t){setTimeout(t,e)})}function u(e){if(0<e&&1E3>=e){const Q=1E3/e;if(0===ba)ba=performance.now()+Q;else{e=performance.now();var t=ba-e|0;if(0<t)return!ub&&ec?fc().then(function(){var K=performance.now(),U=ba-K|0;if(0<U)return r(U).then(function(){var ja=performance.now();(ba+=Q)<ja&&(ba=ja)});(ba+=Q)<K&&(ba=K)}):r(t).then(function(){var K=performance.now();(ba+=Q)<K&&(ba=K)});(ba+=Q)<e&&(ba=e)}}else ba=0;return ub?gc(0):fc()}function D(e){if(ta){pa=
!!e;var t=performance.now()|0;if(e){Aa=!0;try{R.requestPointerLock()}catch(Q){}-1!==ma&&window.clearTimeout(ma);ma=-1;3E3>t-Fa&&(ma=window.setTimeout(function(){try{R.requestPointerLock()}catch(Q){}},3100-(t-Fa)))}else if(-1!==ma&&window.clearTimeout(ma),ma=-1,!Aa)try{document.exitPointerLock()}catch(Q){}}}function J(){if(ca)if(h.matches){if(m)try{navigator.keyboard.unlock()}catch(e){}try{document.exitFullscreen()}catch(e){}}else{if(m)try{navigator.keyboard.lock()}catch(e){}try{R.requestFullscreen()}catch(e){}}}
!!e;var t=performance.now()|0;if(e){Ba=!0;try{R.requestPointerLock()}catch(Q){}-1!==ma&&window.clearTimeout(ma);ma=-1;3E3>t-Ga&&(ma=window.setTimeout(function(){try{R.requestPointerLock()}catch(Q){}},3100-(t-Ga)))}else if(-1!==ma&&window.clearTimeout(ma),ma=-1,!Ba)try{document.exitPointerLock()}catch(Q){}}}function J(){if(ca)if(h.matches){if(m)try{navigator.keyboard.unlock()}catch(e){}try{document.exitFullscreen()}catch(e){}}else{if(m)try{navigator.keyboard.lock()}catch(e){}try{R.requestFullscreen()}catch(e){}}}
function G(){O()?N():d?(d.blur(),d.value="",setTimeout(function(){d&&(p?p.removeChild(d):d.remove(),d=null);p&&(M.removeChild(p),p=null)},10)):(p&&(M.removeChild(p),p=null),p=document.createElement("form"),p.setAttribute("autocomplete","off"),p.classList.add("_eaglercraftX_text_input_wrapper"),p.style.position="absolute",p.style.top="0px",p.style.left="0px",p.style.right="0px",p.style.bottom="0px",p.style.zIndex="-100",p.style.margin="0px",p.style.padding="0px",p.style.border="none",p.addEventListener("submit",
function(e){e.preventDefault();e.stopPropagation();e=e.timeStamp;e&&(0!==w&&10>e-w||0!==l&&10>e-l||0!==z&&10>e-z)||(n||(c("Note: Generating return keystroke from submit event on form, this browser probably doesn't generate keydown/beforeinput/input when enter/return is pressed on the on-screen keyboard"),n=!0),Y(0,3,{eventType:0,absoluteCode:28,absoluteChar:10}))}),d=document.createElement("input"),d.type="password",d.value=" ",d.classList.add("_eaglercraftX_text_input_element"),d.setAttribute("autocomplete",
"off"),d.style.position="absolute",d.style.top="0px",d.style.left="0px",d.style.right="0px",d.style.bottom="0px",d.style.zIndex="-100",d.style.margin="0px",d.style.padding="0px",d.style.border="none",d.style.setProperty("-webkit-touch-callout","default"),d.addEventListener("beforeinput",function(e){if(d===e.target){q||(c("Note: Caught beforeinput event from on-screen keyboard, browser probably does not generate global keydown/keyup events on text fields, or does not respond to cancelling keydown"),
@ -75,25 +75,25 @@ q=!0);var t=e.timeStamp;if(t){if(0!==w&&10>t-w)return;l=t}e.preventDefault();e.s
3,{eventType:0,absoluteCode:211,absoluteChar:0});break;case "insertText":case "insertCompositionText":case "insertReplacementText":(e=e.data)&&0<e.length&&Y(0,3,{eventType:1,codepoints:e});break;case "insertFromPaste":case "insertFromPasteAsQuotation":case "insertFromDrop":case "insertFromYank":case "insertLink":(e=e.data)&&0<e.length&&Y(0,4,e);break;case "historyUndo":case "historyRedo":case "deleteByDrag":case "deleteByCut":break;default:c('Ignoring InputEvent.inputType "{}" from on-screen keyboard',
e.inputType)}}}),d.addEventListener("input",function(e){if(d===e.target){v||(c("Note: Caught legacy input events from on-screen keyboard, browser could be outdated and doesn't support beforeinput event, or does not respond to cancelling beforeinput"),v=!0);if(e=e.timeStamp){if(0!==w&&10>e-w||0!==l&&10>e-l)return;z=e}e=d.value;var t=e.length;0===t?Y(0,3,{eventType:0,absoluteCode:14,absoluteChar:0}):1===t?Y(0,3,{eventType:1,codepoints:e}):(e=e.trim(),t=e.length,0===t?Y(0,3,{eventType:0,absoluteCode:57,
absoluteChar:32}):Y(0,3,{eventType:1,codepoints:e.charAt(t-1)}));d.value=" ";d.setSelectionRange(1,1)}}),d.addEventListener("focus",function(e){d===e.target&&(d.value=" ",d.setSelectionRange(1,1))}),d.addEventListener("select",function(e){d===e.target&&(e.preventDefault(),e.stopPropagation(),d.value=" ",d.setSelectionRange(1,1))}),p.appendChild(d),M.appendChild(p),d.value=" ",d.focus(),d.select(),d.setSelectionRange(1,1))}function N(){if(d){d.blur();d.value="";const e=d,t=p;window.setTimeout(function(){null!==
t?(t.removeChild(e),t.remove()):e.remove()},10);p=d=null}else p&&(M?M.removeChild(p):p.remove(),p=null)}function O(){return!!d&&document.activeElement===d}var B=null,X=0,ha=0,p=null,d=null,q=!1,v=!1,n=!1,w=0,l=0,z=0,C=-1,T=-1,L=-1,aa=!1,ia=-1,Ma=-1,za=-1,Na=-1,ta=!1,pa=!1,Aa=!1,Fa=0,ma=-1,ca=!1,h=null,m=!1,x=!1,E=-1,P=!1,W=null,na=null,Ga=null,Ya=null,Za=null,$a=null,ab=null,bb=null,cb=null,db=null,eb=null,fb=null,gb=null,hb=null,ib=null,jb=null,kb=null,lb=null,mb=null,nb=null,ob=null,pb=null,qb=
t?(t.removeChild(e),t.remove()):e.remove()},10);p=d=null}else p&&(M?M.removeChild(p):p.remove(),p=null)}function O(){return!!d&&document.activeElement===d}var B=null,X=0,ha=0,p=null,d=null,q=!1,v=!1,n=!1,w=0,l=0,z=0,C=-1,T=-1,L=-1,aa=!1,ia=-1,Na=-1,Aa=-1,Oa=-1,ta=!1,pa=!1,Ba=!1,Ga=0,ma=-1,ca=!1,h=null,m=!1,x=!1,E=-1,P=!1,W=null,na=null,Ha=null,$a=null,ab=null,bb=null,cb=null,db=null,eb=null,fb=null,gb=null,hb=null,ib=null,jb=null,kb=null,lb=null,mb=null,nb=null,ob=null,pb=null,qb=null,rb=null,sb=
null;B=document.createElement("div");B.classList.add("_eaglercraftX_keyboard_open_zone");B.style.display="none";B.style.position="absolute";B.style.backgroundColor="transparent";B.style.top="0px";B.style.left="0px";B.style.width="0px";B.style.height="0px";B.style.zIndex="100";B.style.touchAction="pan-x pan-y";B.style.setProperty("-webkit-touch-callout","none");B.style.setProperty("-webkit-tap-highlight-color","rgba(255, 255, 255, 0)");M.appendChild(B);a();M.addEventListener("contextmenu",W=function(e){e.preventDefault();
e.stopPropagation()});R.addEventListener("mousedown",na=function(e){e.preventDefault();e.stopPropagation();ta&&pa&&document.pointerLockElement!==R?D(1):Y(0,0,{eventType:0,posX:e.offsetX,posY:e.offsetY,button:e.button})});R.addEventListener("mouseup",Ga=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:1,posX:e.offsetX,posY:e.offsetY,button:e.button})});R.addEventListener("mousemove",Ya=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:2,posX:e.offsetX,posY:e.offsetY,
movementX:e.movementX,movementY:e.movementY})});R.addEventListener("mouseenter",Za=function(){Y(0,7,null)});R.addEventListener("mouseleave",$a=function(){Y(0,8,null)});R.addEventListener("touchstart",ab=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:0,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)});N()});R.addEventListener("touchend",bb=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:2,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});
R.addEventListener("touchmove",cb=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:1,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});R.addEventListener("touchcancel",db=function(e){Y(0,2,{eventType:2,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});R.addEventListener("wheel",lb=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:3,posX:e.offsetX,posY:e.offsetY,wheel:e.deltaY})});window.addEventListener("blur",nb=function(){Y(0,
6,null)});window.addEventListener("focus",mb=function(){Y(0,5,null)});window.addEventListener("keydown",gb=function(e){e.preventDefault();e.stopPropagation();"F11"!==e.key||e.repeat?(Y(0,1,f(e.repeat?2:0,e)),e.timeStamp&&"Unidentified"!==e.key&&(w=e.timeStamp)):J()});window.addEventListener("keyup",hb=function(e){e.preventDefault();e.stopPropagation();Y(0,1,f(1,e))});B.addEventListener("touchstart",ib=function(e){e.preventDefault();e.stopPropagation()});B.addEventListener("touchend",jb=function(e){e.preventDefault();
e.stopPropagation();G()});B.addEventListener("touchmove",kb=function(e){e.preventDefault();e.stopPropagation()});(ta="function"===typeof document.exitPointerLock)?(document.addEventListener("pointerlockchange",ob=function(){window.setTimeout(function(){const e=document.pointerLockElement===R;e||pa&&(Fa=performance.now()|0);pa=e},60);Aa=!1}),document.addEventListener("pointerlockerror",pb=function(){Aa=!1})):k("Pointer lock is not supported on this browser");(ca="function"===typeof document.exitFullscreen)?
(h=window.matchMedia("(display-mode: fullscreen)"),(m=!(!navigator.keyboard||!navigator.keyboard.lock))&&h.addEventListener("change",qb=function(){h.matches||navigator.keyboard.unlock()})):k("Fullscreen is not supported on this browser");if("undefined"!==typeof window.visualViewport)if("body"===Ka.tagName.toLowerCase())aa=!0;else{const e=document.body;10>=Math.abs(e.clientWidth-M.clientWidth)&&10>=Math.abs(e.clientHeight-M.clientHeight)&&(aa=!0)}else aa=!1;aa&&c("Note: Detected game is embedded in body, some screens may be resized to window.visualViewport instead for a better mobile experience");
try{await g(),x=!0}catch(e){x=!1}x||k("VSync is not supported on this browser");(P="function"===typeof navigator.getGamepads)?(window.addEventListener("gamepadconnected",eb=function(){Y(0,10,{eventType:0})}),window.addEventListener("gamepaddisconnected",fb=function(e){Y(0,10,{eventType:1,gamepad:e.gamepad})})):k("Gamepad detected as unsupported!");F.keyboardLayoutSupported=function(){return!(!navigator.keyboard||!navigator.keyboard.getLayoutMap)};F.iterateKeyboardLayout=new WebAssembly.Suspending(async function(){const e=
e.stopPropagation()});R.addEventListener("mousedown",na=function(e){e.preventDefault();e.stopPropagation();ta&&pa&&document.pointerLockElement!==R?D(1):Y(0,0,{eventType:0,posX:e.offsetX,posY:e.offsetY,button:e.button})});R.addEventListener("mouseup",Ha=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:1,posX:e.offsetX,posY:e.offsetY,button:e.button})});R.addEventListener("mousemove",$a=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:2,posX:e.offsetX,posY:e.offsetY,
movementX:e.movementX,movementY:e.movementY})});R.addEventListener("mouseenter",ab=function(){Y(0,7,null)});R.addEventListener("mouseleave",bb=function(){Y(0,8,null)});R.addEventListener("touchstart",cb=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:0,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)});N()});R.addEventListener("touchend",db=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:2,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});
R.addEventListener("touchmove",eb=function(e){e.preventDefault();e.stopPropagation();Y(0,2,{eventType:1,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});R.addEventListener("touchcancel",fb=function(e){Y(0,2,{eventType:2,changedTouches:b(e.changedTouches),targetTouches:b(e.targetTouches)})});R.addEventListener("wheel",nb=function(e){e.preventDefault();e.stopPropagation();Y(0,0,{eventType:3,posX:e.offsetX,posY:e.offsetY,wheel:e.deltaY})});window.addEventListener("blur",pb=function(){Y(0,
6,null)});window.addEventListener("focus",ob=function(){Y(0,5,null)});window.addEventListener("keydown",ib=function(e){e.preventDefault();e.stopPropagation();"F11"!==e.key||e.repeat?(Y(0,1,f(e.repeat?2:0,e)),e.timeStamp&&"Unidentified"!==e.key&&(w=e.timeStamp)):J()});window.addEventListener("keyup",jb=function(e){e.preventDefault();e.stopPropagation();Y(0,1,f(1,e))});B.addEventListener("touchstart",kb=function(e){e.preventDefault();e.stopPropagation()});B.addEventListener("touchend",lb=function(e){e.preventDefault();
e.stopPropagation();G()});B.addEventListener("touchmove",mb=function(e){e.preventDefault();e.stopPropagation()});(ta="function"===typeof document.exitPointerLock)?(document.addEventListener("pointerlockchange",qb=function(){window.setTimeout(function(){const e=document.pointerLockElement===R;e||pa&&(Ga=performance.now()|0);pa=e},60);Ba=!1}),document.addEventListener("pointerlockerror",rb=function(){Ba=!1})):k("Pointer lock is not supported on this browser");(ca="function"===typeof document.exitFullscreen)?
(h=window.matchMedia("(display-mode: fullscreen)"),(m=!(!navigator.keyboard||!navigator.keyboard.lock))&&h.addEventListener("change",sb=function(){h.matches||navigator.keyboard.unlock()})):k("Fullscreen is not supported on this browser");if("undefined"!==typeof window.visualViewport)if("body"===Ka.tagName.toLowerCase())aa=!0;else{const e=document.body;10>=Math.abs(e.clientWidth-M.clientWidth)&&10>=Math.abs(e.clientHeight-M.clientHeight)&&(aa=!0)}else aa=!1;aa&&c("Note: Detected game is embedded in body, some screens may be resized to window.visualViewport instead for a better mobile experience");
try{await g(),x=!0}catch(e){x=!1}x||k("VSync is not supported on this browser");(P="function"===typeof navigator.getGamepads)?(window.addEventListener("gamepadconnected",gb=function(){Y(0,10,{eventType:0})}),window.addEventListener("gamepaddisconnected",hb=function(e){Y(0,10,{eventType:1,gamepad:e.gamepad})})):k("Gamepad detected as unsupported!");F.keyboardLayoutSupported=function(){return!(!navigator.keyboard||!navigator.keyboard.getLayoutMap)};F.iterateKeyboardLayout=new WebAssembly.Suspending(async function(){const e=
[];try{const t=await navigator.keyboard.getLayoutMap();t&&t.forEach&&t.forEach(function(Q,K){e.push({key:Q,value:K})})}catch(t){}return e});F.updateCanvasSize=function(e,t){R.width!==e&&(R.width=e);R.height!==t&&(R.height=t)};var ba=0;F.updatePlatformAndSleep=new WebAssembly.Suspending(function(e,t){a();if("string"!==typeof document.visibilityState||"visible"===document.visibilityState)return x&&t?(ba=0,g()):0>=e?(ba=0,ub?gc(0):fc()):u(e);ba=0;return r(50)});F.isVSyncSupported=function(){return x};
F.mouseSetGrabbed=D;F.isMouseGrabSupported=function(){return ta};F.isMouseGrabbed=function(){return pa};F.isPointerLocked=function(){return ta&&(Aa||document.pointerLockElement===R)};F.supportsFullscreen=function(){return ca};F.toggleFullscreen=J;F.isFullscreen=function(){return ca&&h.matches};F.touchSetOpenKeyboardZone=function(e,t,Q,K){0!==Q&&0!==K?(B.style.display="block",B.style.top=""+(T-t-K)/L+"px",B.style.left=""+e/L+"px",B.style.width=""+Q/L+"px",B.style.height=""+K/L+"px"):(B.style.display=
"none",B.style.top="0px",B.style.left="0px",B.style.width="0px",B.style.height="0px")};F.touchCloseDeviceKeyboard=N;F.touchIsDeviceKeyboardOpenMAYBE=O;F.gamepadSupported=function(){return P};F.isVisualViewport=function(){return aa};Ta=function(){try{W&&(M.removeEventListener("contextmenu",W),W=null),na&&(R.removeEventListener("mousedown",na),na=null),Ga&&(R.removeEventListener("mouseup",Ga),Ga=null),Ya&&(R.removeEventListener("mousemove",Ya),Ya=null),Za&&(R.removeEventListener("mouseenter",Za),Za=
null),$a&&(R.removeEventListener("mouseleave",$a),$a=null),ab&&(R.removeEventListener("touchstart",ab),ab=null),bb&&(R.removeEventListener("touchend",bb),bb=null),cb&&(R.removeEventListener("touchmove",cb),cb=null),db&&(R.removeEventListener("touchcancel",db),db=null),eb&&(window.removeEventListener("gamepadconnected",eb),eb=null),fb&&(window.removeEventListener("gamepaddisconnected",fb),fb=null),gb&&(window.removeEventListener("keydown",gb),gb=null),hb&&(window.removeEventListener("keyup",hb),hb=
null),ib&&(B.removeEventListener("touchstart",ib),ib=null),jb&&(B.removeEventListener("touchend",jb),jb=null),kb&&(B.removeEventListener("touchmove",kb),kb=null),lb&&(R.removeEventListener("wheel",lb),lb=null),mb&&(window.removeEventListener("focus",mb),mb=null),nb&&(window.removeEventListener("blur",nb),nb=null),ob&&(document.removeEventListener("pointerlockchange",ob),ob=null),pb&&(document.removeEventListener("pointerlockerror",pb),pb=null),qb&&(h.removeEventListener("change",qb),qb=null)}catch(e){k("Failed to remove event listeners! {}",
F.mouseSetGrabbed=D;F.isMouseGrabSupported=function(){return ta};F.isMouseGrabbed=function(){return pa};F.isPointerLocked=function(){return ta&&(Ba||document.pointerLockElement===R)};F.supportsFullscreen=function(){return ca};F.toggleFullscreen=J;F.isFullscreen=function(){return ca&&h.matches};F.touchSetOpenKeyboardZone=function(e,t,Q,K){0!==Q&&0!==K?(B.style.display="block",B.style.top=""+(T-t-K)/L+"px",B.style.left=""+e/L+"px",B.style.width=""+Q/L+"px",B.style.height=""+K/L+"px"):(B.style.display=
"none",B.style.top="0px",B.style.left="0px",B.style.width="0px",B.style.height="0px")};F.touchCloseDeviceKeyboard=N;F.touchIsDeviceKeyboardOpenMAYBE=O;F.gamepadSupported=function(){return P};F.isVisualViewport=function(){return aa};Ta=function(){try{W&&(M.removeEventListener("contextmenu",W),W=null),na&&(R.removeEventListener("mousedown",na),na=null),Ha&&(R.removeEventListener("mouseup",Ha),Ha=null),$a&&(R.removeEventListener("mousemove",$a),$a=null),ab&&(R.removeEventListener("mouseenter",ab),ab=
null),bb&&(R.removeEventListener("mouseleave",bb),bb=null),cb&&(R.removeEventListener("touchstart",cb),cb=null),db&&(R.removeEventListener("touchend",db),db=null),eb&&(R.removeEventListener("touchmove",eb),eb=null),fb&&(R.removeEventListener("touchcancel",fb),fb=null),gb&&(window.removeEventListener("gamepadconnected",gb),gb=null),hb&&(window.removeEventListener("gamepaddisconnected",hb),hb=null),ib&&(window.removeEventListener("keydown",ib),ib=null),jb&&(window.removeEventListener("keyup",jb),jb=
null),kb&&(B.removeEventListener("touchstart",kb),kb=null),lb&&(B.removeEventListener("touchend",lb),lb=null),mb&&(B.removeEventListener("touchmove",mb),mb=null),nb&&(R.removeEventListener("wheel",nb),nb=null),ob&&(window.removeEventListener("focus",ob),ob=null),pb&&(window.removeEventListener("blur",pb),pb=null),qb&&(document.removeEventListener("pointerlockchange",qb),qb=null),rb&&(document.removeEventListener("pointerlockerror",rb),rb=null),sb&&(h.removeEventListener("change",sb),sb=null)}catch(e){k("Failed to remove event listeners! {}",
e)}Ta=null}};(function(){function a(){this._socket.close()}function b(l){this._socket.send(l)}function f(l){this._socket.send(l)}function g(){return this._frameCountStr+this._frameCountBin}function r(){const l=this._queue;return l?(l._next===l&&l._prev===l?this._queue=null:(this._queue=l._next,l._prev._next=l._next,l._next._prev=l._prev),l._next=null,l._prev=null,0===l.type?--this._frameCountStr:--this._frameCountBin,l):null}function u(){var l=this._frameCountStr+this._frameCountBin;if(0===l)return null;l=Array(l);
var z=0,C=this._queue;const T=C;do{l[z++]=C;var L=C._next;C._next=null;C._prev=null;C=L}while(C!==T);this._queue=null;this._frameCountBin=this._frameCountStr=0;return l}function D(){this._queue=null;this._frameCountBin=this._frameCountStr=0}function J(l,z){var C=l._queue;if(!C)return null;const T=C;do{var L=C._next;if(C.type===z)return z=C._prev,L===C&&z===C?l._queue=null:(C===T&&(l._queue=L),z._next=L,L._prev=z),C._next=null,C._prev=null,C;C=L}while(C!==T);return null}function G(l,z,C){var T=0,L=
l._queue,aa=L;do{var ia=L._next;L.type===z&&(C[T++]=L);L=ia}while(L!==aa);C.length=T;for(aa=0;aa<T;++aa)L=C[aa],ia=L._next,z=L._prev,ia===L&&z===L?l._queue=null:(L===l._queue&&(l._queue=ia),z._next=ia,ia._prev=z)}function N(){return this._frameCountStr}function O(){if(0===this._frameCountStr)return null;const l=J(this,0);l?--this._frameCountStr:this._frameCountStr=0;return l}function B(){var l=this._frameCountStr;if(0===l)return null;l=Array(l);G(this,0,l);this._frameCountStr=0;return l}function X(){const l=
this._frameCountStr;if(0===l)return null;G(this,0,Array(l));this._frameCountStr=0}function ha(){return this._frameCountBin}function p(){if(0===this._frameCountBin)return null;const l=J(this,1);l?--this._frameCountBin:this._frameCountBin=0;return l}function d(){var l=this._frameCountBin;if(0===l)return null;l=Array(l);G(this,1,l);this._frameCountBin=0;return l}function q(){const l=this._frameCountBin;if(0===l)return null;G(this,1,Array(l));this._frameCountBin=0}function v(l){this._enableStringFrames=
l}function n(l){this._enableBinaryFrames=l}function w(l){const z="string"===typeof l;if(z){if(!this._enableStringFrames)return}else if(!this._enableBinaryFrames)return;l={type:z?0:1,data:l,timestamp:performance.now(),_next:null,_prev:null};const C=this._queue;if(C){const T=C._prev;T._next=l;l._prev=T;l._next=C;C._prev=l}else this._queue=l,l._next=l,l._prev=l;z?++this._frameCountStr:++this._frameCountBin}Ba.createWebSocketHandle=function(l){let z;try{z=new WebSocket(l)}catch(T){return k("Failed to create WebSocket: {}",
l}function n(l){this._enableBinaryFrames=l}function w(l){const z="string"===typeof l;if(z){if(!this._enableStringFrames)return}else if(!this._enableBinaryFrames)return;l={type:z?0:1,data:l,timestamp:performance.now(),_next:null,_prev:null};const C=this._queue;if(C){const T=C._prev;T._next=l;l._prev=T;l._next=C;C._prev=l}else this._queue=l,l._next=l,l._prev=l;z?++this._frameCountStr:++this._frameCountBin}za.createWebSocketHandle=function(l){let z;try{z=new WebSocket(l)}catch(T){return k("Failed to create WebSocket: {}",
l),oa("Exception Caught",T),null}z.binaryType="arraybuffer";const C={state:1,_socket:z,_queue:null,_frameCountStr:0,_frameCountBin:0,_addRecievedFrame:w,_enableStringFrames:!0,_enableBinaryFrames:!0,closeSocket:a,sendStringFrame:b,sendBinaryFrame:f,availableFrames:g,getNextFrame:r,getAllFrames:u,clearFrames:D,availableStringFrames:N,getNextStringFrame:O,getAllStringFrames:B,clearStringFrames:X,availableBinaryFrames:ha,getNextBinaryFrame:p,getAllBinaryFrames:d,clearBinaryFrames:q,setEnableStringFrames:v,
setEnableBinaryFrames:n};z.addEventListener("open",function(){C.state=2});z.addEventListener("message",function(T){C._addRecievedFrame(T.data)});z.addEventListener("close",function(){3!==C.state&&(C.state=0)});z.addEventListener("error",function(){1===C.state&&(C.state=3)});return C}})();function Eb(a,b){var f=tb;const g=f&&200===b?a.getExtension("OES_vertex_array_object"):null,r=f&&200===b?a.getExtension("ANGLE_instanced_arrays"):null,u=f&&200===b&&null!==r,D=f&&(310===b||300===b)&&null!==a.getExtension("EXT_color_buffer_float"),J=f&&!D&&(310===b||300===b||200===b)&&null!==a.getExtension("EXT_color_buffer_half_float"),G=f&&200===b&&null!==a.getExtension("EXT_shader_texture_lod"),N=f&&200===b&&null!==a.getExtension("OES_fbo_render_mipmap"),O=f&&200===b&&null!==g,B=f&&200===b&&null!==
a.getExtension("OES_texture_float"),X=f&&300<=b&&null!==a.getExtension("OES_texture_float_linear"),ha=f&&200===b&&null!==a.getExtension("OES_texture_half_float"),p=f&&200===b&&null!==a.getExtension("OES_texture_half_float_linear");f=f&&null!==a.getExtension("EXT_texture_filter_anisotropic");const d=null!==a.getExtension("WEBGL_debug_renderer_info"),q=300<=b?0:200===b&&O?1:-1,v=300<=b?0:200===b&&u?1:-1,n=[b,q,v,0,0];if(300<=b||N)n[3]|=4;if(300<=b||G)n[3]|=8;300<=b&&(n[3]|=16);(320<=b||(300<=b||B)&&
@ -113,27 +113,48 @@ r.drawArraysInstancedANGLE.bind(r);H.glDrawElementsInstanced=r.drawElementsInsta
Ca.getEaglercraftXOpts=function(){return I};Ca.getEventCount=Hb.A.bind(Hb);Ca.getNextEvent=Hb.s.bind(Hb);
Ca.queueAsyncDownload=function(a,b,f){try{fetch(a,{cache:b?"force-cache":"no-store",mode:"cors"}).then(function(g){return g.arrayBuffer()}).then(function(g){Y(1,0,{requestId:f,arrayBuffer:g})}).catch(function(g){k("Failed to complete async download: {}",a);oa("Exception Caught",g);Y(1,0,{requestId:f,arrayBuffer:null})})}catch(g){k("Failed to fetch: {}",a),oa("Exception Caught",g),Y(1,0,{requestId:f,arrayBuffer:null})}};
Ca.download=new WebAssembly.Suspending(function(a,b){return new Promise(function(f){try{fetch(a,{cache:b?"force-cache":"no-store",mode:"cors"}).then(function(g){return g.arrayBuffer()}).then(function(g){f(g)}).catch(function(g){k("Failed to complete download: {}",a);oa("Exception Caught",g);f(null)})}catch(g){k("Failed to fetch: {}",a),oa("Exception Caught",g),f(null)}})});Ca.writeCrashReport=function(a){Kb(a,!1)};Ca.steadyTimeMillis=performance.now.bind(performance);
function gc(a){return new Promise(function(b){setTimeout(b,a)})}Ca.sleep=new WebAssembly.Suspending(gc);function jc(a){ec?(ic=a,hc.port1.postMessage(0)):setTimeout(a,0)}function fc(){return new Promise(jc)}Ca.immediateContinue=new WebAssembly.Suspending(fc);Ca.immediateContinueSupported=function(){return ec};Ca.setCrashReportString=function(a,b){Sa[a]=b};va.getByteBufferView=function(a,b){return new Int8Array(S,a,b)};va.getUnsignedByteBufferView=function(a,b){return new Uint8Array(S,a,b)};va.getUnsignedClampedByteBufferView=function(a,b){return new Uint8ClampedArray(S,a,b)};va.getShortBufferView=function(a,b){return new Int16Array(S,a,b)};va.getUnsignedShortBufferView=function(a,b){return new Uint16Array(S,a,b)};va.getIntBufferView=function(a,b){return new Int32Array(S,a,b)};va.getFloatBufferView=function(a,b){return new Float32Array(S,a,b)};var kc;
function gc(a){return new Promise(function(b){setTimeout(b,a)})}Ca.sleep=new WebAssembly.Suspending(gc);function jc(a){ec?(ic=a,hc.port1.postMessage(0)):setTimeout(a,0)}function fc(){return new Promise(jc)}Ca.immediateContinue=new WebAssembly.Suspending(fc);Ca.immediateContinueSupported=function(){return ec};Ca.setCrashReportString=function(a,b){Sa[a]=b};va.getByteBufferView=function(a,b){return new Int8Array(S,a,b)};va.getUnsignedByteBufferView=function(a,b){return new Uint8Array(S,a,b)};va.getUnsignedClampedByteBufferView=function(a,b){return new Uint8ClampedArray(S,a,b)};va.getShortBufferView=function(a,b){return new Int16Array(S,a,b)};va.getUnsignedShortBufferView=function(a,b){return new Uint16Array(S,a,b)};va.getIntBufferView=function(a,b){return new Int32Array(S,a,b)};va.getFloatBufferView=function(a,b){return new Float32Array(S,a,b)};const kc={172351395:{name:"EBML",type:"Container"},646:{name:"EBMLVersion",type:"Uint"},759:{name:"EBMLReadVersion",type:"Uint"},754:{name:"EBMLMaxIDLength",type:"Uint"},755:{name:"EBMLMaxSizeLength",type:"Uint"},642:{name:"DocType",type:"String"},647:{name:"DocTypeVersion",type:"Uint"},645:{name:"DocTypeReadVersion",type:"Uint"},108:{name:"Void",type:"Binary"},63:{name:"CRC-32",type:"Binary"},190023271:{name:"SignatureSlot",type:"Container"},16010:{name:"SignatureAlgo",type:"Uint"},16026:{name:"SignatureHash",
type:"Uint"},16037:{name:"SignaturePublicKey",type:"Binary"},16053:{name:"Signature",type:"Binary"},15963:{name:"SignatureElements",type:"Container"},15995:{name:"SignatureElementList",type:"Container"},9522:{name:"SignedElement",type:"Binary"},139690087:{name:"Segment",type:"Container"},21863284:{name:"SeekHead",type:"Container"},3515:{name:"Seek",type:"Container"},5035:{name:"SeekID",type:"Binary"},5036:{name:"SeekPosition",type:"Uint"},88713574:{name:"Info",type:"Container"},13220:{name:"SegmentUID",
type:"Binary"},13188:{name:"SegmentFilename",type:"String"},1882403:{name:"PrevUID",type:"Binary"},1868715:{name:"PrevFilename",type:"String"},2013475:{name:"NextUID",type:"Binary"},1999803:{name:"NextFilename",type:"String"},1092:{name:"SegmentFamily",type:"Binary"},10532:{name:"ChapterTranslate",type:"Container"},10748:{name:"ChapterTranslateEditionUID",type:"Uint"},10687:{name:"ChapterTranslateCodec",type:"Uint"},10661:{name:"ChapterTranslateID",type:"Binary"},710577:{name:"TimecodeScale",type:"Uint"},
1161:{name:"Duration",type:"Float"},1121:{name:"DateUTC",type:"Date"},15273:{name:"Title",type:"String"},3456:{name:"MuxingApp",type:"String"},5953:{name:"WritingApp",type:"String"},103:{name:"Timecode",type:"Uint"},6228:{name:"SilentTracks",type:"Container"},6359:{name:"SilentTrackNumber",type:"Uint"},39:{name:"Position",type:"Uint"},43:{name:"PrevSize",type:"Uint"},35:{name:"SimpleBlock",type:"Binary"},32:{name:"BlockGroup",type:"Container"},33:{name:"Block",type:"Binary"},34:{name:"BlockVirtual",
type:"Binary"},13729:{name:"BlockAdditions",type:"Container"},38:{name:"BlockMore",type:"Container"},110:{name:"BlockAddID",type:"Uint"},37:{name:"BlockAdditional",type:"Binary"},27:{name:"BlockDuration",type:"Uint"},122:{name:"ReferencePriority",type:"Uint"},123:{name:"ReferenceBlock",type:"Int"},125:{name:"ReferenceVirtual",type:"Int"},36:{name:"CodecState",type:"Binary"},13730:{name:"DiscardPadding",type:"Int"},14:{name:"Slices",type:"Container"},104:{name:"TimeSlice",type:"Container"},76:{name:"LaceNumber",
type:"Uint"},77:{name:"FrameNumber",type:"Uint"},75:{name:"BlockAdditionID",type:"Uint"},78:{name:"Delay",type:"Uint"},79:{name:"SliceDuration",type:"Uint"},72:{name:"ReferenceFrame",type:"Container"},73:{name:"ReferenceOffset",type:"Uint"},74:{name:"ReferenceTimeCode",type:"Uint"},47:{name:"EncryptedBlock",type:"Binary"},106212971:{name:"Tracks",type:"Container"},46:{name:"TrackEntry",type:"Container"},87:{name:"TrackNumber",type:"Uint"},13253:{name:"TrackUID",type:"Uint"},3:{name:"TrackType",type:"Uint"},
57:{name:"FlagEnabled",type:"Uint"},8:{name:"FlagDefault",type:"Uint"},5546:{name:"FlagForced",type:"Uint"},28:{name:"FlagLacing",type:"Uint"},11751:{name:"MinCache",type:"Uint"},11768:{name:"MaxCache",type:"Uint"},254851:{name:"DefaultDuration",type:"Uint"},216698:{name:"DefaultDecodedFieldDuration",type:"Uint"},209231:{name:"TrackTimecodeScale",type:"Float"},4991:{name:"TrackOffset",type:"Int"},5614:{name:"MaxBlockAdditionID",type:"Uint"},4974:{name:"Name",type:"String"},177564:{name:"Language",
type:"String"},6:{name:"CodecID",type:"String"},9122:{name:"CodecPrivate",type:"Binary"},362120:{name:"CodecName",type:"String"},13382:{name:"AttachmentLink",type:"Uint"},1742487:{name:"CodecSettings",type:"String"},1785920:{name:"CodecInfoURL",type:"String"},438848:{name:"CodecDownloadURL",type:"String"},42:{name:"CodecDecodeAll",type:"Uint"},12203:{name:"TrackOverlay",type:"Uint"},5802:{name:"CodecDelay",type:"Uint"},5819:{name:"SeekPreRoll",type:"Uint"},9764:{name:"TrackTranslate",type:"Container"},
9980:{name:"TrackTranslateEditionUID",type:"Uint"},9919:{name:"TrackTranslateCodec",type:"Uint"},9893:{name:"TrackTranslateTrackID",type:"Binary"},96:{name:"Video",type:"Container"},26:{name:"FlagInterlaced",type:"Uint"},5048:{name:"StereoMode",type:"Uint"},5056:{name:"AlphaMode",type:"Uint"},5049:{name:"OldStereoMode",type:"Uint"},48:{name:"PixelWidth",type:"Uint"},58:{name:"PixelHeight",type:"Uint"},5290:{name:"PixelCropBottom",type:"Uint"},5307:{name:"PixelCropTop",type:"Uint"},5324:{name:"PixelCropLeft",
type:"Uint"},5341:{name:"PixelCropRight",type:"Uint"},5296:{name:"DisplayWidth",type:"Uint"},5306:{name:"DisplayHeight",type:"Uint"},5298:{name:"DisplayUnit",type:"Uint"},5299:{name:"AspectRatioType",type:"Uint"},963876:{name:"ColourSpace",type:"Binary"},1029411:{name:"GammaValue",type:"Float"},230371:{name:"FrameRate",type:"Float"},97:{name:"Audio",type:"Container"},53:{name:"SamplingFrequency",type:"Float"},14517:{name:"OutputSamplingFrequency",type:"Float"},31:{name:"Channels",type:"Uint"},15739:{name:"ChannelPositions",
type:"Binary"},8804:{name:"BitDepth",type:"Uint"},98:{name:"TrackOperation",type:"Container"},99:{name:"TrackCombinePlanes",type:"Container"},100:{name:"TrackPlane",type:"Container"},101:{name:"TrackPlaneUID",type:"Uint"},102:{name:"TrackPlaneType",type:"Uint"},105:{name:"TrackJoinBlocks",type:"Container"},109:{name:"TrackJoinUID",type:"Uint"},64:{name:"TrickTrackUID",type:"Uint"},65:{name:"TrickTrackSegmentUID",type:"Binary"},70:{name:"TrickTrackFlag",type:"Uint"},71:{name:"TrickMasterTrackUID",
type:"Uint"},68:{name:"TrickMasterTrackSegmentUID",type:"Binary"},11648:{name:"ContentEncodings",type:"Container"},8768:{name:"ContentEncoding",type:"Container"},4145:{name:"ContentEncodingOrder",type:"Uint"},4146:{name:"ContentEncodingScope",type:"Uint"},4147:{name:"ContentEncodingType",type:"Uint"},4148:{name:"ContentCompression",type:"Container"},596:{name:"ContentCompAlgo",type:"Uint"},597:{name:"ContentCompSettings",type:"Binary"},4149:{name:"ContentEncryption",type:"Container"},2017:{name:"ContentEncAlgo",
type:"Uint"},2018:{name:"ContentEncKeyID",type:"Binary"},2019:{name:"ContentSignature",type:"Binary"},2020:{name:"ContentSigKeyID",type:"Binary"},2021:{name:"ContentSigAlgo",type:"Uint"},2022:{name:"ContentSigHashAlgo",type:"Uint"},206814059:{name:"Cues",type:"Container"},59:{name:"CuePoint",type:"Container"},51:{name:"CueTime",type:"Uint"},55:{name:"CueTrackPositions",type:"Container"},119:{name:"CueTrack",type:"Uint"},113:{name:"CueClusterPosition",type:"Uint"},112:{name:"CueRelativePosition",type:"Uint"},
50:{name:"CueDuration",type:"Uint"},4984:{name:"CueBlockNumber",type:"Uint"},106:{name:"CueCodecState",type:"Uint"},91:{name:"CueReference",type:"Container"},22:{name:"CueRefTime",type:"Uint"},23:{name:"CueRefCluster",type:"Uint"},4959:{name:"CueRefNumber",type:"Uint"},107:{name:"CueRefCodecState",type:"Uint"},155296873:{name:"Attachments",type:"Container"},8615:{name:"AttachedFile",type:"Container"},1662:{name:"FileDescription",type:"String"},1646:{name:"FileName",type:"String"},1632:{name:"FileMimeType",
type:"String"},1628:{name:"FileData",type:"Binary"},1710:{name:"FileUID",type:"Uint"},1653:{name:"FileReferral",type:"Binary"},1633:{name:"FileUsedStartTime",type:"Uint"},1634:{name:"FileUsedEndTime",type:"Uint"},4433776:{name:"Chapters",type:"Container"},1465:{name:"EditionEntry",type:"Container"},1468:{name:"EditionUID",type:"Uint"},1469:{name:"EditionFlagHidden",type:"Uint"},1499:{name:"EditionFlagDefault",type:"Uint"},1501:{name:"EditionFlagOrdered",type:"Uint"},54:{name:"ChapterAtom",type:"Container"},
13252:{name:"ChapterUID",type:"Uint"},5716:{name:"ChapterStringUID",type:"String"},17:{name:"ChapterTimeStart",type:"Uint"},18:{name:"ChapterTimeEnd",type:"Uint"},24:{name:"ChapterFlagHidden",type:"Uint"},1432:{name:"ChapterFlagEnabled",type:"Uint"},11879:{name:"ChapterSegmentUID",type:"Binary"},11964:{name:"ChapterSegmentEditionUID",type:"Uint"},9155:{name:"ChapterPhysicalEquiv",type:"Uint"},15:{name:"ChapterTrack",type:"Container"},9:{name:"ChapterTrackNumber",type:"Uint"},0:{name:"ChapterDisplay",
type:"Container"},5:{name:"ChapString",type:"String"},892:{name:"ChapLanguage",type:"String"},894:{name:"ChapCountry",type:"String"},10564:{name:"ChapProcess",type:"Container"},10581:{name:"ChapProcessCodecID",type:"Uint"},1293:{name:"ChapProcessPrivate",type:"Binary"},10513:{name:"ChapProcessCommand",type:"Container"},10530:{name:"ChapProcessTime",type:"Uint"},10547:{name:"ChapProcessData",type:"Binary"},39109479:{name:"Tags",type:"Container"},13171:{name:"Tag",type:"Container"},9152:{name:"Targets",
type:"Container"},10442:{name:"TargetTypeValue",type:"Uint"},9162:{name:"TargetType",type:"String"},9157:{name:"TagTrackUID",type:"Uint"},9161:{name:"TagEditionUID",type:"Uint"},9156:{name:"TagChapterUID",type:"Uint"},9158:{name:"TagAttachmentUID",type:"Uint"},10184:{name:"SimpleTag",type:"Container"},1443:{name:"TagName",type:"String"},1146:{name:"TagLanguage",type:"String"},1156:{name:"TagDefault",type:"Uint"},1159:{name:"TagString",type:"String"},1157:{name:"TagBinary",type:"Binary"}};
function lc(a,b){a.prototype=Object.create(b.prototype);a.prototype.constructor=a}function mc(a,b){this.name=a||"Unknown";this.type=b||"Unknown"}mc.prototype.g=function(){};function nc(a,b){mc.call(this,a,b||"Uint")}lc(nc,mc);nc.prototype.g=function(){this.data="";for(var a=0;a<this.source.length;a++){var b=this.source[a].toString(16);this.data+=1===b.length%2?"0"+b:b}};function oc(a,b){mc.call(this,a,b||"Float")}lc(oc,mc);
oc.prototype.g=function(){var a=this.source.reverse();this.data=(new (this.source&&4===this.source.length?Float32Array:Float64Array)(a.buffer))[0]};function pc(a,b){mc.call(this,a,b||"Container")}lc(pc,mc);function qc(a){var b=a.source[a.offset++],f=8-b.toString(2).length;b-=1<<7-f;for(var g=0;g<f;g++)b*=256,b+=a.source[a.offset++];return b}
pc.prototype.g=function(){this.data=[];for(this.offset=0;this.offset<this.source.length;this.offset=b){var a=qc(this);var b=qc(this);b=Math.min(this.offset+b,this.source.length);var f=this.source.slice(this.offset,b),g=kc[a]||{name:"Unknown",type:"Unknown"},r=mc;switch(g.type){case "Container":r=pc;break;case "Uint":r=nc;break;case "Float":r=oc}r=g=new r(g.name,g.type);r.source=f;r.g();this.data.push({id:a,K:a.toString(16),data:g})}};
lc(function(a){pc.call(this,"File","File");this.source=a;this.g()},pc);var rc;
(function(){function a(p){let d=O.get(p);"undefined"===typeof d&&(d=new Function("return "+p+";"),O.set(p,d));return d()}function b(p){let d={exports:null,h:null,j:null};f(p);g(p);r(p,d);u(p,d);p.teavmMath=Math;return{u(q){d.exports=q},F(q){d.h=q},D(q){d.j=q}}}function f(p){p.teavmDate={currentTimeMillis:()=>(new Date).getTime(),dateToString:d=>(new Date(d)).toString(),getYear:d=>(new Date(d)).getFullYear(),setYear:(d,q)=>{d=new Date(d);d.setFullYear(q);return d.getTime()},getMonth:d=>(new Date(d)).getMonth(),setMonth:(d,
q)=>{d=new Date(d);d.setMonth(q);return d.getTime()},getDate:d=>(new Date(d)).getDate(),setDate:(d,q)=>{d=new Date(d);d.setDate(q);return d.getTime()},create:(d,q,v,n,w,l)=>(new Date(d,q,v,n,w,l)).getTime(),createFromUTC:(d,q,v,n,w,l)=>Date.UTC(d,q,v,n,w,l)}}function g(p){let d=[],q=[];p.teavmConsole={putcharStderr:function(v){10===v?(v=String.fromCharCode(...d),console.error(v),ka&&ka(v,!0),d.length=0):d.push(v)},putcharStdout:function(v){10===v?(v=String.fromCharCode(...q),console.log(v),ka&&ka(v,
!1),q.length=0):q.push(v)}}}function r(p,d){let q=new FinalizationRegistry(n=>{let w=d.exports["teavm.reportGarbageCollectedValue"];"undefined"!==typeof w&&d.j(function(){w(n.B,n.C)})}),v=new FinalizationRegistry(n=>{let w=d.exports["teavm.reportGarbageCollectedString"];"function"===typeof w&&d.j(function(){w(n)})});p.teavm={createWeakRef:(n,w,l)=>{null!==l&&q.register(n,{C:w,B:l});return new WeakRef(n)},deref:n=>n.deref(),createStringWeakRef:(n,w)=>{v.register(n,w);return new WeakRef(n)},stringDeref:n=>
n.deref(),takeStackTrace:()=>{var n=Error().stack;let w=[];for(let l of n.split("\n"))n=B.exec(l),null!==n&&2<=n.length&&w.push(parseInt(n[1],16));return{getStack:function(){let l;if(d.h)try{l=d.h(w)}catch(z){console.warn("Could not deobfuscate stack",z)}l||=w.map(z=>({className:"java.lang.Throwable$FakeClass",method:"fakeMethod",file:"Throwable.java",line:z}));return l}}},decorateException:n=>{new ha(d,n)}}}function u(p,d){function q(h){return h}function v(h){var m=h.charAt(0);var x=""+(n(m)?m:"_");
for(m=1;m<h.length;++m){let P=h.charAt(m);var E=P;E=n(E)||"0"<=E&&"9">=E;x+=E?P:"_"}return x}function n(h){return"A"<=h&&"Z">=h||"a"<=h&&"z">=h||"_"===h||"$"===h}function w(h,m,x){null===h?(new Function("value",m+" = value;"))(x):h[m]=x}function l(h){d.exports["teavm.js.throwException"](X in h?h[X]:d.exports["teavm.js.wrapException"](h))}function z(h){a:{if(h instanceof WebAssembly.Exception){var m=d.exports["teavm.javaException"];var x=d.exports["teavm.getJsException"];if(h.is(m)){h=h.getArg(m,0);
m=d.exports["teavm.js.extractException"](h);if(null!==m){x=m;break a}x=x(h);"undefined"===typeof x&&(x=new ha(d,h));break a}}x=h}throw x;}function C(h){var m=[];for(let x=0;x<h.length;++x)m.push("p"+x);m=0===m.length?"":m.join(", ");m=(new Function("rethrowJavaAsJs","fn",`return function(${m}) {\n`+" try {\n"+` return fn(${m});\n`+" } catch (e) {\n rethrowJavaAsJs(e);\n }\n};"))(z,h);m.__impl=h;m.__rethrow=z;return m}function T(h,m){return(new Function("constructor",`return function ${h}(marker, javaObject) {\n`+
" return constructor.call(this, marker, javaObject);\n}\n"))(m)}function L(h){try{return h()}catch(m){l(m)}}let aa=Symbol("javaObject"),ia=Symbol("functions"),Ma=Symbol("functionOrigin"),za=Symbol("wrapperCallMarker"),Na=new WeakMap,ta=new WeakMap,pa=new Map,Aa=new FinalizationRegistry(h=>pa.delete(h)),Fa=new WeakMap,ma=2463534242;p.teavmJso={emptyString:()=>"",stringFromCharCode:h=>String.fromCharCode(h),concatStrings:(h,m)=>h+m,stringLength:h=>h.length,charAt:(h,m)=>h.charCodeAt(m),emptyArray:()=>
[],appendToArray:(h,m)=>h.push(m),unwrapBoolean:h=>h?1:0,wrapBoolean:h=>!!h,getProperty:function(h,m){try{return null!==h?h[m]:a(m)}catch(x){l(x)}},setProperty:w,setPropertyPure:w,global:h=>{try{return a(h)}catch(m){l(m)}},createClass:(h,m,x)=>{h=v(h||"JavaObject");let E;E=null===m?function(W){this[aa]=W;this[ia]=null}:function(W){m.call(this,W)};let P=T(h,function(W,na){if(W===za)E.call(this,na);else{if(null===x)throw Error("This class can't be instantiated directly");try{return x.apply(null,arguments)}catch(Ga){z(Ga)}}});
P.prototype=Object.create(m||Object.prototype);P.prototype.constructor=P;h=T(h,function(W){return P.call(this,za,W)});h[za]=P;h.prototype=P.prototype;return h},exportClass:h=>h[za],defineMethod:(h,m,x)=>{let E=[];for(let P=1;P<x.length;++P)E.push("p"+P);h.prototype[m]=(new Function("rethrowJavaAsJs","fn",`return function(${0===E.length?"":E.join(", ")}) {\n`+" try {\n"+` return fn(${["this",E].join(", ")});\n`+" } catch (e) {\n rethrowJavaAsJs(e);\n }\n};"))(z,x)},defineStaticMethod:(h,
m,x)=>{h[m]=C(x)},defineFunction:C,defineProperty:(h,m,x,E)=>{let P={get(){try{return x(this)}catch(W){z(W)}}};null!==E&&(P.set=function(W){try{E(this,W)}catch(na){z(na)}});Object.defineProperty(h.prototype,m,P)},defineStaticProperty:(h,m,x,E)=>{let P={get(){try{return x()}catch(W){z(W)}}};null!==E&&(P.set=function(W){try{E(W)}catch(na){z(na)}});Object.defineProperty(h,m,P)},javaObjectToJS:(h,m)=>{if(null===h)return null;var x=Na.get(h);if("undefined"!=typeof x&&(x=x.deref(),"undefined"!==typeof x))return x;
m=new m(h);Na.set(h,new WeakRef(m));return m},unwrapJavaObject:h=>h[aa],asFunction:(h,m)=>{let x=h[ia];null===x&&(x=Object.create(null),h[ia]=x);let E=x[m];"function"!==typeof E&&(E=function(){return h[m].apply(h,arguments)},E[Ma]=h,x[m]=E);return E},functionAsObject:(h,m)=>{let x=h[Ma];if("undefined"!==typeof x){let E=x[ia];if(void 0!==E&&E[m]===h)return x}return{[m]:function(...E){try{return h(...E)}catch(P){z(P)}}}},wrapObject:h=>{if(null===h)return null;if("object"===typeof h||"function"===typeof h){var m=
h[aa];if("object"===typeof m)return m;m=ta.get(h);if(void 0!==m&&(m=m.deref(),void 0!==m))return m;m=d.exports["teavm.jso.createWrapper"](h);ta.set(h,new WeakRef(m));return m}m=pa.get(h);if(void 0!==m&&(m=m.deref(),void 0!==m))return m;m=d.exports["teavm.jso.createWrapper"](h);pa.set(h,new WeakRef(m));Aa.register(m,h);return m},isPrimitive:(h,m)=>typeof h===m,instanceOf:(h,m)=>h instanceof m,instanceOfOrNull:(h,m)=>null===h||h instanceof m,sameRef:(h,m)=>h===m,hashCode:h=>{if("object"===typeof h||
"function"===typeof h||"symbol"===typeof h){var m=Fa.get(h);if("number"===typeof m)return m;m=ma;m^=m<<13;m^=m>>>17;ma=m^=m<<5;Fa.set(h,m);return m}return"number"===typeof h?h|0:"bigint"===typeof h?BigInt.asIntN(32,h):"boolean"===typeof h?h?1:0:0},apply:(h,m,x)=>{try{return null===h?a(m)(...x):h[m](...x)}catch(E){l(E)}},concatArray:(h,m)=>h.concat(m),getJavaException:h=>h[X]};for(var ca of"wrapByte wrapShort wrapChar wrapInt wrapFloat wrapDouble unwrapByte unwrapShort unwrapChar unwrapInt unwrapFloat unwrapDouble".split(" "))p.teavmJso[ca]=
" return constructor.call(this, marker, javaObject);\n}\n"))(m)}function L(h){try{return h()}catch(m){l(m)}}let aa=Symbol("javaObject"),ia=Symbol("functions"),Na=Symbol("functionOrigin"),Aa=Symbol("wrapperCallMarker"),Oa=new WeakMap,ta=new WeakMap,pa=new Map,Ba=new FinalizationRegistry(h=>pa.delete(h)),Ga=new WeakMap,ma=2463534242;p.teavmJso={emptyString:()=>"",stringFromCharCode:h=>String.fromCharCode(h),concatStrings:(h,m)=>h+m,stringLength:h=>h.length,charAt:(h,m)=>h.charCodeAt(m),emptyArray:()=>
[],appendToArray:(h,m)=>h.push(m),unwrapBoolean:h=>h?1:0,wrapBoolean:h=>!!h,getProperty:function(h,m){try{return null!==h?h[m]:a(m)}catch(x){l(x)}},setProperty:w,setPropertyPure:w,global:h=>{try{return a(h)}catch(m){l(m)}},createClass:(h,m,x)=>{h=v(h||"JavaObject");let E;E=null===m?function(W){this[aa]=W;this[ia]=null}:function(W){m.call(this,W)};let P=T(h,function(W,na){if(W===Aa)E.call(this,na);else{if(null===x)throw Error("This class can't be instantiated directly");try{return x.apply(null,arguments)}catch(Ha){z(Ha)}}});
P.prototype=Object.create(m||Object.prototype);P.prototype.constructor=P;h=T(h,function(W){return P.call(this,Aa,W)});h[Aa]=P;h.prototype=P.prototype;return h},exportClass:h=>h[Aa],defineMethod:(h,m,x)=>{let E=[];for(let P=1;P<x.length;++P)E.push("p"+P);h.prototype[m]=(new Function("rethrowJavaAsJs","fn",`return function(${0===E.length?"":E.join(", ")}) {\n`+" try {\n"+` return fn(${["this",E].join(", ")});\n`+" } catch (e) {\n rethrowJavaAsJs(e);\n }\n};"))(z,x)},defineStaticMethod:(h,
m,x)=>{h[m]=C(x)},defineFunction:C,defineProperty:(h,m,x,E)=>{let P={get(){try{return x(this)}catch(W){z(W)}}};null!==E&&(P.set=function(W){try{E(this,W)}catch(na){z(na)}});Object.defineProperty(h.prototype,m,P)},defineStaticProperty:(h,m,x,E)=>{let P={get(){try{return x()}catch(W){z(W)}}};null!==E&&(P.set=function(W){try{E(W)}catch(na){z(na)}});Object.defineProperty(h,m,P)},javaObjectToJS:(h,m)=>{if(null===h)return null;var x=Oa.get(h);if("undefined"!=typeof x&&(x=x.deref(),"undefined"!==typeof x))return x;
m=new m(h);Oa.set(h,new WeakRef(m));return m},unwrapJavaObject:h=>h[aa],asFunction:(h,m)=>{let x=h[ia];null===x&&(x=Object.create(null),h[ia]=x);let E=x[m];"function"!==typeof E&&(E=function(){return h[m].apply(h,arguments)},E[Na]=h,x[m]=E);return E},functionAsObject:(h,m)=>{let x=h[Na];if("undefined"!==typeof x){let E=x[ia];if(void 0!==E&&E[m]===h)return x}return{[m]:function(...E){try{return h(...E)}catch(P){z(P)}}}},wrapObject:h=>{if(null===h)return null;if("object"===typeof h||"function"===typeof h){var m=
h[aa];if("object"===typeof m)return m;m=ta.get(h);if(void 0!==m&&(m=m.deref(),void 0!==m))return m;m=d.exports["teavm.jso.createWrapper"](h);ta.set(h,new WeakRef(m));return m}m=pa.get(h);if(void 0!==m&&(m=m.deref(),void 0!==m))return m;m=d.exports["teavm.jso.createWrapper"](h);pa.set(h,new WeakRef(m));Ba.register(m,h);return m},isPrimitive:(h,m)=>typeof h===m,instanceOf:(h,m)=>h instanceof m,instanceOfOrNull:(h,m)=>null===h||h instanceof m,sameRef:(h,m)=>h===m,hashCode:h=>{if("object"===typeof h||
"function"===typeof h||"symbol"===typeof h){var m=Ga.get(h);if("number"===typeof m)return m;m=ma;m^=m<<13;m^=m>>>17;ma=m^=m<<5;Ga.set(h,m);return m}return"number"===typeof h?h|0:"bigint"===typeof h?BigInt.asIntN(32,h):"boolean"===typeof h?h?1:0:0},apply:(h,m,x)=>{try{return null===h?a(m)(...x):h[m](...x)}catch(E){l(E)}},concatArray:(h,m)=>h.concat(m),getJavaException:h=>h[X]};for(var ca of"wrapByte wrapShort wrapChar wrapInt wrapFloat wrapDouble unwrapByte unwrapShort unwrapChar unwrapInt unwrapFloat unwrapDouble".split(" "))p.teavmJso[ca]=
q;ca=[];for(let h=0;32>h;++h){let m=0===ca.length?"":ca.join(", "),x=[...ca,"body"].join(", ");p.teavmJso["createFunction"+h]=(new Function("wrapCallFromJavaToJs",...ca,"body",`return new Function('wrapCallFromJavaToJs', ${x}).bind(this, wrapCallFromJavaToJs);`)).bind(null,L);p.teavmJso["bindFunction"+h]=(E,...P)=>E.bind(null,...P);p.teavmJso["callFunction"+h]=(new Function("rethrowJsAsJava","fn",...ca,"try {\n"+` return fn(${m});\n`+"} catch (e) {\n rethrowJsAsJava(e);\n}")).bind(null,l);p.teavmJso["callMethod"+
h]=(new Function("rethrowJsAsJava","getGlobalName","instance","method",...ca,"try {\n return instance !== null\n"+` ? instance[method](${m})\n`+` : getGlobalName(method)(${m});\n`+"} catch (e) {\n rethrowJsAsJava(e);\n}")).bind(null,l,a);p.teavmJso["construct"+h]=(new Function("rethrowJsAsJava","constructor",...ca,"try {\n"+` return new constructor(${m});\n`+"} catch (e) {\n rethrowJsAsJava(e);\n}")).bind(null,l);p.teavmJso["arrayOf"+h]=new Function(...ca,"return ["+m+"]");
ca.push("p"+(h+1))}}async function D(p){try{const d={},q=b(d),v=p.path instanceof WebAssembly.Module?p.path:await WebAssembly.compileStreaming(fetch(p.path)),n=new WebAssembly.Instance(v,d);q.u(n.exports);return{module:v,instance:n}}catch(d){return console.warn("Could not load deobfuscator",d),null}}function J(p,d,q){let v=null,n=!1;return w=>{if(!n){n=!0;if(null!==d)try{v=q.exports.createFromExternalFile.value(d)}catch(l){console.warn("Could not load create deobfuscator",l)}if(null==v&&null!==p)try{v=
q.exports.createForModule.value(p)}catch(l){console.warn("Could not create deobfuscator from module data",l)}}return null!==v?v.deobfuscate(w):[]}}async function G(p,d){if(!d.enabled||"auto"!==p&&"external"!==p)return null;if(d.l instanceof ArrayBuffer)return new Int8Array(d.l);p=await fetch(d.l);return p.ok?new Int8Array(await p.arrayBuffer()):null}function N(p){const d=new ua;p.teavm.pollAsyncCallbacks=function(){for(var q;q=d.s();)q.fn()};return function(q){d.push({fn:q,_next:null})}}let O=new Map,
B=/.+:wasm-function\[[0-9]+]:0x([0-9a-f]+).*/,X=Symbol("javaException");class ha extends Error{constructor(p,d){super();this.g=p;this[X]=d;p.exports["teavm.setJsException"](d,this)}get message(){var p=this.g.exports["teavm.exceptionMessage"];return"function"===typeof p&&(p=p(this[X]),null!=p)?p:"(could not fetch message)"}}kc={load:async function(p,d){d||={};var q=d.h||{};let [v,n,w]=await Promise.all([q.enabled?D(q):Promise.resolve(null),p instanceof WebAssembly.Module?Promise.resolve(p):WebAssembly.compileStreaming(fetch(p)),
G(q.v,q)]);q={};p=b(q);"undefined"!==typeof d.o&&d.o(q);p.D(N(q));d=await WebAssembly.instantiate(n,q);q={};p.u(d.exports);if(v){let l=J(null,w,v.instance);null!==l&&(p.F(l),q.deobfuscator=l)}p={exports:q,instance:d,K:{G:n,J:v?v.module:null}};for(let l in d.exports){let z=d.exports[l];z instanceof WebAssembly.Global?Object.defineProperty(q,l,{get:()=>z.value}):"function"===typeof z&&(q[l]=z)}q.memory=d.exports["teavm.memory"];q.H=w;return p},I:b,L:function(p){return new Proxy(p,{get(d,q){return new WebAssembly.Global({value:"externref",
mutable:!1},d[q])}})}}})();async function lc(){try{Error.stackTraceLimit=1024;I=self.__eaglercraftXLoaderContext.getEaglercraftXOpts();self.__eaglercraftXLoaderContext.getEagRuntimeJSURL();const a=self.__eaglercraftXLoaderContext.getClassesWASMURL(),b=self.__eaglercraftXLoaderContext.getClassesDeobfWASMURL(),f=self.__eaglercraftXLoaderContext.getClassesTEADBGURL();Ea=self.__eaglercraftXLoaderContext.getEPKFiles();Ka=self.__eaglercraftXLoaderContext.getRootElement();self.__eaglercraftXLoaderContext.getImageURL(0);Ha=self.__eaglercraftXLoaderContext.getImageURL(1);
Ia=self.__eaglercraftXLoaderContext.getImageURL(2);Ja=self.__eaglercraftXLoaderContext.getImageURL(3);const g=self.__eaglercraftXLoaderContext.getMainArgs();delete self.__eaglercraftXLoaderContext;if("_worker_process_"!==g[0]){if(!await wb())return}else ea="worker",await Fb();c("Loading EaglercraftX WASM GC binary...");const r=await kc.load(a,{h:{enabled:!0,path:b,v:"external",l:f},o:function(u){u.WASMGCBufferAllocator=va;u.platformApplication=A;u.platformAssets=wa;u.platformAudio=xa;u.platformFilesystem=
ya;u.platformInput=F;u.platformNetworking=Ba;u.platformOpenGL=H;u.platformRuntime=Ca;u.teavm.notifyHeapResized=function(){Gb(r.exports.memory)}}});Gb(r.exports.memory);Da=r.exports.deobfuscator;c("Calling entry point with args: {}",JSON.stringify(g));try{await WebAssembly.promising(r.exports.main.__impl)(g)}catch(u){r.exports.main.__rethrow(u)}finally{la(2,"Main function has returned!",[])}}catch(a){Jb(a)}}
"object"===typeof self.__eaglercraftXLoaderContext?self.__eaglercraftXLoaderContext.runMain(lc):console.error("???");}).call(this);
B=/.+:wasm-function\[[0-9]+]:0x([0-9a-f]+).*/,X=Symbol("javaException");class ha extends Error{constructor(p,d){super();this.g=p;this[X]=d;p.exports["teavm.setJsException"](d,this)}get message(){var p=this.g.exports["teavm.exceptionMessage"];return"function"===typeof p&&(p=p(this[X]),null!=p)?p:"(could not fetch message)"}}rc={load:async function(p,d){d||={};var q=d.h||{};let [v,n,w]=await Promise.all([q.enabled?D(q):Promise.resolve(null),p instanceof WebAssembly.Module?Promise.resolve(p):WebAssembly.compileStreaming(fetch(p)),
G(q.v,q)]);q={};p=b(q);"undefined"!==typeof d.o&&d.o(q);p.D(N(q));d=await WebAssembly.instantiate(n,q);q={};p.u(d.exports);if(v){let l=J(null,w,v.instance);null!==l&&(p.F(l),q.deobfuscator=l)}p={exports:q,instance:d,L:{G:n,J:v?v.module:null}};for(let l in d.exports){let z=d.exports[l];z instanceof WebAssembly.Global?Object.defineProperty(q,l,{get:()=>z.value}):"function"===typeof z&&(q[l]=z)}q.memory=d.exports["teavm.memory"];q.H=w;return p},I:b,M:function(p){return new Proxy(p,{get(d,q){return new WebAssembly.Global({value:"externref",
mutable:!1},d[q])}})}}})();async function sc(){try{Error.stackTraceLimit=1024;I=self.__eaglercraftXLoaderContext.getEaglercraftXOpts();self.__eaglercraftXLoaderContext.getEagRuntimeJSURL();const a=self.__eaglercraftXLoaderContext.getClassesWASMURL(),b=self.__eaglercraftXLoaderContext.getClassesDeobfWASMURL(),f=self.__eaglercraftXLoaderContext.getClassesTEADBGURL();Ea=self.__eaglercraftXLoaderContext.getEPKFiles();Ka=self.__eaglercraftXLoaderContext.getRootElement();self.__eaglercraftXLoaderContext.getImageURL(0);Fa=self.__eaglercraftXLoaderContext.getImageURL(1);
Ia=self.__eaglercraftXLoaderContext.getImageURL(2);Ja=self.__eaglercraftXLoaderContext.getImageURL(3);const g=self.__eaglercraftXLoaderContext.getMainArgs();delete self.__eaglercraftXLoaderContext;if("_worker_process_"!==g[0]){if(!await wb())return}else ea="worker",await Fb();c("Loading EaglercraftX WASM GC binary...");const r=await rc.load(a,{h:{enabled:!0,path:b,v:"external",l:f},o:function(u){u.WASMGCBufferAllocator=va;u.platformApplication=A;u.platformAssets=wa;u.platformAudio=xa;u.platformFilesystem=
ya;u.platformInput=F;u.platformNetworking=za;u.platformOpenGL=H;u.platformRuntime=Ca;u.teavm.notifyHeapResized=function(){Gb(r.exports.memory)}}});Gb(r.exports.memory);Da=r.exports.deobfuscator;c("Calling entry point with args: {}",JSON.stringify(g));try{await WebAssembly.promising(r.exports.main.__impl)(g)}catch(u){r.exports.main.__rethrow(u)}finally{la(2,"Main function has returned!",[])}}catch(a){Jb(a)}}
"object"===typeof self.__eaglercraftXLoaderContext?self.__eaglercraftXLoaderContext.runMain(sc):console.error("???");}).call(this);

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -0,0 +1,13 @@
(function(){'use strict';function g(a){console.log("LoaderBootstrap: [INFO] "+a)}function n(a){console.log("LoaderBootstrap: [WARN] "+a)}function q(a){console.error("LoaderBootstrap: [ERROR] "+a)}var r=null;
function u(){const a=[];for(var c=0;64>c;++c)a["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charCodeAt(c)]=c;a[45]=62;a[95]=63;return function(b,d){var e=b.length-d;if(0<e%4)throw Error("Invalid string. Length must be a multiple of 4");var f=b.indexOf("=",d);f=-1===f?e:f-d;e=[f,f===e?0:4-f%4];var l=e[0];e=e[1];f=new Uint8Array(3*(l+e)/4-e);var h=0;l=(0<e?l-4:l)+d;var k;for(k=d;k<l;k+=4)d=a[b.charCodeAt(k)]<<18|a[b.charCodeAt(k+1)]<<12|a[b.charCodeAt(k+2)]<<6|a[b.charCodeAt(k+
3)],f[h++]=d>>16&255,f[h++]=d>>8&255,f[h++]=d&255;2===e?(d=a[b.charCodeAt(k)]<<2|a[b.charCodeAt(k+1)]>>4,f[h++]=d&255):1===e&&(d=a[b.charCodeAt(k)]<<10|a[b.charCodeAt(k+1)]<<4|a[b.charCodeAt(k+2)]>>2,f[h++]=d>>8&255,f[h++]=d&255);return f.buffer}}function v(){return new Promise(function(a){setTimeout(a,20)})}
function w(a){return new Promise(function(c){const b=new Image;b.addEventListener("load",c);b.addEventListener("error",function(){n("Failed to preload image: "+a);c()});b.src=a;setTimeout(c,50)})}function x(a){return new Promise(function(c){fetch(a,{cache:"force-cache"}).then(function(b){return b.arrayBuffer()}).then(c).catch(function(b){q("Failed to fetch URL! "+b);c(null)})})}
function y(a){return a.startsWith("data:application/octet-stream;base64,")?new Promise(function(c){x(a).then(function(b){if(b)c(b);else{n("Failed to decode base64 via fetch, doing it the slow way instead...");try{r||=u();var d=r(a,37);c(d)}catch(e){q("Failed to decode base64! "+e),c(null)}}})}):x(a)}
function z(a,c){const b=document.createElement("h2");b.style.color="#AA0000";b.style.padding="25px";b.style.fontFamily="sans-serif";b.style.marginBlock="0px";b.appendChild(document.createTextNode(c));a.appendChild(b);c=document.createElement("h4");c.style.color="#AA0000";c.style.padding="25px";c.style.fontFamily="sans-serif";c.style.marginBlock="0px";c.appendChild(document.createTextNode("Try again later"));a.style.backgroundColor="white";a.appendChild(c)}
window.main=async function(){if("undefined"===typeof window.eaglercraftXOpts)q("window.eaglercraftXOpts is not defined!"),alert("window.eaglercraftXOpts is not defined!");else{var a=window.eaglercraftXOpts.container;if("string"!==typeof a)q("window.eaglercraftXOpts.container is not a string!"),alert("window.eaglercraftXOpts.container is not a string!");else{var c=window.eaglercraftXOpts.assetsURI;if("string"!==typeof c)if("object"===typeof c&&"object"===typeof c[0]&&"string"===typeof c[0].url)c=c[0].url;
else{q("window.eaglercraftXOpts.assetsURI is not a string!");alert("window.eaglercraftXOpts.assetsURI is not a string!");return}c.startsWith("data:")&&delete window.eaglercraftXOpts.assetsURI;var b=document.getElementById(a);if(b){for(;a=b.lastChild;)b.removeChild(a);a=document.createElement("div");a.style.width="100%";a.style.height="100%";a.style.setProperty("image-rendering","pixelated");a.style.background='center / contain no-repeat url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAAAAAB3tzPbAAAACXBIWXMAAC4jAAAuIwF4pT92AAAG+UlEQVR42u2cy23jOhRATwbTwGwFvAJoF6BFGjColcGkASNuIPA6C68DN+BADZiCVxLSQBYqIGYBAbSdEvwWkvUzZWfymwlwCQwQUZeXPOT9URPkYs/3bj8QAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAH4x9vPvzFpAhAzM98UILmqfjDf1YT0N/cBk+71v+wDSczHmDeJ6TqO+SIfyD7IvC9g33Yc7dP6CQDxB+q62Hc2xnyJD2Sf5vuzL3Hi5MM0WbCN51u/Y/30ryEGmDVHlhwsY9Y7xlq0CuzVc4lh2n7NkGsnQ1nB7IefmrY/araJcbrq6Ryk9YqW4l3J/dHww1jdej+8kte042EW0Nba1hyWdl+9irq/FNXaD6BbQoexuvf+tQC2vX1+AFvP0kxiuyidfWwEbOtQtK0n0r6xbYCKsLcM21+pLZX3u4984Kq2xlnWDimllRudAXEpkGSHfqMzsmxfWnLWNf9aQznW4wMZWOMJxvGs/Ff5X+yPcD0g3dqZesdsI2f7Z2/73W2JSok9Gqu7P1q/I2qtj0qn/ZkTaCPWO2a0VyjrxY7sNUG1LxRlaE90MpDpGVeAxpaGobN2XPWH0aQVE1stfXPAj0+XzUmcob3aTRdVZ2+tRv+gMNBDaTkZ4k6uhtYPaK7iUkUcx9lgij92gZ6aXmxoDeK8D1hPfm18oBvTfPGwXoVG+4VfXcwl8dEOtCJS7De9M0VTqTA2p081O3kJ+uk5cU/RVN8C262Ms9HMlLHSmhNFTcc9u1uQRX4jMhqyNIk1GRk69a6hb0IDZ3pITnbfNqFuJWE9gbYrfmSqen/SiKy27G0VS20VWc+UEn59/YDPkc+0EunrAXQ/JXucYL+3VutyAqvP5wFvtEoyQPsMJMpKc3v7/Su9ALLkhAJDPCObGTDmonfNHAij3sg5866fmTHGnFt/crroh6vEv/Rq6vhEoP7hWWb2ylSQZP5zOVrDqVxSZnm/xL6OFnZwF3/4JoyGjyXu1X3n0rEFyE5Jzc5KEDfT7s2ZYs52s5e1HU88hB17nKTqAroXWPpXiHbN7R3Q8fVDbjzU6vb8hUbX67FWN8Xo4U5SIWjbukr1knY9XrcwS30aOuTatqa0vkA6cI05dyPrzWBbj7ZZrPUT2O7pdpKFtp4rph0E0AxtfN0u9kNVg25d4BPiDF0+R83dPol7/l4m4yQmQzdX+ISewqTnc8ngp94yaCan4vT+Hc228q8/T35+e8+XueSqCaPmEz9ofdbX6eSqE5iN/m4A8Qd9w/1bAEl2fPmafT3Axdv/ytlFeXUwTZyyf+NA3hWDGPrm+HXtHSdQ7nrz7fvv+MPFe/9Q3nAS+iYA3zcKCYAACIAACIAACIAACIAACIAACIAA1C2Komh++r9cogdv90M0+GoZAVHkSiGSaFmOmJdTRdESiKJ5Je4eovnSldoGNJ44gTBNbx+XH7tDYxwOniAPgEdygGWxTm/jBCAHV0u7xa90PV64IW0uOWdCapK7t600vfF2j4Ad5FCE4IopCSWMSg0Q4NgRVNKrwIBJ1ZDGxXO/5+fxhDvFQ87EsHxZMy9Sli/raMbjf9eqMpiciQG3yYOJwW1eQoBoesNBzG3yKdvqNwie1HMwiXFcwo7L7aMBtlSrC7c79RzyUm5w0f66Gk1vcJs8vFYHxUvy/u8leJz4N8t8vX5ccl04Chz5BOLR+mVVWXX5lsU4ncSOFevL7WFsJbYiPfQpcvJwhNsBxKiwcHDPNnoojzp8Jh8PnusiSMcLd1B8R5i+Igq5/BZKU3IEO8cIpoqw6L5NR8kjuOIaFR6GlmKdvmnhuFTsfqNwTBnzBOo+ZFua+jh3jAZtnksMu/b850wIfh1sVwVPhMEzKK9lz/+7Hi3Kx8CjOajVbVCEz3kIT1wyYnsD6s5t8tUaGLFpTfC7q2TH4rjzHMCoGgqTOJiMFi/TY5kduOJWHfzdtzdFrS4PYBwzhi0LAKcAdTcvKhur+VWQ3/TWcq/+LJG5VahUsILHUDGiGCmKy26cOrxlxwZUsMHlvVDW7lMQwghGOGZpmt6zcdFD47EhtQVyWySQRHUgVDzhmkeClyZFlGmiA5BH0WpyB+twPp/cgQpQBH0Lqt6qaTwfs+OW6Kl/RrdET/WqQi5BgWLDqNxmdV/Mo1X1QX5Ms0Pq/jmaP7d2/b6IVq3HW+a9qT7v6/TDNv2+tVA0hzz8klroc07AbXKmN98YQMppARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARCAD2//A2iD9ZsgY5XpAAAAAElFTkSuQmCC") white';
b.appendChild(a);await v();c.startsWith("data:")?(g('Downloading EPW file "<data: '+c.length+' chars>"...'),c=await y(c)):(g('Downloading EPW file "'+c+'"...'),c=await x(c));var d=!1;c?384>c.byteLength&&(q("The EPW file is too short"),d=!0):d=!0;if(d)b.removeChild(a),z(b,"Failed to download EPW file!"),q("Failed to download EPW file!");else{var e=new DataView(c);if(608649541!==e.getUint32(0,!0)||1297301847!==e.getUint32(4,!0))q("The file is not an EPW file"),d=!0;var f=c.byteLength;e.getUint32(8,
!0)!==f&&(q("The EPW file is the wrong length"),d=!0);if(d)b.removeChild(a),z(b,"EPW file is invalid!"),q("EPW file is invalid!");else{var l=new TextDecoder("utf-8"),h=e.getUint32(100,!0),k=e.getUint32(104,!0),m=e.getUint32(108,!0),p=e.getUint32(112,!0);if(0>h||h+k>f||0>m||m+p>f)q("The EPW file contains an invalid offset (component: splash)"),d=!0;if(d)b.removeChild(a),z(b,"EPW file is invalid!"),q("EPW file is invalid!");else{h=new Uint8Array(c,h,k);m=new Uint8Array(c,m,p);l=URL.createObjectURL(new Blob([h],
{type:l.decode(m)}));await w(l);g("Loaded splash img: "+l);a.style.background='center / contain no-repeat url("'+l+'"), 0px 0px / 1000000% 1000000% no-repeat url("'+l+'") white';await v();p=e.getUint32(164,!0);h=e.getUint32(168,!0);m=e.getUint32(180,!0);e=e.getUint32(184,!0);if(0>p||p+h>f||0>m||m+e>f)q("The EPW file contains an invalid offset (component: loader)"),d=!0;if(d)b.removeChild(a),z(b,"EPW file is invalid!"),q("EPW file is invalid!");else{a=new Uint8Array(c,p,h);a=URL.createObjectURL(new Blob([a],
{type:"text/javascript;charset=utf-8"}));g("Loaded loader.js: "+l);d=new Uint8Array(c,m,e);d=URL.createObjectURL(new Blob([d],{type:"application/wasm"}));g("Loaded loader.wasm: "+d);f={};for(const [t,A]of Object.entries(window.eaglercraftXOpts))"container"!==t&&"assetsURI"!==t&&(f[t]=A);window.__eaglercraftXLoaderContextPre={rootElement:b,eaglercraftXOpts:f,theEPWFileBuffer:c,loaderWASMURL:d,splashURL:l};g("Appending loader.js to document...");b=document.createElement("script");b.type="text/javascript";
b.src=a;document.head.appendChild(b)}}}}}else b='window.eaglercraftXOpts.container "'+a+'" is not a known element id!',q(b),alert(b)}}};}).call(this);